Skip to content

H5预览

APP下载

Draggable 拖拽排序

一个功能强大的拖拽排序组件,支持单列、多列布局,可自定义拖拽动画和样式。

基础属性

属性名说明类型可选值默认值
pt样式透传配置对象PassThrough--
modelValue数据数组UTSJSONObject[]-[]
disabled是否禁用拖拽功能boolean-false
animation拖拽动画持续时间(毫秒)number-150
columns列数:1 为单列纵向布局number-1

事件

事件名说明回调参数
change数据顺序发生变化时触发(list: UTSJSONObject[])
start开始拖拽时触发(index: number)
end结束拖拽时触发(index: number)

插槽

插槽名说明参数
item子元素{item: UTSJSONObject; index: numbe; dragging: boolean; dragIndex: number; insertIndex: number}

PassThrough 样式透传

样式穿透配置,用于自定义组件内部元素的样式。

属性名说明类型
className组件根元素样式string
ghost拖拽选中时元素配置PassThroughProps

使用示例

基础用法

组件会自动计算子元素的高度和宽度,无需手动设置尺寸。使用 item 时需要通过 as UTSJSONObject 进行类型转换或使用 item[key] 访问属性。

html
<cl-draggable v-model="list">
  <template #item="{ item, index }">
    <view
      class="flex flex-row items-center p-3 bg-surface-100 rounded-lg mb-2 dark:!bg-surface-700"
      :class="{
        'opacity-50': item['disabled']
      }"
    >
      <cl-text>{{ (item as UTSJSONObject).label }}</cl-text>
    </view>
  </template>
</cl-draggable>

结合列表使用

可以直接在插槽中使用 cl-list-item 或其他组件,无需额外配置。

html
<cl-list border>
  <cl-draggable v-model="list2">
    <template #item="{ item, index, dragging, dragIndex }">
      <cl-list-item
        icon="chat-thread-line"
        :label="(item as UTSJSONObject).label"
        arrow
        :pt="{
          inner: {
            className: dragging && dragIndex == index ? '!bg-surface-100' : ''
          }
        }"
      ></cl-list-item>
    </template>
  </cl-draggable>
</cl-list>

多列排序

通过 columns 参数可以设置多列布局,实现网格拖拽排序。

html
<cl-draggable v-model="list3" :columns="4">
  <template #item="{ item, index }">
    <view
      class="flex flex-row items-center justify-center p-3 bg-surface-100 rounded-lg m-1 dark:!bg-surface-700"
      :class="{
        'opacity-50': item['disabled']
      }"
    >
      <cl-text>{{ item['label'] }}</cl-text>
    </view>
  </template>
</cl-draggable>

结合图片使用

支持图片拖拽排序,可以直接使用 cl-image 组件。

html
<cl-draggable v-model="list4" :columns="4">
  <template #item="{ item, index }">
    <view class="p-[2px]">
      <cl-image
        :src="(item as UTSJSONObject).url"
        mode="widthFix"
        :pt="{
          className: '!w-full'
        }"
        preview
      ></cl-image>
    </view>
  </template>
</cl-draggable>