Dragula在Vue中拖拽后数据没更新怎么办?
我在用 dragula 做一个任务看板,拖完卡片后 DOM 看起来移过去了,但 Vue 里的数组顺序根本没变,导致保存时还是原来的数据。我试过在 drake.on(‘drop’) 里手动 splice,但总对不上索引,有没有人遇到过类似问题?
<template>
<div ref="container">
<div v-for="(item, i) in tasks" :key="item.id" class="task-card">
{{ item.text }}
</div>
</div>
</template>
<script>
import dragula from 'dragula'
export default {
data() { return { tasks: [{ id: 1, text: 'A' }, { id: 2, text: 'B' }] } },
mounted() {
dragula([this.$refs.container])
}
}
</script>
核心思路:drop 事件触发后,手动根据 DOM 的位置变化来更新数组。
关键点说下:
1. 给每个卡片加
:data-id="item.id",方便从 DOM 反查数据2. drop 回调的
sibling参数是重点,它是参照元素(插在它前面),用Array.from(target.children).indexOf(sibling)就能拿到新位置索引3. 先 splice 删掉,再 splice 插入,顺序别搞反
还有个坑:如果是从一个列表拖到另一个列表,那处理方式又不一样了,你这个是单容器问题不大。
保存之前打个 console.log 看看数组顺序对不对,应该就 OK 了。