###やりたいこと
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の情報を受け渡したかったため、$をつけグローバル関数にし、引数として渡してみましたが上記のエラーが発生してしまいました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。