sard-uniapp 1.26.1 → 1.26.2

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/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## [1.26.2](https://github.com/sutras/sard-uniapp/compare/v1.26.1...v1.26.2) (2026-01-23)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * 修复弹出框关闭后页面无法滚动的问题 ([f5a7a92](https://github.com/sutras/sard-uniapp/commit/f5a7a92a015d1c6b2cb0ad7ab885b001b14dae0f))
7
+
8
+
9
+
1
10
  ## [1.26.1](https://github.com/sutras/sard-uniapp/compare/v1.26.0...v1.26.1) (2026-01-20)
2
11
 
3
12
 
@@ -28,22 +28,22 @@ import Popup from 'sard-uniapp/components/popup/popup.vue'
28
28
 
29
29
  ### PopupProps
30
30
 
31
- | 属性 | 描述 | 类型 | 默认值 |
32
- | --------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ------- |
33
- | root-class | 组件根元素类名 | string | - |
34
- | root-style | 组件根元素样式 | StyleValue | - |
35
- | visible (v-model) | 是否可见 | boolean | false |
36
- | duration | 显隐动画时长,单位 ms | number | 300 |
37
- | effect | 显隐效果 | 'slide-top' \| 'slide-right' \| 'slide-bottom' \| 'slide-left' \| 'zoom' \| 'fade' | 'fade' |
38
- | overlay | 是否显示遮罩 | boolean | true |
39
- | overlay-class | 添加到遮罩的类名 | string | - |
40
- | overlay-style | 添加到遮罩的样式 | string | - |
41
- | background | 遮罩背景色 | string | - |
42
- | transparent | 透明遮罩 | boolean | false |
43
- | overlay-closable <sup>1.22+</sup> | 是否在点击遮罩层后关闭 | boolean | true |
44
- | keep-render <sup>1.24.3+</sup> | 无论刚挂载还是隐藏,都始终不设置 display 为 none,一般用于内部包含计算尺寸的组件的情况 | boolean | false |
45
- | lock-scroll <sup>1.25.5+</sup> | 弹出框显示时,是否阻止页面滚动 | boolean | true |
46
- | back-press <sup>1.25.7+</sup> | 弹出框显示时,劫持用户的返回操作,`close`: 关闭弹出框、`back`: 返回上一页、`stop`: 不关闭也不返回(仅小程序支持) | 'close' \| 'back' \| 'stop' | 'close' |
31
+ | 属性 | 描述 | 类型 | 默认值 |
32
+ | --------------------------------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ------- |
33
+ | root-class | 组件根元素类名 | string | - |
34
+ | root-style | 组件根元素样式 | StyleValue | - |
35
+ | visible (v-model) | 是否可见 | boolean | false |
36
+ | duration | 显隐动画时长,单位 ms | number | 300 |
37
+ | effect | 显隐效果 | 'slide-top' \| 'slide-right' \| 'slide-bottom' \| 'slide-left' \| 'zoom' \| 'fade' | 'fade' |
38
+ | overlay | 是否显示遮罩 | boolean | true |
39
+ | overlay-class | 添加到遮罩的类名 | string | - |
40
+ | overlay-style | 添加到遮罩的样式 | string | - |
41
+ | background | 遮罩背景色 | string | - |
42
+ | transparent | 透明遮罩 | boolean | false |
43
+ | overlay-closable <sup>1.22+</sup> | 是否在点击遮罩层后关闭 | boolean | true |
44
+ | keep-render <sup>1.24.3+</sup> | 无论刚挂载还是隐藏,都始终不设置 display 为 none,一般用于内部包含计算尺寸的组件的情况 | boolean | false |
45
+ | lock-scroll <sup>1.25.5+</sup> | 弹出框显示时,是否阻止页面滚动 | boolean | true |
46
+ | back-press <sup>1.25.7+</sup> | 弹出框显示时,劫持用户的返回操作,`close`: 关闭弹出框、`back`: 返回上一页(仅小程序支持) | 'close' \| 'back' | 'close' |
47
47
 
48
48
  ### PopupSlots
49
49
 
@@ -53,20 +53,20 @@ import Popup from 'sard-uniapp/components/popup/popup.vue'
53
53
 
54
54
  ### PopupEmits
55
55
 
