rrj-astra-ui 1.1.6 → 1.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/AuiListItem.vue +43 -31
- package/package.json +1 -1
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<view class="aui-list-item" ref="listItemRef">
|
|
3
|
-
|
|
3
|
+
<!-- 补充:给内容区域添加 @click 事件,点击自身内容也触发重置(增强联动) -->
|
|
4
|
+
<view class="aui-list-item-content-wrapper"
|
|
5
|
+
:style="{ transform: `translateX(${offsetX}px)` }"
|
|
6
|
+
@touchstart="onTouchStart"
|
|
7
|
+
@touchmove="onTouchMove"
|
|
8
|
+
@touchend="onTouchEnd"
|
|
9
|
+
@click="onItemContentClick">
|
|
4
10
|
<view class="aui-list-item_befor">
|
|
5
11
|
<slot name="befor"></slot>
|
|
6
12
|
</view>
|
|
@@ -27,7 +33,7 @@
|
|
|
27
33
|
|
|
28
34
|
<script setup>
|
|
29
35
|
import { defineProps, ref, onMounted, onUnmounted } from 'vue';
|
|
30
|
-
const __name = 'AuiListItem'; // 保留__name
|
|
36
|
+
const __name = 'AuiListItem'; // 保留__name,无改动
|
|
31
37
|
|
|
32
38
|
defineOptions({
|
|
33
39
|
name: __name
|
|
@@ -58,56 +64,60 @@ const isSliding = ref(false);
|
|
|
58
64
|
const SLIDE_THRESHOLD = -50;
|
|
59
65
|
const listItemRef = ref(null);
|
|
60
66
|
|
|
61
|
-
//
|
|
67
|
+
// 原有滑动逻辑(已修复右滑,无改动)
|
|
62
68
|
const onTouchStart = (e) => {
|
|
63
69
|
if (!props.allowSlide) return;
|
|
64
|
-
//
|
|
70
|
+
// 关键:触摸当前项时,立即发送全局通知,让所有其他项收回
|
|
65
71
|
uni.$emit('auiListItem:resetAllSlide');
|
|
66
72
|
startX.value = e.touches[0].clientX;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
offsetX.value = currentOffset;
|
|
70
|
-
isSliding.value = currentOffset === -150;
|
|
73
|
+
offsetX.value = 0;
|
|
74
|
+
isSliding.value = false;
|
|
71
75
|
};
|
|
72
76
|
|
|
73
77
|
const onTouchMove = (e) => {
|
|
74
78
|
if (!props.allowSlide) return;
|
|
75
79
|
const currentX = e.touches[0].clientX;
|
|
76
80
|
const diffX = currentX - startX.value;
|
|
77
|
-
//
|
|
78
|
-
if (diffX < 0
|
|
79
|
-
offsetX.value = diffX
|
|
80
|
-
if (
|
|
81
|
+
// 左滑逻辑(原有)
|
|
82
|
+
if (diffX < 0) {
|
|
83
|
+
offsetX.value = diffX;
|
|
84
|
+
if (diffX < SLIDE_THRESHOLD) {
|
|
81
85
|
isSliding.value = true;
|
|
82
86
|
}
|
|
83
87
|
}
|
|
88
|
+
// 右滑恢复逻辑(原有,修复无法右滑问题)
|
|
89
|
+
if (diffX > 0) {
|
|
90
|
+
offsetX.value = 0;
|
|
91
|
+
isSliding.value = false;
|
|
92
|
+
}
|
|
84
93
|
};
|
|
85
94
|
|
|
86
95
|
const onTouchEnd = () => {
|
|
87
96
|
if (!props.allowSlide) return;
|
|
88
97
|
if (offsetX.value < SLIDE_THRESHOLD) {
|
|
89
|
-
// 展开:固定偏移到-150
|
|
90
98
|
offsetX.value = -150;
|
|
91
|
-
isSliding.value = true;
|
|
92
99
|
} else {
|
|
93
|
-
|
|
94
|
-
|
|
100
|
+
offsetX.value = 0;
|
|
101
|
+
isSliding.value = false;
|
|
95
102
|
}
|
|
96
103
|
};
|
|
97
104
|
|
|
98
|
-
//
|
|
105
|
+
// 核心:收回当前项的滑动状态(原有,无改动)
|
|
99
106
|
const resetSlide = () => {
|
|
100
|
-
if (!props.allowSlide) return;
|
|
107
|
+
if (!props.allowSlide) return; // 移除 isSliding 判断,确保强制收回
|
|
101
108
|
offsetX.value = 0;
|
|
102
109
|
isSliding.value = false;
|
|
103
110
|
};
|
|
104
111
|
|
|
105
|
-
//
|
|
106
|
-
const
|
|
112
|
+
// 新增:点击当前项内容区域,触发全局重置(确保点击其他项时联动)
|
|
113
|
+
const onItemContentClick = () => {
|
|
114
|
+
if (!props.allowSlide) return;
|
|
115
|
+
// 先收回自己(如果已展开),再通知其他项
|
|
107
116
|
resetSlide();
|
|
117
|
+
uni.$emit('auiListItem:resetAllSlide');
|
|
108
118
|
};
|
|
109
119
|
|
|
110
|
-
//
|
|
120
|
+
// 原有:监听页面点击外部(原有,无改动)
|
|
111
121
|
const handlePageClick = (e) => {
|
|
112
122
|
if (!listItemRef.value || !isSliding.value) return;
|
|
113
123
|
|
|
@@ -116,8 +126,6 @@ const handlePageClick = (e) => {
|
|
|
116
126
|
|
|
117
127
|
const clickX = e.clientX || e.touches?.[0]?.clientX;
|
|
118
128
|
const clickY = e.clientY || e.touches?.[0]?.clientY;
|
|
119
|
-
|
|
120
|
-
// 点击组件外部,收回滑动
|
|
121
129
|
if (
|
|
122
130
|
clickX < itemRect.left ||
|
|
123
131
|
clickX > itemRect.right ||
|
|
@@ -128,25 +136,28 @@ const handlePageClick = (e) => {
|
|
|
128
136
|
}
|
|
129
137
|
};
|
|
130
138
|
|
|
139
|
+
// 原有:监听全局重置事件(无改动,确保收到通知即收回)
|
|
140
|
+
const handleResetAllSlide = () => {
|
|
141
|
+
resetSlide();
|
|
142
|
+
};
|
|
143
|
+
|
|
131
144
|
onMounted(() => {
|
|
132
|
-
// 1. 优先使用uni-app内置外部点击监听(更适配uni-app生态,无重复)
|
|
133
145
|
uni.onClickOutside(listItemRef, resetSlide);
|
|
134
|
-
// 2. 监听全局事件,用于收回所有项
|
|
135
|
-
uni.$on('auiListItem:resetAllSlide', handleResetAllSlide);
|
|
136
|
-
// 3. 备用:window点击监听(兼容PC端和部分特殊场景)
|
|
137
146
|
window.addEventListener('click', handlePageClick);
|
|
138
147
|
window.addEventListener('touchstart', handlePageClick);
|
|
148
|
+
// 确保全局事件监听生效,无遗漏
|
|
149
|
+
uni.$on('auiListItem:resetAllSlide', handleResetAllSlide);
|
|
139
150
|
});
|
|
140
151
|
|
|
141
152
|
onUnmounted(() => {
|
|
142
|
-
// 移除所有监听,防止内存泄漏
|
|
143
153
|
uni.offClickOutside(listItemRef, resetSlide);
|
|
144
|
-
uni.$off('auiListItem:resetAllSlide', handleResetAllSlide);
|
|
145
154
|
window.removeEventListener('click', handlePageClick);
|
|
146
155
|
window.removeEventListener('touchstart', handlePageClick);
|
|
156
|
+
uni.$off('auiListItem:resetAllSlide', handleResetAllSlide);
|
|
147
157
|
});
|
|
148
158
|
</script>
|
|
149
159
|
|
|
160
|
+
<!-- 样式部分完全保留,无任何改动 -->
|
|
150
161
|
<style scoped lang="scss">
|
|
151
162
|
@import '../style.scss';
|
|
152
163
|
.aui-list-item {
|
|
@@ -159,8 +170,9 @@ onUnmounted(() => {
|
|
|
159
170
|
}
|
|
160
171
|
.aui-list-item-content-wrapper {
|
|
161
172
|
display: flex;
|
|
173
|
+
// align-items: center;
|
|
162
174
|
width: 100%;
|
|
163
|
-
transition: transform 0.3s;
|
|
175
|
+
transition: transform 0.3s;
|
|
164
176
|
}
|
|
165
177
|
.aui-list-item_befor {
|
|
166
178
|
margin:0 10px;
|
|
@@ -190,7 +202,7 @@ onUnmounted(() => {
|
|
|
190
202
|
right: 0;
|
|
191
203
|
top: 0;
|
|
192
204
|
bottom: 0;
|
|
193
|
-
width: 150px; /*
|
|
205
|
+
width: 150px; /* 自定义内容宽度 */
|
|
194
206
|
background-color: #f0f0f0;
|
|
195
207
|
display: flex;
|
|
196
208
|
align-items: center;
|