You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxtjs中使用vuedraggable触发Vuex状态修改异常问题

解决vuedraggable结合Vuex时的state修改报错问题

问题场景

使用vuedraggable实现克隆拖拽功能:左侧组件负责克隆元素,右侧组件接收克隆后的元素。右侧组件绑定@change事件,将组件内的lista3数组赋值给Vuex的listaPessoas变量。首次操作功能正常,但第二次触发拖拽时出现错误:[vuex] do not mutate vuex store state outside mutation handlers.

错误原因

第一次调用SET_LISTA_PESSOAS时,直接将lista3的数组引用赋值给了Vuex的listaPessoas,导致两者指向同一个内存地址的数组。后续vuedraggable对lista3进行拖拽修改时,本质是直接修改了Vuex中listaPessoas指向的数组,绕过了mutation处理机制,触发了Vuex的报错。

解决方案

方案1:在Vuex的mutation中创建新数组,切断引用

修改mutation逻辑,通过扩展运算符或slice()创建新数组,避免和组件内的数组共享引用:

export const state = () => ({
  listaPessoas: [],
})

export const mutations = {
  SET_LISTA_PESSOAS(context, payload){
    // 创建新数组,切断原引用
    context.listaPessoas = [...payload]
    // 也可以使用slice():context.listaPessoas = payload.slice()
  },
}

方案2:在组件传递参数时传递数组副本

在组件的muda方法中,传递lista3的副本给mutation,而非原数组:

methods: {
    ...mapMutations(['SET_LISTA_PESSOAS']),

    muda(){
        // 传递数组副本,避免引用共享
        this.SET_LISTA_PESSOAS([...this.lista3])
        console.log(this.$store.state.listaPessoas)
    },
}

额外优化建议

组件内循环尽量使用元素的唯一ID作为key,避免拖拽时出现渲染异常:

<!-- 左侧draggable的循环 -->
<div class="element" v-for="(element, index) in lista" :key="element.id">
    {{ element.name }}
</div>

<!-- 右侧draggable的循环 -->
<div class="element" v-for="(element, index) in lista3" :key="element.id">
    {{ element.name }}
</div>

内容的提问来源于stack exchange,提问作者GobsRuiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:42:52