我正在尝试在 vue.js 中创建一个表格,您可以在其中将内容从一个单元格拖放到另一个单元格。
<div class="grid">
<div
draggable="true"
v-for="slot of slots"
:key="slot.index"
:data-index="slot.index"
@dragstart="drag"
@dragover.prevent
@drop.stop="drop"
>
<span v-if="slot.content">
{{ slot.content }}
</span>
</div>
</div>
</template>
<script>
export default {
name: "Storage",
props: ['id', 'items' ],
data() {
return {
cells: 27,
currentTarget: '',
slots: [],
};
},
mounted() {
for (let i = 0; i < this.cells; i++) {
this.slots.push({content: null, index: i})
}
for (let item of this.items) {
this.slots[item.y * 3 + item.x].content = item
}
},
methods: {
dragStart(item) {
this.draggedSlot = item;
},
dragEnd() {
this.draggedSlot = null;
},
allowDrop(event, slot) {
event.preventDefault();
return true;
},
drag (cell) {
console.log(cell.target.dataset.index)
this.currentTarget = cell.target.dataset.index
},
drop (cell) {
if (cell.target.dataset.index === undefined) {
const parentDiv = cell.target.parentNode
console.log(parentDiv.dataset.index)
const oldVal = this.slots[this.currentTarget].content
const newVal = this.slots[parentDiv.dataset.index].content
this.slots[parentDiv.dataset.index].content = oldVal
this.slots[this.currentTarget].content = newVal
} else {
console.log(cell.target.dataset.index)
const oldVal = this.slots[this.currentTarget].content
const newVal = this.slots[cell.target.dataset.index].content
this.slots[cell.target.dataset.index].content = oldVal
this.slots[this.currentTarget].content = newVal
}
}
}
}
</script>
<style scoped>
table {
width: auto;
}
.grid {
display: grid;
grid-template-rows: 1fr 1fr 1fr;
grid-template-columns: 1fr 1fr 1fr;
grid-gap: 0.2vw;
}
.grid > div {
font-size: 5vw;
padding: .8em;
background: rgb(80, 80, 80);
text-align: center;
}
</style>
有一个现成的表格,实现拖放。Console.log 显示我们从哪个单元格中取出和放入哪个单元格。据我了解,有一个循环计算内容的位置。一切正常。
for (let item of this.items) {
this.slots[item.y * 3 + item.x].content = item
}
以及如何将内容扔到一个单元格中,一些项目到一个空单元格中,当单元格中的位置和坐标通过position_x和position_y设置时,如果项目如下:
items=[
{id:1, position_x: -1, position_y: -1},
{id:2, position_x: 3, position_y: 2}
]
适用于一个对象的解决方案。