<template> <view class="page"> <u-navbar title="设备分组" :border-bottom="false" :background="bgc" title-color='#2E4975' title-size='36' height='36'></u-navbar> <view class="fzbox"> <view class="card" :class="{fixed: index === 0}" v-for="(item,index) in obj " :key="index" v-if="index==0"> <view class="card_left"> <view class="img"> <image src="@/static/sc.png" mode="" v-show="index === 0"></image> <image src="@/static/sc1.png" mode="" v-show="index !== 0"></image> </view> <view class="txt"> {{item.name}}({{item.num}}) </view> </view> <view class="card_right"> <image src="@/static/xg.png" mode="" style="width: 34rpx;height: 34rpx;margin-right: 30rpx;"></image> <image src="@/static/xq.png" mode=""></image> </view> </view> <HM-dragSorts ref="dragSorts" :list="newobj" :autoScroll="true" :feedbackGenerator="false" rowHeight='65' @change="change" @confirm="confirm" @onclick="onclick" :listBackgroundColor='F7FAFE'></HM-dragSorts> </view> <view class="btn"> <image src="@/static/tj.png" mode=""></image> 新建分组 </view> </view> </template> <script> import dragSorts from '@/components/HM-dragSorts/HM-dragSorts.vue' export default { components: { 'HM-dragSorts': dragSorts }, data() { return { bgc: { backgroundColor: "#F7FAFE", }, obj: [], newobj:[], cardHeight: 114, touchStartIndex: -1, startY: 0, direction: 'vertical', touchMoveTimer: null, }; }, computed: { totalHeight() { return this.obj.length * this.cardHeight; }, }, onLoad() { this.generateAndLogObject(); }, methods: { push() { // 和数组的push使用方法一致,可以push单行,也可以push多行 this.$refs.dragSorts.push({ "name": "push行", "icon": "/static/img/2.png" }); }, unshift() { // 和数组的unshift使用方法一致,可以unshift单行,也可以unshift多行 this.$refs.dragSorts.unshift({ "name": "unshift行", "icon": "/static/img/2.png" }); }, splice() { // 和数组的unshift使用方法一致 下标1开始删除1个并在下标1位置插入行 this.$refs.dragSorts.splice(1, 1, { "name": "splice行", "icon": "/static/img/2.png" }); }, onclick(e) { console.log('=== onclick start ==='); console.log("被点击行: " + JSON.stringify(e.value)); console.log("被点击下标: " + JSON.stringify(e.index)); console.log('=== onclick end ==='); }, change(e) { console.log('=== change start ==='); console.log("被拖动行: " + JSON.stringify(e.moveRow)); console.log('原始下标:', e.index); console.log('移动到:', e.moveTo); console.log('=== change end ==='); }, confirm(e) { console.log('=== confirm start ==='); console.log("被拖动行: " + JSON.stringify(e.moveRow)); console.log('原始下标:', e.index); console.log('移动到:', e.moveTo); console.log('=== confirm end ==='); }, generateRandomName() { const communityNames = ["碧桂园", "万达", "万科", "金华小区", "太姥山小区", "宁德时代", "霞浦小区"]; const randomIndex = Math.floor(Math.random() * communityNames.length); return communityNames[randomIndex]; }, generateObject() { const object = { arrays: [], }; for (let i = 0; i < 5; i++) { const array = { name: i === 0 ? "全部" : this.generateRandomName(), num: Math.floor(Math.random() * 100), top: i * this.cardHeight, }; object.arrays.push(array); } return object.arrays; }, generateAndLogObject() { this.obj = this.generateObject(); this.newobj = this.obj.slice(1); console.log(this.obj); }, handleTouchStart(e) { this.touchStartIndex = e.currentTarget.dataset.index; this.startY = e.touches[0].clientY; }, handleTouchMove(e) { clearTimeout(this.touchMoveTimer); this.touchMoveTimer = setTimeout(() => { const deltaY = e.touches[0].clientY - this.startY; const newIndex = Math.floor((this.obj[this.touchStartIndex].top + deltaY) / this.cardHeight); const maxIndex = this.obj.length - 1; if (newIndex >= 1 && newIndex <= maxIndex) { this.obj[this.touchStartIndex].top += deltaY; this.obj[newIndex].top -= deltaY; this.startY = e.touches[0].clientY; this.$nextTick(() => { this.direction = 'vertical'; }); } else { this.direction = 'none'; } }, 16); // 控制触发频率,大约 60 帧每秒 }, handleTouchEnd() { this.touchStartIndex = -1; this.startY = 0; }, handleMoveChange(e) { this.obj = e.detail.source; // 调整位置,防止重叠 this.obj.forEach((item, index) => { // 添加保护,确保 item 存在 if (item) { item.top = index * this.cardHeight; } }); }, }, }; </script> <style lang="scss"> page { background-color: #F7FAFE; } .page { width: 750rpx; .fzbox { .card { display: flex; align-items: center; justify-content: space-between; margin: 32rpx auto 0; width: 682rpx; height: 114rpx; background: #FFFFFF; border-radius: 30rpx; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); .card_left { display: flex; flex-wrap: nowrap; align-items: center; margin-left: 48rpx; .img { width: 35.3rpx; height: 35.3rpx; } .txt { margin-left: 52rpx; font-size: 36rpx; font-family: Source Han Sans, Source Han Sans; font-weight: 400; color: #000000; } } .card_right { margin-right: 38rpx; image { width: 45.51rpx; height: 31.86rpx; } } } } .btn { display: flex; align-items: center; justify-content: center; margin: 32rpx auto 0; border-radius: 30rpx; width: 682rpx; height: 114rpx; background: #FFFFFF; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); image { margin-right: 28rpx; width: 39.92rpx; height: 39.92rpx; } font-size: 36rpx; font-family: Source Han Sans, Source Han Sans; font-weight: 400; color: #000000; } } </style>