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

Sortable.js/Vue Draggable@next 元素初始顺序异常问题如何解决?

Vue Draggable@next 初始数组顺序不保留问题快速修复方案
  • 优先修正v-model绑定对象
    不要绑定computed返回的衍生数组、map/filter生成的临时数组,这类数组每次触发响应式更新都会生成新引用,导致Draggable误判重排。必须直接绑定原始的响应式状态数组,数组加工逻辑移到列表项内部的渲染层实现。
  • 保证itemKey的唯一性与稳定性
    禁止用索引、动态生成的随机值作为itemKey,必须绑定数组项自带的固定唯一字段,示例写法:
    <!-- 错误写法 -->
    <draggable :itemKey="(item, index) => index" ... />
    
    <!-- 正确写法 -->
    <draggable :itemKey="(item) => item.id" ... />
    
  • 关闭冲突配置项
    强制关闭forceFallback配置,该配置开启时容易和Vue响应式更新逻辑冲突,导致初始排序异常,示例配置:
    <draggable 
      v-model="yourList" 
      :itemKey="item => item.id"
      :options="{ forceFallback: false }"
    >
      <!-- 列表项插槽 -->
    </draggable>
    
  • 异步加载场景加渲染判断
    如果数组是接口异步返回的,等数组完整赋值后再渲染Draggable组件,避免空数组渲染后再赋值触发重排:
    <draggable v-if="yourList.length" v-model="yourList" ... />
    
  • 兜底手动对齐方案
    上述方案都不生效时,可以在首次赋值完成后手动调用Sortable实例的sort方法对齐顺序:
    <template>
      <draggable ref="draggableRef" v-model="yourList" :itemKey="item => item.id" ... />
    </template>
    <script setup>
    import { ref, nextTick } from 'vue'
    const draggableRef = ref(null)
    const yourList = ref([])
    
    // 数组赋值逻辑,比如接口请求
    const fetchList = async () => {
      const res = await api.getList()
      yourList.value = res.data
      // 赋值后手动对齐顺序
      await nextTick()
      const order = yourList.value.map(item => item.id)
      draggableRef.value.sortable.sort(order)
    }
    </script>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:06:06