質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Q&A

解決済

1回答

1153閲覧

【Vue.js】dragしたアイテムの情報をdrop時に受け渡したいです。

yyk

総合スコア11

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

0グッド

0クリップ

投稿2021/06/13 10:05

編集2021/06/13 11:45

###やりたいこと
Vue.jsでdrag&dropの実装をしているところですが、drop時にdragしたアイテムの情報を渡すことができず、所持したアイテムごとに動作を分けることができなくて困っています。

ドロップ時に発生したエラー文

[Vue warn]: Property or method "$block" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties. (found in <Root>) warn @ vue.js:634 warnNonPresent @ vue.js:2047 has @ vue.js:2092 drop @ VM1152:3 invokeWithErrorHandling @ vue.js:1863 invoker @ vue.js:2188 original._wrapper @ vue.js:7547

###現在のコード

html

1 <div id="app"> 2 <div> 3 <table id="snaptarget" class="ui-widget-header"> 4 <tr v-for="(boardRow, y) in mainBoard" :key="y"> 5 <td v-for="(cell, x) in boardRow" :key="x" 6 class="MainTableCell" 7 :class="`is-${cell.code}`" 8 @click="onClick(y, x)" 9 @dragover.prevent 10 @dragenter.prevent 11 @drop="droptable($event, cell)" 12 > 13 </td> 14 </tr> 15 </table> 16 </div> 17 {{message}} 18 <section 19 draggable 20 v-for="($block, bi) in blocks" :key="bi" 21 @dragstart="dragstartblock($event, $block)" 22 > 23 <div v-for="(w, wi) in $block.data"> 24 <table> 25 <tr v-for="(blockTR, yi) in w" :key="yi" class="TR"> 26 <td v-for="(blockTD, xi) in blockTR" :key="xi" 27 @click="onClick(yi, xi)" 28 :style="makeColor(blockTD)" 29 > 30 <div v-if="blockTD" class="TTG"> 31 {{blockTD}} 32 </div> 33 </td> 34 </tr> 35 </table> 36 </div> 37 </section> 38 </div>

javascript

1const blocks = { 2 1:{ 3 data:[[ 4 [1, 1, 0, 0, 0], 5 [0, 1, 0, 0, 0], 6 [0, 1, 0, 0, 0], 7 [0, 1, 0, 0, 0], 8 [0, 0, 0, 0, 0], 9 ]], 10 }, 11 2:{ 12 data:[[ 13 [1, 0, 0, 0, 0], 14 [1, 1, 0, 0, 0], 15 [0, 0, 0, 0, 0], 16 [0, 0, 0, 0, 0], 17 [0, 0, 0, 0, 0], 18 ]], 19 }, 20 }; 21 const mainBoard = [] 22 for (let y = 0; y < 20; y++ ) { 23 const boardRow = [] 24 for (let x = 0; x < 20; x++){ 25 const cell = { 26 y: y, 27 x: x, 28 code: 0, 29 } 30 boardRow.push(cell) 31 } 32 mainBoard.push(boardRow) 33 }; 34 const draggable = window['vuedraggable']; 35// ここからvue.js記述 36 const app = new Vue({ 37 el: '#app', 38 components: { 39 'draggable': draggable, 40 }, 41 data: { 42 TD:"TD", 43 message:"", 44 mainBoard: mainBoard, 45 blocks:blocks, 46 }, 47 methods: { 48 onClick: function (y, x) { 49 // y, x はそれぞれの座標 50 console.log(y, x) 51 this.message = "Click y:" + y + " x:" + x 52 }, 53 dragstartblock(event, block){ 54 console.log(event); 55 console.log(block); 56 }, 57 droptable($event, cell){ 58 console.log($block); 59 console.log(cell); 60 }, 61 makeColor (value) { 62 return { 63 'background': value === 0 ? 'none' : 'black' 64 } 65 }, 66 }, 67 })

css

1.bord{ 2 height: 82px; 3 width: 82px; 4 background-color: black; 5} 6 7.bordRow{ 8 background-color: rgb(133, 71, 71); 9 border: rgb(249, 237, 237) 1px solid; 10} 11 12.bordCell{ 13 height: 12px; 14 width: 12px; 15 background-color: rgb(12, 134, 122); 16 border: black 1px solid; 17 display: inline; 18} 19.MainTableCell{ 20 height: 20px; 21 width: 20px; 22 border: solid black 1px; 23} 24 25.TR{ 26 border: black solid 1px; 27} 28 29.TD{ 30 background-color: cadetblue; 31 height: 30px; 32 width: 30px; 33 border: coral 1px solid; 34} 35 36.is-2{ 37 background-color: blueviolet; 38}

表示画面

イメージ説明

試したこと

blockの情報を受け渡したかったため、$をつけグローバル関数にし、引数として渡してみましたが上記のエラーが発生してしまいました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

data{}に保存用に空のデータオブジェクトを作り、dragした情報をそこに一度保持させることで、drop時にもdragしたデータを使うことができました。

最適かどうかは分かりませんがこの方法で試していきたいと思います。

投稿2021/06/16 08:25

編集2021/06/16 08:26
yyk

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問