56
- | 事件 | 描述 | 类型 |
57
- | ------------------------------- | ---------------------------------------------------------------- | ---------------------------------- |
58
- | overlay-click | 点击遮罩时触发 | (event: any) => void |
59
- | update:visible <sup>1.22+</sup> | 显隐时触发 | (visible: boolean) => void |
60
- | back-press <sup>1.25.7+</sup> | 用户进行返回操作时触发,仅限于 `close` 和 `stop`(仅小程序支持) | () => void |
61
- | visible-hook | 入场/退场动画状态改变时触发 | (name: TransitionHookName) => void |
62
- | before-enter | 入场动画开始前触发 | () => void |
63
- | enter | 入场动画开始时触发 | () => void |
64
- | after-enter | 入场动画结束时触发 | () => void |
65
- | enter-cancelled | 入场动画取消时触发 | () => void |
66
- | before-leave | 退场动画开始前触发 | () => void |
67
- | leave | 退场动画开始时触发 | () => void |
68
- | after-leave | 退场动画结束时触发 | () => void |
69
- | leave-cancelled | 退场动画取消时触发 | () => void |
56
+ | 事件 | 描述 | 类型 |
57
+ | ------------------------------- | ------------------------------------------------------ | ---------------------------------- |
58
+ | overlay-click | 点击遮罩时触发 | (event: any) => void |
59
+ | update:visible <sup>1.22+</sup> | 显隐时触发 | (visible: boolean) => void |
60
+ | back-press <sup>1.25.7+</sup> | 用户进行返回操作时触发,仅限于 `close`(仅小程序支持) | () => void |
61
+ | visible-hook | 入场/退场动画状态改变时触发 | (name: TransitionHookName) => void |
62
+ | before-enter | 入场动画开始前触发 | () => void |
63
+ | enter | 入场动画开始时触发 | () => void |
64
+ | after-enter | 入场动画结束时触发 | () => void |
65
+ | enter-cancelled | 入场动画取消时触发 | () => void |
66
+ | before-leave | 退场动画开始前触发 | () => void |
67
+ | leave | 退场动画开始时触发 | () => void |
68
+ | after-leave | 退场动画结束时触发 | () => void |
69
+ | leave-cancelled | 退场动画取消时触发 | () => void |
70
70
 
71
71
  ## 主题定制
72
72
 
@@ -14,7 +14,7 @@ export interface PopupProps {
14
14
  keepRender?: boolean;
15
15
  overlayClosable?: boolean;
16
16
  lockScroll?: boolean;
17
- backPress?: 'close' | 'back' | 'stop';
17
+ backPress?: 'close' | 'back';
18
18
  }
