rrj-astra-ui 1.1.6 → 1.1.7
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 +40 -33
- package/package.json +1 -1
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
|
|
28
28
|
<script setup>
|
|
29
29
|
import { defineProps, ref, onMounted, onUnmounted } from 'vue';
|
|
30
|
-
const __name = 'AuiListItem'; //
|
|
30
|
+
const __name = 'AuiListItem'; // 完全保留你的__name,无改动
|
|
31
31
|
|
|
32
32
|
defineOptions({
|
|
33
33
|
name: __name
|
|
@@ -56,97 +56,103 @@ const startX = ref(0);
|
|
|
56
56
|
const offsetX = ref(0);
|
|
57
57
|
const isSliding = ref(false);
|
|
58
58
|
const SLIDE_THRESHOLD = -50;
|
|
59
|
+
// 新增:获取组件 DOM 引用(保留你的原有定义)
|
|
59
60
|
const listItemRef = ref(null);
|
|
60
61
|
|
|
61
|
-
//
|
|
62
|
+
// 还原你原本的滑动逻辑(完全不改动,仅修复右滑限制问题)
|
|
62
63
|
const onTouchStart = (e) => {
|
|
63
64
|
if (!props.allowSlide) return;
|
|
64
|
-
//
|
|
65
|
+
// 新增:触摸当前项时,收回其他已展开的项(解决多选项同时展开)
|
|
65
66
|
uni.$emit('auiListItem:resetAllSlide');
|
|
66
67
|
startX.value = e.touches[0].clientX;
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
offsetX.value = currentOffset;
|
|
70
|
-
isSliding.value = currentOffset === -150;
|
|
68
|
+
offsetX.value = 0; // 还原你的原有逻辑
|
|
69
|
+
isSliding.value = false; // 还原你的原有逻辑
|
|
71
70
|
};
|
|
72
71
|
|
|
73
72
|
const onTouchMove = (e) => {
|
|
74
73
|
if (!props.allowSlide) return;
|
|
75
74
|
const currentX = e.touches[0].clientX;
|
|
76
75
|
const diffX = currentX - startX.value;
|
|
77
|
-
//
|
|
78
|
-
if (diffX < 0
|
|
79
|
-
offsetX.value = diffX
|
|
80
|
-
if (
|
|
76
|
+
// 移除之前的右滑限制,完全还原你的逻辑:仅左滑时更新偏移(右滑时diffX>0,不更新,自然恢复)
|
|
77
|
+
if (diffX < 0) {
|
|
78
|
+
offsetX.value = diffX;
|
|
79
|
+
if (diffX < SLIDE_THRESHOLD) {
|
|
81
80
|
isSliding.value = true;
|
|
82
81
|
}
|
|
83
82
|
}
|
|
83
|
+
// 补充:右滑时允许重置状态(贴合你的原有交互,左滑后右滑可实时恢复)
|
|
84
|
+
if (diffX > 0) {
|
|
85
|
+
offsetX.value = 0;
|
|
86
|
+
isSliding.value = false;
|
|
87
|
+
}
|
|
84
88
|
};
|
|
85
89
|
|
|
86
90
|
const onTouchEnd = () => {
|
|
87
91
|
if (!props.allowSlide) return;
|
|
92
|
+
// 完全还原你的原有逻辑,不做任何额外限制
|
|
88
93
|
if (offsetX.value < SLIDE_THRESHOLD) {
|
|
89
|
-
// 展开:固定偏移到-150
|
|
90
94
|
offsetX.value = -150;
|
|
91
|
-
isSliding.value = true;
|
|
92
95
|
} else {
|
|
93
|
-
|
|
94
|
-
|
|
96
|
+
offsetX.value = 0;
|
|
97
|
+
isSliding.value = false;
|
|
95
98
|
}
|
|
96
99
|
};
|
|
97
100
|
|
|
98
|
-
//
|
|
101
|
+
// 新增:收回滑动区域的核心方法(保留,无改动)
|
|
99
102
|
const resetSlide = () => {
|
|
100
|
-
if (!props.allowSlide) return;
|
|
103
|
+
if (!props.allowSlide || !isSliding.value) return;
|
|
101
104
|
offsetX.value = 0;
|
|
102
105
|
isSliding.value = false;
|
|
103
106
|
};
|
|
104
107
|
|
|
105
|
-
//
|
|
106
|
-
const handleResetAllSlide = () => {
|
|
107
|
-
resetSlide();
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
// 优化:页面点击/触摸外部判断(移除重复监听,保留uni-app内置方法更稳定)
|
|
108
|
+
// 新增:监听页面点击事件,判断是否点击组件外部(保留你的原有逻辑)
|
|
111
109
|
const handlePageClick = (e) => {
|
|
112
110
|
if (!listItemRef.value || !isSliding.value) return;
|
|
113
111
|
|
|
112
|
+
// 获取组件 DOM 信息
|
|
114
113
|
const itemDom = listItemRef.value;
|
|
115
114
|
const itemRect = itemDom.getBoundingClientRect();
|
|
116
115
|
|
|
116
|
+
// 判断点击坐标是否在组件外部
|
|
117
117
|
const clickX = e.clientX || e.touches?.[0]?.clientX;
|
|
118
118
|
const clickY = e.clientY || e.touches?.[0]?.clientY;
|
|
119
|
-
|
|
120
|
-
// 点击组件外部,收回滑动
|
|
121
119
|
if (
|
|
122
120
|
clickX < itemRect.left ||
|
|
123
121
|
clickX > itemRect.right ||
|
|
124
122
|
clickY < itemRect.top ||
|
|
125
123
|
clickY > itemRect.bottom
|
|
126
124
|
) {
|
|
125
|
+
// 点击外部,触发收回
|
|
127
126
|
resetSlide();
|
|
128
127
|
}
|
|
129
128
|
};
|
|
130
129
|
|
|
130
|
+
// 新增:监听全局事件,收回所有列表项(解决多选项同时展开)
|
|
131
|
+
const handleResetAllSlide = () => {
|
|
132
|
+
resetSlide();
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// 挂载时添加监听(优化:去重但保留你的原有监听,新增全局事件)
|
|
131
136
|
onMounted(() => {
|
|
132
|
-
//
|
|
137
|
+
// 优先使用 uni-app 内置方法(更简洁)
|
|
133
138
|
uni.onClickOutside(listItemRef, resetSlide);
|
|
134
|
-
//
|
|
135
|
-
uni.$on('auiListItem:resetAllSlide', handleResetAllSlide);
|
|
136
|
-
// 3. 备用:window点击监听(兼容PC端和部分特殊场景)
|
|
139
|
+
// 备用:监听 window 点击(兼容更多场景,还原你的原有逻辑)
|
|
137
140
|
window.addEventListener('click', handlePageClick);
|
|
138
141
|
window.addEventListener('touchstart', handlePageClick);
|
|
142
|
+
// 新增:监听全局重置事件,不影响你的原有逻辑
|
|
143
|
+
uni.$on('auiListItem:resetAllSlide', handleResetAllSlide);
|
|
139
144
|
});
|
|
140
145
|
|
|
141
146
|
onUnmounted(() => {
|
|
142
|
-
//
|
|
147
|
+
// 移除监听,防止内存泄漏(还原你的原有逻辑,新增全局事件移除)
|
|
143
148
|
uni.offClickOutside(listItemRef, resetSlide);
|
|
144
|
-
uni.$off('auiListItem:resetAllSlide', handleResetAllSlide);
|
|
145
149
|
window.removeEventListener('click', handlePageClick);
|
|
146
150
|
window.removeEventListener('touchstart', handlePageClick);
|
|
151
|
+
uni.$off('auiListItem:resetAllSlide', handleResetAllSlide);
|
|
147
152
|
});
|
|
148
153
|
</script>
|
|
149
154
|
|
|
155
|
+
<!-- 样式部分完全保留你的原有代码,无任何改动 -->
|
|
150
156
|
<style scoped lang="scss">
|
|
151
157
|
@import '../style.scss';
|
|
152
158
|
.aui-list-item {
|
|
@@ -159,8 +165,9 @@ onUnmounted(() => {
|
|
|
159
165
|
}
|
|
160
166
|
.aui-list-item-content-wrapper {
|
|
161
167
|
display: flex;
|
|
168
|
+
// align-items: center;
|
|
162
169
|
width: 100%;
|
|
163
|
-
transition: transform 0.3s;
|
|
170
|
+
transition: transform 0.3s;
|
|
164
171
|
}
|
|
165
172
|
.aui-list-item_befor {
|
|
166
173
|
margin:0 10px;
|
|
@@ -190,7 +197,7 @@ onUnmounted(() => {
|
|
|
190
197
|
right: 0;
|
|
191
198
|
top: 0;
|
|
192
199
|
bottom: 0;
|
|
193
|
-
width: 150px; /*
|
|
200
|
+
width: 150px; /* 自定义内容宽度 */
|
|
194
201
|
background-color: #f0f0f0;
|
|
195
202
|
display: flex;
|
|
196
203
|
align-items: center;
|