更新记录

1.0.0(2026-10-29) 下载此版本

特性

  • 按住左侧手柄即拖,跟手换位
  • v-model 双向绑定列表
  • 支持 locked 锁定行(不可拖、不可被挤占)
  • 仅手柄拦截触摸,不影响页面滚动
  • 插槽自定义行内容
  • 适配微信小程序 / App / H5(以真机手势为准)

平台兼容性

uni-app(4.57)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
√ √ √ √ √ - √ - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
√ - - - - - - - - - - -

uni-app x(3.8.7)

Chrome Safari Android iOS 鸿蒙 微信小程序
√ √ √ √ √ √

burt-drag-sort

uni-app(Vue3)通用列表 拖拽排序 组件。

按住左侧手柄上下拖即可换序;内容区可正常滚动;支持锁定行;松手后列表顺序与数据一致。

特性

  • 按住左侧手柄即拖,跟手换位
  • v-model 双向绑定列表
  • 支持 locked 锁定行(不可拖、不可被挤占)
  • 仅手柄拦截触摸,不影响页面滚动
  • 插槽自定义行内容
  • 适配微信小程序 / App / H5(以真机手势为准)

目录

burt-drag/
├── components/
│   └── burt-drag-sort/
│       └── burt-drag-sort.vue   # 组件本体(拷贝这一个文件即可使用)
├── pages/
│   └── index/
│       └── index.vue           # Demo(含 mock 数据)
└── README.MD

安装

方式一:插件市场导入

通过 DCloud 插件市场导入本插件后,组件位于:

components/burt-drag-sort/burt-drag-sort.vue

方式二:手动拷贝

将 components/burt-drag-sort 目录复制到你的 uni-app 项目的 components 下即可。

Vue3 + easycom 默认规则下,可直接在页面中使用标签 <burt-drag-sort>;也可手动 import。

基础用法

<template>
  <burt-drag-sort
    v-model="list"
    item-key="id"
    :row-height-px="56"
    @reorder="onReorder"
  >
    <template #default="{ item, index, locked }">
      <view class="row">
        <text>{{ index + 1 }}. {{ item.name }}</text>
      </view>
    </template>
  </burt-drag-sort>
</template>

<script setup>
import { ref } from 'vue'
// 若未开启 easycom,取消下一行注释:
// import BurtDragSort from '@/components/burt-drag-sort/burt-drag-sort.vue'

const list = ref([
  { id: 1, name: '约会' },
  { id: 2, name: '居家' },
  { id: 3, name: '度假' },
  { id: 4, name: '通勤' },
])

function onReorder({ list, from, to }) {
  // 在这里请求后端保存顺序
  console.log('new order', from, to, list.map((i) => i.id))
}
</script>

锁定行

<burt-drag-sort
  v-model="list"
  item-key="id"
  :locked="(item) => !!item.isSystem"
  @reorder="onReorder"
>
  <template #default="{ item, locked }">
    <text>{{ item.name }}{{ locked ? '(锁定)' : '' }}</text>
  </template>
</burt-drag-sort>

锁定行:

  • 左侧无拖动手柄
  • 不能被其它行拖入其位置挤占(组件内部会钉回原下标)

API

Props

属性 类型 默认值 说明
modelValue / v-model Array [] 列表数据
itemKey string \| (item, index) => string\|number 'id' 行唯一 key 字段名或函数
locked (item, index) => boolean null 返回 true 表示该行锁定
rowHeightPx number 72 预估行高(px),测量完成前用于估算落点

Events

事件 回调参数 说明
update:modelValue list: Array 松手且顺序变化时同步 v-model
reorder { list, from, to } 松手且顺序变化;from/to 为起止下标,list 为新顺序

拖动过程中不会频繁回写父级;仅在松手且顺序确实变化时触发一次。

Slot

默认插槽参数:

参数 说明
item 当前行数据
index 当前下标
locked 是否锁定

注意事项

  1. 只在手柄上拖,在文字/开关区域滑动用于滚页面。
  2. 列表项请保证 itemKey 对应字段唯一且稳定。
  3. 微信小程序建议真机验证拖动手势;开发者工具手势与真机可能不一致。
  4. 行高差异较大时,可把 row-height-px 调接近真实高度,起拖会更跟手(组件也会测量相邻行间距)。
  5. 组件自带白色圆角卡片样式;如需完全自定义外框,可改组件内 .dsl__row 样式,或在插槽内铺满内容。

Demo

运行本示例项目,打开 pages/index/index:

  1. 基础排序:拖动场合标签,下方展示实时顺序文案
  2. 锁定行:「未分类」不可拖
  3. 长列表滚动:16 条渠道,验证页面可滚、手柄可拖

兼容性

端 说明
微信小程序 推荐真机验证
uni-app Vue3 必需
App / H5 可用,手势以真机为准

License

MIT(免费,可商用)

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

许可协议

MIT协议

暂无用户评论。