更新记录

1.0.0(2025-12-23)

发布了snap ui


平台兼容性

uni-app(4.87)

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

其他

多语言 暗黑模式 宽屏模式
× ×

介绍

Snap Ui 是一款基于uniapp vue3的一款拖拽排序组件,该组件支持H5、微信小程序拖拽排序,同时支持拖拽元素的固定,以及触底自动滚动长按拖拽API拖拽单列或多列拖拽等功能,并且具有高自由度高性能体积小无外部依赖等特点。 本组件打包后大小仅有16kb,且无繁杂外部依赖或配置,安装即用。

扫码体验

小程序二维码

基本用法

查看文档,基本的拖拽排序代码,复制运行后可直观的看到效果,复杂样式直接自己需求编写item样式即可

长按拖拽

v-model绑定需拖拽集合,columns为集合显示列数,item-height为拖拽元素高度 单位是pxitem-margin为元素之间的空隙,custom-class为自定义item的class,同时绑定了@start、@update、@end事件,分别在拖拽开始时、拖拽发生改变时、拖拽结束时触发。

v-model绑定的对象数组内需包含唯一标识,默认为id,如需更换则指定item-key即可。

<template>
    <su-drag
        v-model="dataList"  
        :columns="4" 
        :item-height="100"
        item-margin="2px"
        custom-class="custom-class"
        @start="start"
        @update="update"
        @end="end"
    >
        <template #default={data}>
            {{data.name}}
        </template>
    </su-drag>
</template>
<script setup>
    import { ref, watch } from 'vue';

    const dataList = ref([
        {id: 1, name: 'a'},
        {id: 2, name: 'b'},
        {id: 3, name: 'c'},
        {id: 4, name: 'd'},
        {id: 5, name: 'e'},
        {id: 6, name: 'f'},
        {id: 7, name: 'g'},
        ])

    function start(event, index) {
        console.log("start", event, index);
    }
    function update(event, index) {
        console.log("update", event, index);

    }
    function end(event, index) {
        console.log("end", event, index);
    }
</script>
<style lang="scss" scoped>
    :deep() {
        .custom-class {
            background-color: greenyellow;
            text-align: center;
            line-height: 100px;
        }
    }
</style>

API控制拖拽

添加 touch-dragging调整为触摸拖拽,然后可通过 switchDragging()方法可实时控制拖拽的开启与关闭

<template>
    <view style="margin: 10px; display: flex; align-items: center; justify-content: space-around;">
        <text style="font-size: 18px;">API启用/关闭拖拽: </text>
        <button v-if="dragging" type="warn" @click="triggerDrag(false)" size="mini">关闭拖拽</button>
        <button v-else type="primary" @click="triggerDrag(true)" size="mini">开启拖拽</button>
    </view>

    <su-drag ref="sudrag"
        v-model="dataList"  
        :columns="4" 
        :item-height="100"
        item-margin="2px"
        custom-class="custom-class"
        touch-dragging
    >
        <template #default={data}>
            {{data.name}}
        </template>
    </su-drag>
</template>
<script setup>
    import { ref, watch } from 'vue';
    const dragging = ref(false)
    const sudrag = ref(null)

    const dataList = ref([
        {id: 1, name: 'a'},
        {id: 2, name: 'b'},
        {id: 3, name: 'c'},
        {id: 4, name: 'd'},
        {id: 5, name: 'e'},
        {id: 6, name: 'f'},
        {id: 7, name: 'g'},
    ])

    function triggerDrag(value) {
        dragging.value = value
        sudrag.value?.switchDragging(value)
    }
</script>
<style lang="scss" scoped>
    :deep() {
        .custom-class {
            background-color: greenyellow;
            text-align: center;
            line-height: 100px;
        }
    }
</style>

固定元素

对象内包含fixed且等于true时,该元素会固定不可拖拽,且不与其他元素交换位置

const dataList = ref([
    {id: 1, name: 'a', fixed: true},
    {id: 2, name: 'b'},
    {id: 3, name: 'c'},
    {id: 4, name: 'd'},
    {id: 5, name: 'e'},
    {id: 6, name: 'f', fixed: true},
    {id: 7, name: 'g'},
])

新增/删除元素

通过deleteItemaddItemAPI删除或新增元素,不可直接增删数组内元素

deleteItem删除元素并非物理删除,只是给删除元素标记了delete: true,如果您的dataList在别处用到时注意过滤

function deleteItem() {
    // sudrag.value?.deleteItem(2)
    sudrag.value?.deleteItem([2, 3])
}

function addItem(){
    sudrag.value?.addItem({id: Math.max(...dataList.value.map(item => item.id)) + 1, name: "新增"})
}

Attributes

参数 说明 类型 默认值 备注
v-model 拖拽元素集合 Array -
columns 列数 Number 0
item-height 元素高度 Number 0 单位px,不传则高度由内容撑开
item-key 元素唯一标识字段 String id
item-margin 元素间距 String 0px
sort-field 排序字段(排序时操作的字段) String sort
custom-class 拖拽元素class类 String -
custom-after-class 拖拽元素后插槽class类 String -
custom-drag-class 元素触发拖拽时的class类 String -
custom-fixed-class 固定元素的class类 String -
touch-dragging 关闭长按拖拽
使用API控制拖拽开启/关闭
Boolean false
scrolling-threshold 拖拽触底/触顶滚动阈值 Number 85 单位px

Events

事件名称 说明 参数
start 拖拽开始时 event, index
update 元素位置发生改变时 event, index
end 拖拽结束时 event, index
height-change 拖拽父元素高度发生改变时 wrapHeight

Slot

name 说明
default 默认插槽default={data},data为当前元素里的数据
after 最后一个拖拽元素后的自定义内容,通常可用于放添加按钮

API方法

方法名 参数 说明
addItem {} 添加的元素对象
deleteItem [1, 2] | 1 需删除元素唯一标识/唯一标识数组
init - 重新初始化拖拽元素位置信息,在su-drag上方,如有高度不固定的元素,需在上方元素高度变化后调用该方法,重新获取位置信息
switchDragging true | false 开启|关闭拖拽,长按拖拽模式下不生效

隐私、权限声明

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

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

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

暂无用户评论。