rrj-astra-ui 1.1.8 → 1.1.9
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/AuiList.vue +24 -8
- package/components/AuiListItem.vue +40 -31
- package/package.json +1 -1
package/components/AuiList.vue
CHANGED
|
@@ -3,16 +3,32 @@
|
|
|
3
3
|
<slot></slot>
|
|
4
4
|
</view>
|
|
5
5
|
</template>
|
|
6
|
+
|
|
6
7
|
<script setup>
|
|
8
|
+
import { defineProps, ref, provide } from 'vue';
|
|
9
|
+
const __name = 'AuiList'; // 保留你的 __name,无改动
|
|
10
|
+
|
|
11
|
+
defineOptions({
|
|
12
|
+
name: __name
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
const props = defineProps({});
|
|
7
16
|
|
|
8
|
-
|
|
9
|
-
|
|
17
|
+
// 核心:记录当前展开的子组件实例(AuiListItem)
|
|
18
|
+
const currentOpenItem = ref(null);
|
|
10
19
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
20
|
+
// 核心:父组件提供的重置方法,供所有子组件调用
|
|
21
|
+
const resetAllListItems = (currentItem) => {
|
|
22
|
+
// 如果有其他展开的子项,调用它的重置方法
|
|
23
|
+
if (currentOpenItem.value && currentOpenItem.value !== currentItem) {
|
|
24
|
+
currentOpenItem.value.resetSlide();
|
|
25
|
+
}
|
|
26
|
+
// 记录当前展开的子项(如果是 null,说明要清空所有展开状态)
|
|
27
|
+
currentOpenItem.value = currentItem;
|
|
28
|
+
};
|
|
14
29
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
30
|
+
// 关键:通过 provide 向所有子组件注入重置方法,实现父子通信
|
|
31
|
+
provide('auiListContext', {
|
|
32
|
+
resetAllListItems,
|
|
33
|
+
});
|
|
18
34
|
</script>
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<view class="aui-list-item" ref="listItemRef">
|
|
3
|
-
<!-- 补充:给内容区域添加 @click 事件,点击自身内容也触发重置(增强联动) -->
|
|
4
3
|
<view class="aui-list-item-content-wrapper"
|
|
5
4
|
:style="{ transform: `translateX(${offsetX}px)` }"
|
|
6
5
|
@touchstart="onTouchStart"
|
|
7
6
|
@touchmove="onTouchMove"
|
|
8
|
-
@touchend="onTouchEnd"
|
|
9
|
-
@click="onItemContentClick">
|
|
7
|
+
@touchend="onTouchEnd">
|
|
10
8
|
<view class="aui-list-item_befor">
|
|
11
9
|
<slot name="befor"></slot>
|
|
12
10
|
</view>
|
|
@@ -32,8 +30,8 @@
|
|
|
32
30
|
</template>
|
|
33
31
|
|
|
34
32
|
<script setup>
|
|
35
|
-
import { defineProps, ref, onMounted, onUnmounted } from 'vue';
|
|
36
|
-
const __name = 'AuiListItem'; //
|
|
33
|
+
import { defineProps, ref, onMounted, onUnmounted, inject, expose } from 'vue';
|
|
34
|
+
const __name = 'AuiListItem'; // 保留你的 __name,无改动
|
|
37
35
|
|
|
38
36
|
defineOptions({
|
|
39
37
|
name: __name
|
|
@@ -58,6 +56,9 @@ const props = defineProps({
|
|
|
58
56
|
}
|
|
59
57
|
});
|
|
60
58
|
|
|
59
|
+
// 注入父组件提供的上下文(重置方法)
|
|
60
|
+
const auiListContext = inject('auiListContext', null);
|
|
61
|
+
|
|
61
62
|
const startX = ref(0);
|
|
62
63
|
const offsetX = ref(0);
|
|
63
64
|
const isSliding = ref(false);
|
|
@@ -67,8 +68,6 @@ const listItemRef = ref(null);
|
|
|
67
68
|
// 原有滑动逻辑(已修复右滑,无改动)
|
|
68
69
|
const onTouchStart = (e) => {
|
|
69
70
|
if (!props.allowSlide) return;
|
|
70
|
-
// 关键:触摸当前项时,立即发送全局通知,让所有其他项收回
|
|
71
|
-
uni.$emit('auiListItem:resetAllSlide');
|
|
72
71
|
startX.value = e.touches[0].clientX;
|
|
73
72
|
offsetX.value = 0;
|
|
74
73
|
isSliding.value = false;
|
|
@@ -78,14 +77,14 @@ const onTouchMove = (e) => {
|
|
|
78
77
|
if (!props.allowSlide) return;
|
|
79
78
|
const currentX = e.touches[0].clientX;
|
|
80
79
|
const diffX = currentX - startX.value;
|
|
81
|
-
//
|
|
80
|
+
// 左滑逻辑(你的原有逻辑)
|
|
82
81
|
if (diffX < 0) {
|
|
83
82
|
offsetX.value = diffX;
|
|
84
83
|
if (diffX < SLIDE_THRESHOLD) {
|
|
85
84
|
isSliding.value = true;
|
|
86
85
|
}
|
|
87
86
|
}
|
|
88
|
-
//
|
|
87
|
+
// 右滑恢复逻辑(你的原有逻辑,修复无法右滑)
|
|
89
88
|
if (diffX > 0) {
|
|
90
89
|
offsetX.value = 0;
|
|
91
90
|
isSliding.value = false;
|
|
@@ -96,28 +95,28 @@ const onTouchEnd = () => {
|
|
|
96
95
|
if (!props.allowSlide) return;
|
|
97
96
|
if (offsetX.value < SLIDE_THRESHOLD) {
|
|
98
97
|
offsetX.value = -150;
|
|
98
|
+
isSliding.value = true;
|
|
99
|
+
// 关键:当前项展开时,通知父组件重置其他子项,并记录自身实例
|
|
100
|
+
if (auiListContext) {
|
|
101
|
+
auiListContext.resetAllListItems(instanceRef.value);
|
|
102
|
+
}
|
|
99
103
|
} else {
|
|
100
|
-
|
|
101
|
-
|
|
104
|
+
resetSlide();
|
|
105
|
+
// 关键:当前项收回时,通知父组件清空展开记录
|
|
106
|
+
if (auiListContext) {
|
|
107
|
+
auiListContext.resetAllListItems(null);
|
|
108
|
+
}
|
|
102
109
|
}
|
|
103
110
|
};
|
|
104
111
|
|
|
105
|
-
//
|
|
112
|
+
// 核心:收回当前项的滑动状态(暴露给父组件调用)
|
|
106
113
|
const resetSlide = () => {
|
|
107
|
-
if (!props.allowSlide) return;
|
|
114
|
+
if (!props.allowSlide) return;
|
|
108
115
|
offsetX.value = 0;
|
|
109
116
|
isSliding.value = false;
|
|
110
117
|
};
|
|
111
118
|
|
|
112
|
-
//
|
|
113
|
-
const onItemContentClick = () => {
|
|
114
|
-
if (!props.allowSlide) return;
|
|
115
|
-
// 先收回自己(如果已展开),再通知其他项
|
|
116
|
-
resetSlide();
|
|
117
|
-
uni.$emit('auiListItem:resetAllSlide');
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
// 原有:监听页面点击外部(原有,无改动)
|
|
119
|
+
// 关键:监听组件外部点击(收回当前项,同时通知父组件清空记录)
|
|
121
120
|
const handlePageClick = (e) => {
|
|
122
121
|
if (!listItemRef.value || !isSliding.value) return;
|
|
123
122
|
|
|
@@ -133,31 +132,41 @@ const handlePageClick = (e) => {
|
|
|
133
132
|
clickY > itemRect.bottom
|
|
134
133
|
) {
|
|
135
134
|
resetSlide();
|
|
135
|
+
if (auiListContext) {
|
|
136
|
+
auiListContext.resetAllListItems(null);
|
|
137
|
+
}
|
|
136
138
|
}
|
|
137
139
|
};
|
|
138
140
|
|
|
139
|
-
//
|
|
140
|
-
const
|
|
141
|
-
resetSlide
|
|
142
|
-
};
|
|
141
|
+
// 关键:暴露当前组件实例和 resetSlide 方法,供父组件调用
|
|
142
|
+
const instanceRef = ref({
|
|
143
|
+
resetSlide
|
|
144
|
+
});
|
|
145
|
+
expose({
|
|
146
|
+
resetSlide
|
|
147
|
+
});
|
|
143
148
|
|
|
144
149
|
onMounted(() => {
|
|
145
|
-
|
|
150
|
+
// 保留你的外部点击监听(兼容所有场景)
|
|
151
|
+
uni.onClickOutside(listItemRef, () => {
|
|
152
|
+
resetSlide();
|
|
153
|
+
if (auiListContext) {
|
|
154
|
+
auiListContext.resetAllListItems(null);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
146
157
|
window.addEventListener('click', handlePageClick);
|
|
147
158
|
window.addEventListener('touchstart', handlePageClick);
|
|
148
|
-
// 确保全局事件监听生效,无遗漏
|
|
149
|
-
uni.$on('auiListItem:resetAllSlide', handleResetAllSlide);
|
|
150
159
|
});
|
|
151
160
|
|
|
152
161
|
onUnmounted(() => {
|
|
162
|
+
// 移除监听,防止内存泄漏
|
|
153
163
|
uni.offClickOutside(listItemRef, resetSlide);
|
|
154
164
|
window.removeEventListener('click', handlePageClick);
|
|
155
165
|
window.removeEventListener('touchstart', handlePageClick);
|
|
156
|
-
uni.$off('auiListItem:resetAllSlide', handleResetAllSlide);
|
|
157
166
|
});
|
|
158
167
|
</script>
|
|
159
168
|
|
|
160
|
-
<!--
|
|
169
|
+
<!-- 样式部分完全保留你的原有代码,无任何改动 -->
|
|
161
170
|
<style scoped lang="scss">
|
|
162
171
|
@import '../style.scss';
|
|
163
172
|
.aui-list-item {
|