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.
@@ -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
- import { defineProps } from 'vue';
9
- const __name = 'AuiList';
17
+ // 核心:记录当前展开的子组件实例(AuiListItem)
18
+ const currentOpenItem = ref(null);
10
19
 
11
- defineOptions({
12
- name: __name
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
- const props = defineProps({
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'; // 保留__name,无改动
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
- offsetX.value = 0;
101
- isSliding.value = false;
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; // 移除 isSliding 判断,确保强制收回
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 handleResetAllSlide = () => {
141
- resetSlide();
142
- };
141
+ // 关键:暴露当前组件实例和 resetSlide 方法,供父组件调用
142
+ const instanceRef = ref({
143
+ resetSlide
144
+ });
145
+ expose({
146
+ resetSlide
147
+ });
143
148
 
144
149
  onMounted(() => {
145
- uni.onClickOutside(listItemRef, resetSlide);
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 {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rrj-astra-ui",
3
- "version": "1.1.8",
3
+ "version": "1.1.9",
4
4
  "description": "AstraUI - A powerful UI framework for UniApp with global SCSS color variables",
5
5
  "main": "index.js",
6
6
  "keywords": [