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.
- package/components/AuiListItem.vue +28 -23
- package/package.json +1 -1
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<view class="aui-list-item" ref="listItemRef">
|
|
3
|
-
|
|
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'; //
|
|
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
|
-
//
|
|
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
|
|
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 {
|