rrj-astra-ui 1.1.13 → 1.1.14
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 +37 -77
- package/package.json +1 -1
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
</template>
|
|
31
31
|
|
|
32
32
|
<script setup>
|
|
33
|
-
import { defineProps, ref, onMounted, onUnmounted
|
|
34
|
-
const __name = 'AuiListItem'; //
|
|
33
|
+
import { defineProps, ref, onMounted, onUnmounted } from 'vue';
|
|
34
|
+
const __name = 'AuiListItem'; // 保留你的__name,无改动
|
|
35
35
|
|
|
36
36
|
defineOptions({
|
|
37
37
|
name: __name
|
|
@@ -44,114 +44,84 @@ const props = defineProps({
|
|
|
44
44
|
allowSlide: { type: Boolean, default: true }
|
|
45
45
|
});
|
|
46
46
|
|
|
47
|
-
//
|
|
47
|
+
// ########## 完全还原你最初的滑动状态变量 ##########
|
|
48
48
|
const startX = ref(0);
|
|
49
49
|
const offsetX = ref(0);
|
|
50
50
|
const isSliding = ref(false);
|
|
51
51
|
const SLIDE_THRESHOLD = -50;
|
|
52
52
|
const listItemRef = ref(null);
|
|
53
|
-
// 标记当前组件是否已展开
|
|
54
|
-
const isOpened = ref(false);
|
|
55
53
|
|
|
56
|
-
// ##########
|
|
57
|
-
|
|
58
|
-
// 找到所有aui-list-item组件DOM
|
|
59
|
-
const allItems = document.querySelectorAll('.aui-list-item');
|
|
60
|
-
if (!allItems || allItems.length === 0) return;
|
|
61
|
-
|
|
62
|
-
allItems.forEach(item => {
|
|
63
|
-
// 跳过当前正在触摸的项
|
|
64
|
-
if (item === currentDom) return;
|
|
65
|
-
|
|
66
|
-
// 找到子元素的偏移量和状态
|
|
67
|
-
const contentWrapper = item.querySelector('.aui-list-item-content-wrapper');
|
|
68
|
-
if (!contentWrapper) return;
|
|
69
|
-
|
|
70
|
-
// 强制重置偏移和状态(直接操作DOM+组件内部状态)
|
|
71
|
-
contentWrapper.style.transform = 'translateX(0px)';
|
|
72
|
-
// 找到对应的组件实例(通过DOM绑定的属性)
|
|
73
|
-
const itemInstance = item.__auiListItemInstance;
|
|
74
|
-
if (itemInstance) {
|
|
75
|
-
itemInstance.offsetX.value = 0;
|
|
76
|
-
itemInstance.isSliding.value = false;
|
|
77
|
-
itemInstance.isOpened.value = false;
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
};
|
|
54
|
+
// ########## 新增:全局唯一标识(兼容所有端,不依赖window) ##########
|
|
55
|
+
let currentOpenComponent = null;
|
|
81
56
|
|
|
82
|
-
//
|
|
57
|
+
// ########## 完全还原你最初的onTouchStart(只加1行联动逻辑) ##########
|
|
83
58
|
const onTouchStart = (e) => {
|
|
84
59
|
if (!props.allowSlide) return;
|
|
85
|
-
if (!listItemRef.value) return;
|
|
86
60
|
|
|
87
|
-
// ##########
|
|
88
|
-
|
|
61
|
+
// ########## 新增1行:收回之前展开的项(联动核心,不破坏滑动) ##########
|
|
62
|
+
if (currentOpenComponent && currentOpenComponent !== instanceRef) currentOpenComponent.resetSlide();
|
|
89
63
|
|
|
90
|
-
//
|
|
64
|
+
// 你的原有逻辑,一字未改(保证能正常滑动)
|
|
91
65
|
startX.value = e.touches[0].clientX;
|
|
92
66
|
offsetX.value = 0;
|
|
93
67
|
isSliding.value = false;
|
|
94
|
-
isOpened.value = false;
|
|
95
68
|
};
|
|
96
69
|
|
|
97
|
-
//
|
|
70
|
+
// ########## 完全还原你最初的onTouchMove(保证左滑/右滑正常) ##########
|
|
98
71
|
const onTouchMove = (e) => {
|
|
99
72
|
if (!props.allowSlide) return;
|
|
73
|
+
|
|
100
74
|
const currentX = e.touches[0].clientX;
|
|
101
75
|
const diffX = currentX - startX.value;
|
|
102
76
|
|
|
103
|
-
//
|
|
77
|
+
// 你的原有左滑逻辑(正常展开)
|
|
104
78
|
if (diffX < 0) {
|
|
105
79
|
offsetX.value = diffX;
|
|
106
80
|
if (diffX < SLIDE_THRESHOLD) {
|
|
107
81
|
isSliding.value = true;
|
|
108
82
|
}
|
|
109
83
|
}
|
|
110
|
-
|
|
84
|
+
|
|
85
|
+
// 你的原有右滑逻辑(正常恢复,不做任何修改)
|
|
111
86
|
if (diffX > 0) {
|
|
112
87
|
offsetX.value = 0;
|
|
113
88
|
isSliding.value = false;
|
|
114
|
-
isOpened.value = false;
|
|
115
89
|
}
|
|
116
90
|
};
|
|
117
91
|
|
|
118
|
-
//
|
|
92
|
+
// ########## 完全还原你最初的onTouchEnd(只加2行联动逻辑) ##########
|
|
119
93
|
const onTouchEnd = () => {
|
|
120
94
|
if (!props.allowSlide) return;
|
|
121
|
-
if (!listItemRef.value) return;
|
|
122
95
|
|
|
123
|
-
//
|
|
96
|
+
// 你的原有逻辑,一字未改(保证滑动结束后正常定位)
|
|
124
97
|
if (offsetX.value < SLIDE_THRESHOLD) {
|
|
125
98
|
offsetX.value = -150;
|
|
126
99
|
isSliding.value = true;
|
|
127
|
-
|
|
100
|
+
|
|
101
|
+
// ########## 新增1行:记录当前展开的组件实例 ##########
|
|
102
|
+
currentOpenComponent = instanceRef;
|
|
128
103
|
} else {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
104
|
+
resetSlide();
|
|
105
|
+
|
|
106
|
+
// ########## 新增1行:收回时清空全局记录 ##########
|
|
107
|
+
currentOpenComponent = null;
|
|
132
108
|
}
|
|
133
|
-
|
|
134
|
-
// ########## 绑定组件实例到DOM,供其他项收回时调用(验证生效) ##########
|
|
135
|
-
listItemRef.value.__auiListItemInstance = {
|
|
136
|
-
offsetX,
|
|
137
|
-
isSliding,
|
|
138
|
-
isOpened
|
|
139
|
-
};
|
|
140
109
|
};
|
|
141
110
|
|
|
142
|
-
//
|
|
111
|
+
// ########## 完全还原你最初的resetSlide(保证重置正常) ##########
|
|
143
112
|
const resetSlide = () => {
|
|
144
113
|
if (!props.allowSlide) return;
|
|
145
114
|
offsetX.value = 0;
|
|
146
115
|
isSliding.value = false;
|
|
147
|
-
isOpened.value = false;
|
|
148
116
|
};
|
|
149
117
|
|
|
150
|
-
//
|
|
118
|
+
// ########## 保留你最初的外部点击逻辑(保证点击空白收回) ##########
|
|
151
119
|
const handlePageClick = (e) => {
|
|
152
120
|
if (!listItemRef.value || !isSliding.value) return;
|
|
153
121
|
|
|
154
|
-
const
|
|
122
|
+
const itemDom = listItemRef.value;
|
|
123
|
+
const itemRect = itemDom.getBoundingClientRect();
|
|
124
|
+
|
|
155
125
|
const clickX = e.clientX || e.touches?.[0]?.clientX;
|
|
156
126
|
const clickY = e.clientY || e.touches?.[0]?.clientY;
|
|
157
127
|
|
|
@@ -162,41 +132,31 @@ const handlePageClick = (e) => {
|
|
|
162
132
|
clickY > itemRect.bottom
|
|
163
133
|
) {
|
|
164
134
|
resetSlide();
|
|
135
|
+
currentOpenComponent = null;
|
|
165
136
|
}
|
|
166
137
|
};
|
|
167
138
|
|
|
168
|
-
//
|
|
139
|
+
// ########## 新增:组件实例引用(用于联动,不破坏滑动) ##########
|
|
140
|
+
const instanceRef = {
|
|
141
|
+
resetSlide
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// ########## 完全还原你最初的挂载/卸载逻辑(保证无内存泄漏) ##########
|
|
169
145
|
onMounted(() => {
|
|
170
|
-
if (!listItemRef.value) return;
|
|
171
|
-
|
|
172
|
-
// 保留你的原有监听
|
|
173
146
|
uni.onClickOutside(listItemRef, resetSlide);
|
|
174
147
|
window.addEventListener('click', handlePageClick);
|
|
175
148
|
window.addEventListener('touchstart', handlePageClick);
|
|
176
|
-
|
|
177
|
-
// 绑定组件实例到DOM
|
|
178
|
-
listItemRef.value.__auiListItemInstance = {
|
|
179
|
-
offsetX,
|
|
180
|
-
isSliding,
|
|
181
|
-
isOpened
|
|
182
|
-
};
|
|
183
149
|
});
|
|
184
150
|
|
|
185
|
-
// 卸载:清理监听+DOM实例,验证生效
|
|
186
151
|
onUnmounted(() => {
|
|
187
|
-
if (!listItemRef.value) return;
|
|
188
|
-
|
|
189
|
-
// 保留你的原有清理
|
|
190
152
|
uni.offClickOutside(listItemRef, resetSlide);
|
|
191
153
|
window.removeEventListener('click', handlePageClick);
|
|
192
154
|
window.removeEventListener('touchstart', handlePageClick);
|
|
193
|
-
|
|
194
|
-
// 清理DOM上的组件实例,避免内存泄漏
|
|
195
|
-
delete listItemRef.value.__auiListItemInstance;
|
|
155
|
+
currentOpenComponent = null;
|
|
196
156
|
});
|
|
197
157
|
</script>
|
|
198
158
|
|
|
199
|
-
<!--
|
|
159
|
+
<!-- ########## 完全还原你最初的样式(保证滑动视觉正常) ########## -->
|
|
200
160
|
<style scoped lang="scss">
|
|
201
161
|
@import '../style.scss';
|
|
202
162
|
.aui-list-item {
|