19
19
  export declare const defaultPopupProps: {
20
20
  rootStyle?: (string | false | ((props: {
@@ -31,7 +31,7 @@ export declare const defaultPopupProps: {
31
31
  keepRender: boolean;
32
32
  overlayClosable: boolean;
33
33
  lockScroll: boolean;
34
- backPress: "close" | "back" | "stop";
34
+ backPress: "close" | "back";
35
35
  }) => string | false | import("vue").CSSProperties | StyleValue[]) | null) | undefined;
36
36
  rootClass?: (string | ((props: {
37
37
  rootStyle: StyleValue;
@@ -47,7 +47,7 @@ export declare const defaultPopupProps: {
47
47
  keepRender: boolean;
48
48
  overlayClosable: boolean;
49
49
  lockScroll: boolean;
50
- backPress: "close" | "back" | "stop";
50
+ backPress: "close" | "back";
51
51
  }) => string)) | undefined;
52
52
  visible?: (boolean | ((props: {
53
53
  rootStyle: StyleValue;
@@ -63,7 +63,7 @@ export declare const defaultPopupProps: {
63
63
  keepRender: boolean;
64
64
  overlayClosable: boolean;
65
65
  lockScroll: boolean;
66
- backPress: "close" | "back" | "stop";
66
+ backPress: "close" | "back";
67
67
  }) => boolean)) | undefined;
68
68
  duration?: (number | ((props: {
69
69
  rootStyle: StyleValue;
@@ -79,7 +79,7 @@ export declare const defaultPopupProps: {
79
79
  keepRender: boolean;
80
80
  overlayClosable: boolean;
81
81
  lockScroll: boolean;
82
- backPress: "close" | "back" | "stop";
82
+ backPress: "close" | "back";
83
83
  }) => number)) | undefined;
84
84
  effect?: ("slide-top" | "slide-right" | "slide-bottom" | "slide-left" | "zoom" | "fade" | "full-fade" | ((props: {
85
85
  rootStyle: StyleValue;
@@ -95,7 +95,7 @@ export declare const defaultPopupProps: {
95
95
  keepRender: boolean;
96
96
  overlayClosable: boolean;
97
97
  lockScroll: boolean;
98
- backPress: "close" | "back" | "stop";
98
+ backPress: "close" | "back";
99
99
  }) => "slide-top" | "slide-right" | "slide-bottom" | "slide-left" | "zoom" | "fade" | "full-fade")) | undefined;
100
100
  overlay?: (boolean | ((props: {
101
101
  rootStyle: StyleValue;
@@ -111,7 +111,7 @@ export declare const defaultPopupProps: {
111
111
  keepRender: boolean;
112
112
  overlayClosable: boolean;
113
113
  lockScroll: boolean;
114
- backPress: "close" | "back" | "stop";
114
+ backPress: "close" | "back";
115
115
  }) => boolean)) | undefined;
116
116
  overlayClass?: (string | ((props: {
117
117
  rootStyle: StyleValue;
@@ -127,7 +127,7 @@ export declare const defaultPopupProps: {
127
127
  keepRender: boolean;
128
128
  overlayClosable: boolean;
129
129
  lockScroll: boolean;
130
- backPress: "close" | "back" | "stop";
130
+ backPress: "close" | "back";
131
131
  }) => string)) | undefined;
132
132
  overlayStyle?: (string | ((props: {
133
133
  rootStyle: StyleValue;
@@ -143,7 +143,7 @@ export declare const defaultPopupProps: {
143
143
  keepRender: boolean;
144
144
  overlayClosable: boolean;
145
145
  lockScroll: boolean;
146
- backPress: "close" | "back" | "stop";
146
+ backPress: "close" | "back";
147
147
  }) => string)) | undefined;
148
148
  background?: (string | ((props: {
149
149
  rootStyle: StyleValue;
@@ -159,7 +159,7 @@ export declare const defaultPopupProps: {
159
159
  keepRender: boolean;
160
160
  overlayClosable: boolean;
161
161
  lockScroll: boolean;
162
- backPress: "close" | "back" | "stop";
162
+ backPress: "close" | "back";
163
163
  }) => string)) | undefined;
164
164
  transparent?: (boolean | ((props: {
165
165
  rootStyle: StyleValue;
@@ -175,7 +175,7 @@ export declare const defaultPopupProps: {
175
175
  keepRender: boolean;
176
176
  overlayClosable: boolean;
177
177
  lockScroll: boolean;
178
- backPress: "close" | "back" | "stop";
178
+ backPress: "close" | "back";
179
179
  }) => boolean)) | undefined;
180
180
  keepRender?: (boolean | ((props: {
181
181
  rootStyle: StyleValue;
@@ -191,7 +191,7 @@ export declare const defaultPopupProps: {
191
191
  keepRender: boolean;
192
192
  overlayClosable: boolean;
193
193
  lockScroll: boolean;
194
- backPress: "close" | "back" | "stop";
194
+ backPress: "close" | "back";
195
195
  }) => boolean)) | undefined;
196
196
  overlayClosable?: (boolean | ((props: {
197
197
  rootStyle: StyleValue;
@@ -207,7 +207,7 @@ export declare const defaultPopupProps: {
207
207
  keepRender: boolean;
208
208
  overlayClosable: boolean;
209
209
  lockScroll: boolean;
210
- backPress: "close" | "back" | "stop";
210
+ backPress: "close" | "back";
211
211
  }) => boolean)) | undefined;
212
212
  lockScroll?: (boolean | ((props: {
213
213
  rootStyle: StyleValue;
@@ -223,9 +223,9 @@ export declare const defaultPopupProps: {
223
223
  keepRender: boolean;
224
224
  overlayClosable: boolean;
225
225
  lockScroll: boolean;
226
- backPress: "close" | "back" | "stop";
226
+ backPress: "close" | "back";
227
227
  }) => boolean)) | undefined;
228
- backPress?: ("close" | "stop" | "back" | ((props: {
228
+ backPress?: ("close" | "back" | ((props: {
229
229
  rootStyle: StyleValue;
230
230
  rootClass: string;
231
231
  visible: boolean;
@@ -239,8 +239,8 @@ export declare const defaultPopupProps: {
239
239
  keepRender: boolean;
240
240
  overlayClosable: boolean;
241
241
  lockScroll: boolean;
242
- backPress: "close" | "back" | "stop";
243
- }) => "close" | "stop" | "back")) | undefined;
242
+ backPress: "close" | "back";
243
+ }) => "close" | "back")) | undefined;
244
244
  };
245
245
  export interface PopupSlots {
246
246
  default?(props: Record<string, never>): any;
@@ -23,7 +23,7 @@ declare const _default_1: __VLS_WithTemplateSlots<import("vue").DefineComponent<
23
23
  keepRender: boolean;
24
24
  overlayClosable: boolean;
25
25
  lockScroll: boolean;
26
- backPress: "close" | "back" | "stop";
26
+ backPress: "close" | "back";
27
27
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, Readonly<PopupSlots> & PopupSlots>;
28
28
  export default _default_1;
29
29
  type __VLS_WithTemplateSlots<T, S> = T & {
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <!-- #ifdef MP -->
3
3
  <page-container
4
- v-if="backPress !== 'back' && isTopLayer && backPressVisible"
4
+ v-if="realBackPressVisible"
5
5
  :show="visible"
6
6
  :duration="0"
7
7
  :z-index="0"
@@ -94,10 +94,10 @@ import {
94
94
  * @property {boolean} overlayClosable 是否在点击遮罩层后关闭,默认值:true。
95
95
  * @property {boolean} keepRender 无论刚挂载还是隐藏,都始终不设置 display 为 none,一般用于内部包含计算尺寸的组件的情况,默认值:false。
96
96
  * @property {boolean} lockScroll 弹出框显示时,是否阻止页面滚动,默认值:true。
97
- * @property {'close' | 'back' | 'stop'} backPress 弹出框显示时,劫持用户的返回操作,`close`: 关闭弹出框、`back`: 返回上一页、`stop`: 不关闭也不返回(仅小程序支持),默认值:'close'。
97
+ * @property {'close' | 'back'} backPress 弹出框显示时,劫持用户的返回操作,`close`: 关闭弹出框、`back`: 返回上一页(仅小程序支持),默认值:'close'。
98
98
  * @event {(event: any) => void} overlay-click 点击遮罩时触发
99
99
  * @event {(visible: boolean) => void} update 显隐时触发
100
- * @event {() => void} back-press 用户进行返回操作时触发,仅限于 `close` 和 `stop`(仅小程序支持)
100
+ * @event {() => void} back-press 用户进行返回操作时触发,仅限于 `close`(仅小程序支持)
101
101
  * @event {(name: TransitionHookName) => void} visible-hook 入场/退场动画状态改变时触发
102
102
  * @event {() => void} before-enter 入场动画开始前触发
103
103
  * @event {() => void} enter 入场动画开始时触发
@@ -182,30 +182,33 @@ export default _defineComponent({
182
182
  );
183
183
  const onBeforeLeave = () => {
184
184
  emit("back-press");
185
- if (props.backPress === "stop") {
186
- backPressVisible.value = false;
187
- setTimeout(() => {
188
- backPressVisible.value = true;
189
- }, 50);
190
- } else {
191
- emit("update:visible", false);
192
- }
185
+ emit("update:visible", false);
193
186
  };
194
- const backPressVisible = ref(false);
195
- const { start: setVisibleLater, stop: cancelDelayVisible } = useTimeout(() => {
196
- backPressVisible.value = true;
197
- }, 50);
198
- watch(
199
- () => props.visible,
200
- (visible) => {
201
- if (visible) {
202
- setVisibleLater();
203
- } else {
204
- backPressVisible.value = false;
205
- cancelDelayVisible();
206
- }
207
- }
187
+ const backPressVisible = computed(() => {
188
+ return props.backPress === "close" && isTopLayer.value && props.visible;
189
+ });
190
+ const realBackPressVisible = ref(backPressVisible.value);
191
+ const { start: hideBackPressLater, stop: cancelBackPressHide } = useTimeout(
192
+ () => {
193
+ realBackPressVisible.value = false;
194
+ },
195
+ 30
196
+ );
197
+ const { start: showBackPressLater, stop: cancelBackPressShow } = useTimeout(
198
+ () => {
199
+ realBackPressVisible.value = true;
200
+ },
201
+ 40
208
202
  );
203
+ watch(backPressVisible, (visible) => {
204
+ if (visible) {
205
+ cancelBackPressHide();
206
+ showBackPressLater();
207
+ } else {
208
+ cancelBackPressShow();
209
+ hideBackPressLater();
210
+ }
211
+ });
209
212
  const pageVisible = ref(true);
210
213
  // #ifdef WEB
211
214
  onShow(() => {
@@ -232,7 +235,7 @@ export default _defineComponent({
232
235
  transitionDuration: props.duration + "ms"
233
236
  });
234
237
  });
235
- const __returned__ = { props, emit, bem, zIndex, increaseZIndex, callVisibleHook, keepRenderClass, onVisibleHook, realVisible, transitionClass, onTransitionEnd, onOverlayClick, isTopLayer, onBeforeLeave, backPressVisible, setVisibleLater, cancelDelayVisible, pageVisible, popupClass, popupStyle, SarOverlay };
238
+ const __returned__ = { props, emit, bem, zIndex, increaseZIndex, callVisibleHook, keepRenderClass, onVisibleHook, realVisible, transitionClass, onTransitionEnd, onOverlayClick, isTopLayer, onBeforeLeave, backPressVisible, realBackPressVisible, hideBackPressLater, cancelBackPressHide, showBackPressLater, cancelBackPressShow, pageVisible, popupClass, popupStyle, SarOverlay };
236
239
  return __returned__;
237
240
  }
238
241
  });
@@ -103,7 +103,7 @@ import {
103
103
  * @property {boolean} overlayClosable 点击遮罩后是否关闭,默认值:true。
104
104
  * @property {boolean} keepRender 无论刚挂载还是隐藏,都始终不设置 display 为 none,一般用于内部包含计算尺寸的组件的情况,默认值:false。
105
105
  * @property {boolean} lockScroll 弹出框显示时,是否阻止页面滚动,默认值:true。
106
- * @property {'close' | 'back' | 'stop'} backPress 弹出框显示时,劫持用户的返回操作,`close`: 关闭弹出框、`back`: 返回上一页、`stop`: 不关闭也不返回(仅小程序支持),默认值:'close'。
106
+ * @property {'close' | 'back'} backPress 弹出框显示时,劫持用户的返回操作,`close`: 关闭弹出框、`back`: 返回上一页(仅小程序支持),默认值:'close'。
107
107
  * @property {ShareSheetItem[] | ShareSheetItem[][]} itemList 面板选项列表,默认值:[]。
108
108
  * @property {string} title 面板标题,默认值:-。
109
109
  * @property {string} description 面板描述,默认值:-。
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "id": "sard-uniapp",
3
3
  "name": "sard-uniapp",
4
4
  "displayName": "sard-uniapp",
5
- "version": "1.26.1",
5
+ "version": "1.26.2",
6
6
  "description": "sard-uniapp 是一套基于 Uniapp + Vue3 框架开发的兼容多端的 UI 组件库",
7
7
  "main": "index.js",
8
8
  "scripts": {
@@ -46,9 +46,7 @@ export function useLockScroll(_visible, lockScroll = true) {
46
46
  }
47
47
  });
48
48
  onBeforeUnmount(() => {
49
- if (visible.value) {
50
- unlock();
51
- }
49
+ unlock();
52
50
  });
53
51
  onShow(() => {
54
52
  if (visible.value) {
@@ -67,10 +65,6 @@ export function useLockScroll(_visible, lockScroll = true) {
67
65
  else {
68
66
  unlock();
69
67
  }
70
- }, {
71
- // 使用同步,避免 visible 为 false 且组件销毁时不执行 watch 回调,
72
- // 并因 visible 为 false,导致 onBeforeUnmount 中不能执行 unlock。
73
- flush: 'sync',
74
68
  });
75
69
  }
76
70
  /**