拖拽排序 xDrag
在线预览
在线模拟尺寸:
介绍
自由布局拖拽排序组件,列或者宫格都支持。使用时,需要将需要拖拽排序的子元素设置为x-drag-item。 并且子元素和父元素不允许通过style来动态设置宽高,否则拖拽排序会失效。并且list及子元素中的order不允许动态设置,否则拖拽排序会失效。 想要动态修改数据可以通过vif切换重新渲染下。web支持响应式屏幕。本插件:引用了原生插件x-vibrate-s
平台兼容
| Harmony | H5 | andriod | IOS | 小程序 | UTS | UNIAPP-X SDK | version |
|---|---|---|---|---|---|---|---|
| ☑ | ☑ | ☑️ | ☑️ | ☑️ | ☑️ | 4.76+ | 1.1.18 |
文件路径
ts
@/uni_modules/tmx-ui/components/x-drag/x-drag.uvue使用
ts
<x-drag></x-drag>Props 属性
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| itemHeight | 项目的高度,不要动态更改。 | string | "50" |
| col | 列数,默认1即列表布局,不要动态更改。如果是1以上就是宫格布局了。 | number | 1 |
| list | 你的排序数据list,变动后,请通过change事件来取得主要是用来骗编译器用的。 | UTSJSONObject[] | () : UTSJSONObject[] => [] as UTSJSONObject[] |
| scrollDiff | 当组件放置在scroll页面中,如果拖动时项目需要滚动时自动滚动的进步值比如组件在屏幕被底部或者顶部遮挡一部分,当拖动靠近底部时,会向下滚动的值.这个值是你外部自己通过设置滚动页面的scrollTop来达成的,具体见demo,已经为你写了示例. | number | 25 |
Events 事件
| 名称 | 参数 | 说明 |
|---|---|---|
| change | - | 排序变动时触发 |
| move | - | 拖动的时候触发,可以根据参数进行对你超出页面屏幕高时进行一个滚动. |
| end | - | - |
| start | - | - |
Slots 插槽
| 名称 | 说明 | 数据 |
|---|---|---|
| default | 只可放置子组件x-drag-item | - |
Ref 方法
| 名称 | 参数 | 返回值 | 说明 |
|---|
示例文件路径
json
/pages/fankui/drag示例源码
uvue
vue
<template>
<!-- #ifdef APP -->
<scroll-view style="flex:1">
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<page-meta :page-style="`background-color:${xThemeConfigBgColor}`">
<navigation-bar :background-color="xThemeConfigNavBgColor"
:front-color="xThemeConfigNavFontColor"></navigation-bar>
</page-meta>
<!-- #endif -->
<x-sheet>
<x-text font-size="18" class=" text-weight-b mb-8">拖拽排序 xDrag</x-text>
<x-text color="#999999">
使用子组件窗口进行排序,组件内可以自由布局,最大的灵活度不影响你布局自己的外观。
同时还支持设定col来定制为多列布局为宫格或者为列表模式。
</x-text>
</x-sheet>
<x-sheet>
<x-drag @change="onchange" v-if="list.length>0" :list="list">
<x-drag-item style="display: flex;flex-direction: column;" v-for="(item,index) in list" :order="index"
:disabled="index==1" :key="index">
<view class="flex-1 mb-2 px-12 flex-row flex flex-row-center-start" :style="{
backgroundColor: bgColor,
opacity:index==1?'0.6':'1'
}">
<x-text>{{index==1?'我被固定在2':`长按${item.getNumber('id')}排序`}}</x-text>
</view>
</x-drag-item>
</x-drag>
<x-empty v-if="list.length==0"></x-empty>
</x-sheet>
<x-sheet>
<x-text font-size="18" class=" text-weight-b ">设置为2列形成宫格</x-text>
</x-sheet>
<x-sheet>
<x-drag :col="2" :list="list2">
<x-drag-item :disabled="index==2" style="display: flex;flex-direction: column;"
v-for="(item,index) in list2" :order="index" :key="index">
<view @click="onclick(index)" class="flex-1 mb-2 mx-2 px-12 flex-row flex flex-row-center-start"
:style="{
backgroundColor: bgColor,
opacity:index==2?'0.6':'1'
}">
<x-text>长按{{item.getNumber('id')}}排序</x-text>
</view>
</x-drag-item>
</x-drag>
</x-sheet>
<x-sheet>
<x-text font-size="18" class=" text-weight-b ">演示局部拖动,拖动时页面自动滚动</x-text>
</x-sheet>
<x-sheet>
<x-drag :list="list4" @move="onmove" @start="ontouchstart" @end="ontouchend">
<x-drag-item style="display: flex;flex-direction: column;" v-for="(item,index) in list4" :order="index"
:key="index">
<view class="flex-1 mb-2 px-12 flex-row flex flex-row-center-start"
:style="{backgroundColor: bgColor}">
<view @longpress.stop="" <!-- #ifdef WEB -->
@mousedown.stop=""
@mousemove.stop=""
<!-- #endif -->
@click.stop="onclick(index)"
style="height:100%"
class="flex-1"
>
<x-text>{{index}}</x-text>
</view>
<view>
<x-icon code="EF3E"></x-icon>
</view>
</view>
</x-drag-item>
</x-drag>
</x-sheet>
<x-sheet>
<x-text font-size="18" class=" text-weight-b ">设置更多的列</x-text>
</x-sheet>
<x-sheet>
<x-drag :col="4" :list="list3">
<x-drag-item style="display: flex;flex-direction: column;" v-for="(item,index) in list3" :order="index"
:key="index">
<view class="flex-1 mb-2 mx-2 px-12 flex-row flex flex-row-center-start"
:style="{backgroundColor: bgColor}">
<x-text>长按排序</x-text>
</view>
</x-drag-item>
</x-drag>
</x-sheet>
<!-- #ifdef APP -->
</scroll-view>
<!-- #endif -->
</template>
<script setup lang="ts">
import { xConfig } from "@/uni_modules/tmx-ui/config/xConfig.uts"
const list = ref<UTSJSONObject[]>([])
const list2 = ref<UTSJSONObject[]>([
{ id: 1 } as UTSJSONObject,
{ id: 2 } as UTSJSONObject,
{ id: 3 } as UTSJSONObject,
{ id: 4 } as UTSJSONObject,
{ id: 5 } as UTSJSONObject,
{ id: 6 } as UTSJSONObject
])
const list3 = ref<UTSJSONObject[]>([
{ id: 1 } as UTSJSONObject,
{ id: 2 } as UTSJSONObject,
{ id: 3 } as UTSJSONObject,
{ id: 4 } as UTSJSONObject,
{ id: 5 } as UTSJSONObject,
{ id: 6 } as UTSJSONObject,
{ id: 7 } as UTSJSONObject,
{ id: 8 } as UTSJSONObject,
{ id: 9 } as UTSJSONObject
])
const list4 = ref<UTSJSONObject[]>([
{ id: 1 } as UTSJSONObject,
{ id: 2 } as UTSJSONObject,
{ id: 3 } as UTSJSONObject,
{ id: 4 } as UTSJSONObject,
{ id: 5 } as UTSJSONObject,
{ id: 6 } as UTSJSONObject
])
let tid = 0
let nowPageScrollY = ref(0)
let isMoveScroll = ref(false)
let scrollDiff = ref(25)
const bgColor = computed(() : string => xConfig.dark == 'dark' ? '#333' : '#e3e8f4')
onReady(() => {
tid = setTimeout(function () {
list.value = [
{ id: 1 } as UTSJSONObject,
{ id: 2 } as UTSJSONObject,
{ id: 3 } as UTSJSONObject,
{ id: 4 } as UTSJSONObject,
{ id: 5 } as UTSJSONObject,
{ id: 6 } as UTSJSONObject
] as UTSJSONObject[]
}, 500);
})
onUnload(() => {
clearTimeout(tid)
})
onPageScroll((opts) => {
if (isMoveScroll.value) return;
nowPageScrollY.value = opts.scrollTop
})
function ontouchstart() {
}
function ontouchend() {
isMoveScroll.value = false;
}
function onmove(diff : number) {
isMoveScroll.value = true;
nowPageScrollY.value += diff;
uni.pageScrollTo({
scrollTop: nowPageScrollY.value
})
}
function onclick(index : number) {
uni.showToast({ title: `点击了:${index}`, icon: 'none' })
}
function onchange(list : UTSJSONObject[]) {
console.warn("变动的数据:", list)
}
</script>
<style>
</style>