Skip to content

xtf-drag-layout

组件说明

xtf-drag-layout 是拖拽排序布局组件,用于展示可拖拽排序的网格项。支持触摸和鼠标拖拽、删除按钮、添加按钮、自定义列数和最大数量,适用于图片排序、模块管理和自定义布局等场景。


基础用法

1. 最简示例

通过 value / v-model 绑定数据列表:

vue
<template>
  <xtf-drag-layout v-model="items" :cols="4" :max="9" @add="onAdd" @remove="onRemove" />
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, url: '/static/img1.png', name: '图片1' },
        { id: 2, url: '/static/img2.png', name: '图片2' },
        { id: 3, url: '/static/img3.png', name: '图片3' }
      ]
    }
  },
  methods: {
    onAdd() {},
    onRemove(item) {}
  }
}
</script>

2. 自定义列数与间距

通过 cols 设置列数,通过 gap 设置间距:

vue
<template>
  <xtf-drag-layout v-model="items" :cols="3" :gap="16" :max="6" />
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, url: '/static/img1.png', name: 'A' },
        { id: 2, url: '/static/img2.png', name: 'B' }
      ]
    }
  }
}
</script>

3. 禁用拖拽

通过 disabled 禁用拖拽和删除:

vue
<template>
  <xtf-drag-layout v-model="items" :cols="4" disabled show-readonly-mask />
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, url: '/static/img1.png', name: '只读1' },
        { id: 2, url: '/static/img2.png', name: '只读2' }
      ]
    }
  }
}
</script>

全部属性

属性类型默认值作用描述适用范围
value / modelValueArray[]数据列表双向绑定
srcKeyString'url'图片地址字段名数据映射
labelKeyString'name'标签字段名数据映射
idKeyString'id'唯一标识字段名数据映射
colsNumber4列数布局
maxNumber9最大数量数量限制
imageWidthNumber0图片宽度图片尺寸
imageHeightNumber0图片高度图片尺寸
itemWidthKey / itemHeightKeyString'width' / 'height'项内自定义尺寸字段名(rpx)数据映射
colSpanKey / rowSpanKeyString'colSpan' / 'rowSpan'项内横向、纵向占格字段名数据映射
borderRadius / paddingNumber24 / 12卡片圆角与单元格内边距(rpx)布局
dragScale / dragOpacity / dragDampingNumber1.08 / 0.82 / 40拖拽时缩放、透明度和跟随阻尼(ms)拖拽效果
snapDuration / dragTransitionDurationNumber120 / 180吸附与视觉过渡时长(ms)动画
deletableBooleantrue是否可删除删除
showDeleteButtonBooleantrue是否显示删除按钮删除按钮
deleteIconString'×'删除图标文字删除图标
deleteIconColorString''删除图标颜色删除图标
deleteIconImageString''删除图标图片地址;设置后优先显示图片删除图标
deleteBgColor / deleteSizeString / Number'' / 40删除按钮背景色与尺寸(rpx)删除按钮
deletePositionString'top-right'删除按钮位置:'top-right' / 'top-left' / 'bottom-right' / 'bottom-left'删除按钮
deleteTrigger / deleteLongpressDurationString / Number'always' / 320删除按钮显示时机:'always' / 'hover' / 'longpress',以及长按时长(ms)删除按钮
dragShadowColor / dragShadow / dragPlaceholderColorString源码默认值拖拽边框色、阴影和占位色拖拽效果
showAddButtonBooleantrue是否显示添加按钮添加按钮
addTextString''添加按钮文字添加按钮
disabledBooleanfalse是否禁用拖拽禁用
showReadonlyMaskBooleanfalse是否显示只读遮罩只读
readonlyMaskText / readonlyMaskTextKeyString'只读' / 'readonlyText'只读遮罩默认文字及项内覆盖字段名只读
showLabelBooleantrue是否显示标签标签
gapNumber12间距间距
customClassString''自定义类名样式覆盖
customStyleString | Object''自定义样式动态样式覆盖
itemClass / itemStyleString / String | Object'' / ''所有拖拽项的附加类名与样式项样式
itemClassKey / itemStyleKeyString'itemClass' / 'itemStyle'项内附加类名与样式的字段名数据映射

事件

事件名称触发时机回调参数参数说明
input / update:modelValue / change排序或删除完成(items)新列表
reorder拖拽排序完成时触发(items, moved)moved{ item, from, to }
remove删除项时触发(payload){ item, index, items }
add点击添加按钮时触发-仅通知父级自行追加数据

插槽

itemdeletereadonly-mask 提供 itemdisplay-itemindex,其中 itemdelete 还提供 removeadd 提供 add

vue
<template>
  <xtf-drag-layout v-model="items">
    <template #item="{ item, remove }">
      <view @tap="remove">{{ item.name }}</view></template>

    <template #add="{ add }"><xtf-button label="添加" @click="add" /></template>
  </xtf-drag-layout>
</template>
<script>
export default {
  data() {
    return { items: [{ id: 1, name: '封面', url: '/static/a.png' }] }
  }
}
</script>

主题说明

  • 拖拽项使用卡片样式,带圆角和阴影
  • 删除按钮默认在右上角
  • 添加按钮使用 + 图标和文字
  • 只读遮罩覆盖在项上方

如需全局调整主题,请在 xtf-config-provider 或主题配置中覆盖相关 CSS 变量。

MIT Licensed