257 lines
6.2 KiB
Vue
257 lines
6.2 KiB
Vue
|
<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>
|