rrj-astra-ui 1.1.7 → 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.
@@ -1,6 +1,12 @@
1
1
  <template>
2
2
  <view class="aui-list-item" ref="listItemRef">
3
- <view class="aui-list-item-content-wrapper" :style="{ transform: `translateX(${offsetX}px)` }" @touchstart="onTouchStart" @touchmove="onTouchMove" @touchend="onTouchEnd">
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
@@ -56,31 +62,30 @@ const startX = ref(0);
56
62
  const offsetX = ref(0);
57
63
  const isSliding = ref(false);
58
64
  const SLIDE_THRESHOLD = -50;
59
- // 新增:获取组件 DOM 引用(保留你的原有定义)
60
65
  const listItemRef = ref(null);
61
66
 
62
- // 还原你原本的滑动逻辑(完全不改动,仅修复右滑限制问题)
67
+ // 原有滑动逻辑(已修复右滑,无改动)
63
68
  const onTouchStart = (e) => {
64
69
  if (!props.allowSlide) return;
65
- // 新增:触摸当前项时,收回其他已展开的项(解决多选项同时展开)
70
+ // 关键:触摸当前项时,立即发送全局通知,让所有其他项收回
66
71
  uni.$emit('auiListItem:resetAllSlide');
67
72
  startX.value = e.touches[0].clientX;
68
- offsetX.value = 0; // 还原你的原有逻辑
69
- isSliding.value = false; // 还原你的原有逻辑
73
+ offsetX.value = 0;
74
+ isSliding.value = false;
70
75
  };
71
76
 
72
77
  const onTouchMove = (e) => {
73
78
  if (!props.allowSlide) return;
74
79
  const currentX = e.touches[0].clientX;
75
80
  const diffX = currentX - startX.value;
76
- // 移除之前的右滑限制,完全还原你的逻辑:仅左滑时更新偏移(右滑时diffX>0,不更新,自然恢复)
81
+ // 左滑逻辑(原有)
77
82
  if (diffX < 0) {
78
83
  offsetX.value = diffX;
79
84
  if (diffX < SLIDE_THRESHOLD) {
80
85
  isSliding.value = true;
81
86
  }
82
87
  }
83
- // 补充:右滑时允许重置状态(贴合你的原有交互,左滑后右滑可实时恢复)
88
+ // 右滑恢复逻辑(原有,修复无法右滑问题)
84
89
  if (diffX > 0) {
85
90
  offsetX.value = 0;
86
91
  isSliding.value = false;
@@ -89,7 +94,6 @@ const onTouchMove = (e) => {
89
94
 
90
95
  const onTouchEnd = () => {
91
96
  if (!props.allowSlide) return;
92
- // 完全还原你的原有逻辑,不做任何额外限制
93
97
  if (offsetX.value < SLIDE_THRESHOLD) {
94
98
  offsetX.value = -150;
95
99
  } else {
@@ -98,22 +102,28 @@ const onTouchEnd = () => {
98
102
  }
99
103
  };
100
104
 
101
- // 新增:收回滑动区域的核心方法(保留,无改动)
105
+ // 核心:收回当前项的滑动状态(原有,无改动)
102
106
  const resetSlide = () => {
103
- if (!props.allowSlide || !isSliding.value) return;
107
+ if (!props.allowSlide) return; // 移除 isSliding 判断,确保强制收回
104
108
  offsetX.value = 0;
105
109
  isSliding.value = false;
106
110
  };
107
111
 
108
- // 新增:监听页面点击事件,判断是否点击组件外部(保留你的原有逻辑)
112
+ // 新增:点击当前项内容区域,触发全局重置(确保点击其他项时联动)
113
+ const onItemContentClick = () => {
114
+ if (!props.allowSlide) return;
115
+ // 先收回自己(如果已展开),再通知其他项
116
+ resetSlide();
117
+ uni.$emit('auiListItem:resetAllSlide');
118
+ };
119
+
120
+ // 原有:监听页面点击外部(原有,无改动)
109
121
  const handlePageClick = (e) => {
110
122
  if (!listItemRef.value || !isSliding.value) return;
111
123
 
112
- // 获取组件 DOM 信息
113
124
  const itemDom = listItemRef.value;
114
125
  const itemRect = itemDom.getBoundingClientRect();
115
126
 
116
- // 判断点击坐标是否在组件外部
117
127
  const clickX = e.clientX || e.touches?.[0]?.clientX;
118
128
  const clickY = e.clientY || e.touches?.[0]?.clientY;
119
129
  if (
@@ -122,29 +132,24 @@ const handlePageClick = (e) => {
122
132
  clickY < itemRect.top ||
123
133
  clickY > itemRect.bottom
124
134
  ) {
125
- // 点击外部,触发收回
126
135
  resetSlide();
127
136
  }
128
137
  };
129
138
 
130
- // 新增:监听全局事件,收回所有列表项(解决多选项同时展开)
139
+ // 原有:监听全局重置事件(无改动,确保收到通知即收回)
131
140
  const handleResetAllSlide = () => {
132
141
  resetSlide();
133
142
  };
134
143
 
135
- // 挂载时添加监听(优化:去重但保留你的原有监听,新增全局事件)
136
144
  onMounted(() => {
137
- // 优先使用 uni-app 内置方法(更简洁)
138
145
  uni.onClickOutside(listItemRef, resetSlide);
139
- // 备用:监听 window 点击(兼容更多场景,还原你的原有逻辑)
140
146
  window.addEventListener('click', handlePageClick);
141
147
  window.addEventListener('touchstart', handlePageClick);
142
- // 新增:监听全局重置事件,不影响你的原有逻辑
148
+ // 确保全局事件监听生效,无遗漏
143
149
  uni.$on('auiListItem:resetAllSlide', handleResetAllSlide);
144
150
  });
145
151
 
146
152
  onUnmounted(() => {
147
- // 移除监听,防止内存泄漏(还原你的原有逻辑,新增全局事件移除)
148
153
  uni.offClickOutside(listItemRef, resetSlide);
149
154
  window.removeEventListener('click', handlePageClick);
150
155
  window.removeEventListener('touchstart', handlePageClick);
@@ -152,7 +157,7 @@ onUnmounted(() => {
152
157
  });
153
158
  </script>
154
159
 
155
- <!-- 样式部分完全保留你的原有代码,无任何改动 -->
160
+ <!-- 样式部分完全保留,无任何改动 -->
156
161
  <style scoped lang="scss">
157
162
  @import '../style.scss';
158
163
  .aui-list-item {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rrj-astra-ui",
3
- "version": "1.1.7",
3
+ "version": "1.1.8",
4
4
  "description": "AstraUI - A powerful UI framework for UniApp with global SCSS color variables",
5
5
  "main": "index.js",
6
6
  "keywords": [