stellar-ui-v2 1.40.24 → 1.40.26
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/ste-page-container/README.md +171 -0
- package/components/ste-page-container/WORKLOG-2026-03-12.md +229 -0
- package/components/ste-page-container/config.json +5 -0
- package/components/ste-page-container/ste-page-container.vue +190 -0
- package/components/ste-sticky/ste-sticky.vue +2 -1
- package/package.json +1 -1
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# PageContainer 页面容器
|
|
2
|
+
|
|
3
|
+
### 说明
|
|
4
|
+
`ste-page-container` 在不同平台的实现方式:
|
|
5
|
+
|
|
6
|
+
- `MP-WEIXIN`:使用微信小程序原生 `page-container`
|
|
7
|
+
- 其他平台:基于 `ste-popup` 兼容实现
|
|
8
|
+
- 微信单页限制:原生 `page-container` 同一页面仅允许 1 个实例,因此 `ste-page-container` 在微信小程序环境下也仅支持单实例使用
|
|
9
|
+
|
|
10
|
+
为保持 API 一致,组件对外暴露 `page-container` 常用属性和事件。
|
|
11
|
+
|
|
12
|
+
---$
|
|
13
|
+
|
|
14
|
+
### 代码演示
|
|
15
|
+
|
|
16
|
+
#### 微信小程序
|
|
17
|
+
```vue
|
|
18
|
+
<template>
|
|
19
|
+
<ste-page-container
|
|
20
|
+
:show.sync="show"
|
|
21
|
+
position="bottom"
|
|
22
|
+
:overlay="true"
|
|
23
|
+
:round="true"
|
|
24
|
+
custom-style="height: 60vh;"
|
|
25
|
+
>
|
|
26
|
+
<view class="content">内容区域</view>
|
|
27
|
+
</ste-page-container>
|
|
28
|
+
</template>
|
|
29
|
+
|
|
30
|
+
<script>
|
|
31
|
+
export default {
|
|
32
|
+
data() {
|
|
33
|
+
return {
|
|
34
|
+
show: false,
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
</script>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
#### 其他平台
|
|
42
|
+
```vue
|
|
43
|
+
<template>
|
|
44
|
+
<ste-page-container
|
|
45
|
+
:show.sync="show"
|
|
46
|
+
position="bottom"
|
|
47
|
+
:overlay="true"
|
|
48
|
+
:round="true"
|
|
49
|
+
custom-style="height: 60vh;"
|
|
50
|
+
>
|
|
51
|
+
<view class="content">内容区域</view>
|
|
52
|
+
</ste-page-container>
|
|
53
|
+
</template>
|
|
54
|
+
|
|
55
|
+
<script>
|
|
56
|
+
export default {
|
|
57
|
+
data() {
|
|
58
|
+
return {
|
|
59
|
+
show: false,
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
</script>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
#### 方法调用
|
|
67
|
+
```vue
|
|
68
|
+
<template>
|
|
69
|
+
<ste-page-container ref="pc" :show.sync="show">
|
|
70
|
+
<view>内容区域</view>
|
|
71
|
+
</ste-page-container>
|
|
72
|
+
</template>
|
|
73
|
+
|
|
74
|
+
<script>
|
|
75
|
+
export default {
|
|
76
|
+
data() {
|
|
77
|
+
return {
|
|
78
|
+
show: false,
|
|
79
|
+
};
|
|
80
|
+
},
|
|
81
|
+
methods: {
|
|
82
|
+
openBox() {
|
|
83
|
+
this.$refs.pc.open();
|
|
84
|
+
},
|
|
85
|
+
closeBox() {
|
|
86
|
+
this.$refs.pc.close();
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
</script>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
#### 事件监听
|
|
94
|
+
```vue
|
|
95
|
+
<ste-page-container
|
|
96
|
+
:show.sync="show"
|
|
97
|
+
@beforeenter="onEvent('beforeenter')"
|
|
98
|
+
@afterenter="onEvent('afterenter')"
|
|
99
|
+
@clickoverlay="onEvent('clickoverlay')"
|
|
100
|
+
>
|
|
101
|
+
<view>内容区域</view>
|
|
102
|
+
</ste-page-container>
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
#### 微信专属属性
|
|
106
|
+
```vue
|
|
107
|
+
<ste-page-container
|
|
108
|
+
:show.sync="show"
|
|
109
|
+
:closeOnSlideDown="true"
|
|
110
|
+
overlayStyle="background: rgba(0, 144, 255, 0.45);"
|
|
111
|
+
customStyle="height: 50vh;"
|
|
112
|
+
>
|
|
113
|
+
<view>微信小程序下支持下滑关闭和自定义遮罩样式</view>
|
|
114
|
+
</ste-page-container>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---$
|
|
118
|
+
|
|
119
|
+
### API
|
|
120
|
+
|
|
121
|
+
#### Props
|
|
122
|
+
|
|
123
|
+
| 属性名 | 说明 | 类型 | 默认值 | 平台支持 |
|
|
124
|
+
| --- | --- | --- | --- | --- |
|
|
125
|
+
| `show` | 是否显示容器 | `Boolean` | `false` | 全平台 |
|
|
126
|
+
| `duration` | 动画时长,单位 ms | `Number` | `300` | 全平台 |
|
|
127
|
+
| `zIndex` | 层级 | `Number/String` | `100` | 全平台 |
|
|
128
|
+
| `overlay` | 是否显示遮罩 | `Boolean` | `true` | 全平台 |
|
|
129
|
+
| `position` | 弹出位置:`top`/`bottom`/`right`/`center` | `String` | `bottom` | 全平台 |
|
|
130
|
+
| `round` | 是否展示圆角 | `Boolean` | `false` | 全平台 |
|
|
131
|
+
| `customStyle` | 容器样式 | `String` | `''` | 全平台 |
|
|
132
|
+
| `safeAreaInsetBottom` | 是否适配底部安全区 | `Boolean` | `false` | 全平台(非微信为兼容实现) |
|
|
133
|
+
| `closeOnSlideDown` | 是否允许下滑关闭 | `Boolean` | `false` | 仅微信小程序 |
|
|
134
|
+
| `overlayStyle` | 遮罩层样式 | `String` | `''` | 仅微信小程序 |
|
|
135
|
+
|
|
136
|
+
#### Events
|
|
137
|
+
|
|
138
|
+
| 事件名 | 说明 | 平台支持 |
|
|
139
|
+
| --- | --- | --- |
|
|
140
|
+
| `beforeenter` | 进入前触发 | 全平台(非微信为兼容模拟) |
|
|
141
|
+
| `enter` | 进入中触发 | 全平台(非微信为兼容模拟) |
|
|
142
|
+
| `afterenter` | 进入结束触发 | 全平台 |
|
|
143
|
+
| `beforeleave` | 离开前触发 | 全平台(非微信为兼容模拟) |
|
|
144
|
+
| `leave` | 离开中触发 | 全平台(非微信为兼容模拟) |
|
|
145
|
+
| `afterleave` | 离开结束触发 | 全平台(非微信为兼容模拟) |
|
|
146
|
+
| `clickoverlay` | 点击遮罩触发 | 全平台 |
|
|
147
|
+
| `update:show` | 显隐双向绑定事件 | 全平台 |
|
|
148
|
+
|
|
149
|
+
#### Methods
|
|
150
|
+
|
|
151
|
+
| 方法名 | 说明 | 参数 |
|
|
152
|
+
| --- | --- | --- |
|
|
153
|
+
| `open` | 打开容器 | - |
|
|
154
|
+
| `close` | 关闭容器 | - |
|
|
155
|
+
|
|
156
|
+
### 非微信平台兼容差异
|
|
157
|
+
|
|
158
|
+
以下能力在非微信平台基于 `ste-popup` 兼容,无法完全等效原生 `page-container`:
|
|
159
|
+
|
|
160
|
+
- `closeOnSlideDown`:不支持
|
|
161
|
+
- `overlayStyle`:不支持
|
|
162
|
+
- 原生手势与生命周期细节存在实现差异
|
|
163
|
+
- `position="right"` 默认按侧页语义处理,兼容实现默认宽度为 `80vw`,可通过 `customStyle` 覆盖
|
|
164
|
+
|
|
165
|
+
微信端使用限制:
|
|
166
|
+
|
|
167
|
+
- 同一页面只允许存在 1 个 `ste-page-container`
|
|
168
|
+
- 若同时渲染多个实例,可能触发原生组件限制报错
|
|
169
|
+
|
|
170
|
+
---$
|
|
171
|
+
{{fuyuwei}}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# ste-page-container 会话记录(2026-03-12)
|
|
2
|
+
|
|
3
|
+
## 背景
|
|
4
|
+
|
|
5
|
+
目标组件:`uni_modules/stellar-ui/components/ste-page-container/ste-page-container.vue`
|
|
6
|
+
|
|
7
|
+
目标语义:
|
|
8
|
+
|
|
9
|
+
- 微信小程序下对齐原生 `page-container`
|
|
10
|
+
- 其他平台做兼容实现
|
|
11
|
+
- 组件语义来源于微信小程序 `page-container`,不是通用 `popup`
|
|
12
|
+
|
|
13
|
+
用户核心诉求:
|
|
14
|
+
|
|
15
|
+
1. 微信小程序环境只支持单实例,不需要“多实例自动降级到 `ste-popup`”
|
|
16
|
+
2. 文档要和代码一致
|
|
17
|
+
3. 非微信平台 `position="right"` 的交互要更贴近微信 `page-container`
|
|
18
|
+
4. 之前 `ste-popup` 在 APP 安卓模拟器上存在右侧弹出结束后“回弹”问题
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 本次做过的改动
|
|
23
|
+
|
|
24
|
+
### 1. 微信小程序单实例逻辑
|
|
25
|
+
|
|
26
|
+
已改:
|
|
27
|
+
|
|
28
|
+
- 删除了微信端“首个实例用原生、后续实例降级到 `ste-popup`”的逻辑
|
|
29
|
+
- 微信端现在直接只渲染原生 `page-container`
|
|
30
|
+
|
|
31
|
+
涉及文件:
|
|
32
|
+
|
|
33
|
+
- `uni_modules/stellar-ui/components/ste-page-container/ste-page-container.vue`
|
|
34
|
+
- `uni_modules/stellar-ui/components/ste-page-container/README.md`
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
### 2. 文档同步
|
|
39
|
+
|
|
40
|
+
已改:
|
|
41
|
+
|
|
42
|
+
- README 中去掉“微信多实例自动降级”描述
|
|
43
|
+
- 改成“微信端同页仅支持 1 个 `ste-page-container`”
|
|
44
|
+
- 示例按平台区分:
|
|
45
|
+
- 微信小程序单实例示例
|
|
46
|
+
- 其他平台示例
|
|
47
|
+
|
|
48
|
+
当前 README 已被继续修改为“非微信平台使用自定义过渡动画兼容实现”
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
### 3. 非微信平台兼容实现路线变更
|
|
53
|
+
|
|
54
|
+
原始路径:
|
|
55
|
+
|
|
56
|
+
- 非微信平台继续复用 `ste-popup`
|
|
57
|
+
|
|
58
|
+
中间尝试:
|
|
59
|
+
|
|
60
|
+
- 给 `ste-popup` 传 `width` / `height`
|
|
61
|
+
- `position="right"` 默认宽度改为 `80vw`
|
|
62
|
+
|
|
63
|
+
原因:
|
|
64
|
+
|
|
65
|
+
- H5 正常
|
|
66
|
+
- APP 安卓模拟器仍然出现右侧弹出结束后“回弹”
|
|
67
|
+
|
|
68
|
+
判断:
|
|
69
|
+
|
|
70
|
+
- 问题大概率不只是尺寸
|
|
71
|
+
- 更像 `ste-popup` 在 `APP-PLUS` 下的 transform / animation 状态残留
|
|
72
|
+
- 继续围绕 `ste-popup` 修补收益不高
|
|
73
|
+
|
|
74
|
+
因此后续改成:
|
|
75
|
+
|
|
76
|
+
- 非微信平台不再依赖 `ste-popup`
|
|
77
|
+
- 改成 `ste-page-container` 内部自实现遮罩 + 面板 + CSS 过渡
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 当前代码状态
|
|
82
|
+
|
|
83
|
+
当前 `ste-page-container.vue` 非微信分支已经被改成自定义实现,核心思路:
|
|
84
|
+
|
|
85
|
+
- `renderPopup` 控制节点挂载
|
|
86
|
+
- `popupVisible` 控制进入/离开状态
|
|
87
|
+
- `popupRenderKey` 用于二次打开强制重建节点
|
|
88
|
+
- 面板使用 CSS `translate3d(...)` 做 `top / bottom / right / center` 过渡
|
|
89
|
+
|
|
90
|
+
当前默认策略:
|
|
91
|
+
|
|
92
|
+
- `position="right"` 默认宽度 `80vw`
|
|
93
|
+
- 默认高度 `auto`
|
|
94
|
+
- `customStyle` 继续直接挂在 panel 上
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 当前存在的问题
|
|
99
|
+
|
|
100
|
+
这是本次会话结束时的阻塞点。
|
|
101
|
+
|
|
102
|
+
### 1. 插槽内容显示异常
|
|
103
|
+
|
|
104
|
+
用户反馈:
|
|
105
|
+
|
|
106
|
+
- 现在这版改完后,插槽里的内容显示不出来
|
|
107
|
+
|
|
108
|
+
说明:
|
|
109
|
+
|
|
110
|
+
- 当前 `ste-page-container.vue` 的非微信自定义实现是有问题的
|
|
111
|
+
- 本轮已停止继续修改,避免越改越乱
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### 2. APP 安卓模拟器二次打开回弹
|
|
116
|
+
|
|
117
|
+
现象:
|
|
118
|
+
|
|
119
|
+
- 第一次打开可能正常
|
|
120
|
+
- 隐藏后再次打开,右侧弹出结束后仍然会出现“往左弹一下再恢复”
|
|
121
|
+
|
|
122
|
+
说明:
|
|
123
|
+
|
|
124
|
+
- 即使脱离 `ste-popup`,问题仍未被完全验证解决
|
|
125
|
+
- 当前没有完成最终稳定方案
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 用户实际使用示例
|
|
130
|
+
|
|
131
|
+
本轮排查时用户给出的用法:
|
|
132
|
+
|
|
133
|
+
```vue
|
|
134
|
+
<ste-page-container
|
|
135
|
+
:show.sync="show"
|
|
136
|
+
position="right"
|
|
137
|
+
custom-style="height:15vh;width: 80vw"
|
|
138
|
+
@afterleave="afterleave"
|
|
139
|
+
>
|
|
140
|
+
<view class="page-container-box">
|
|
141
|
+
<view class="search-box">
|
|
142
|
+
<view class="search-icon">
|
|
143
|
+
<icon-font code="" size="40"></icon-font>
|
|
144
|
+
</view>
|
|
145
|
+
<view class="search-input">
|
|
146
|
+
<ste-input
|
|
147
|
+
type="text"
|
|
148
|
+
:fontSize="32"
|
|
149
|
+
:clearable="false"
|
|
150
|
+
background="#fff0"
|
|
151
|
+
@focus="focusStatus = true"
|
|
152
|
+
@blur="focusStatus = false"
|
|
153
|
+
:focus="focusStatus"
|
|
154
|
+
v-model="searchContent"
|
|
155
|
+
@input="searchText"
|
|
156
|
+
:placeholder="'搜索您收藏的' + computeText"
|
|
157
|
+
placeholderStyle="color:#999999"
|
|
158
|
+
confirmType="search"
|
|
159
|
+
@confirm="search"
|
|
160
|
+
></ste-input>
|
|
161
|
+
</view>
|
|
162
|
+
</view>
|
|
163
|
+
<view class="search-btn" @click="search"><text>搜索</text></view>
|
|
164
|
+
</view>
|
|
165
|
+
</ste-page-container>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
这个示例对应的期望:
|
|
169
|
+
|
|
170
|
+
- `right` 模式下容器不应默认 `100vh`
|
|
171
|
+
- 高度应以插槽内容高度或 `custom-style` 为准
|
|
172
|
+
- 右侧弹出不应有二次回弹
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 当前改动文件
|
|
177
|
+
|
|
178
|
+
本轮明确改动过:
|
|
179
|
+
|
|
180
|
+
- `uni_modules/stellar-ui/components/ste-page-container/ste-page-container.vue`
|
|
181
|
+
- `uni_modules/stellar-ui/components/ste-page-container/README.md`
|
|
182
|
+
|
|
183
|
+
注意:
|
|
184
|
+
|
|
185
|
+
- 当前仓库还有其他未提交改动,不一定和这次任务相关
|
|
186
|
+
- 本次没有对这些其他文件做处理
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 下次继续时的建议
|
|
191
|
+
|
|
192
|
+
推荐先做这个顺序,不要直接继续在当前代码上叠修。
|
|
193
|
+
|
|
194
|
+
### 方案建议
|
|
195
|
+
|
|
196
|
+
1. 先回到一个稳定版本
|
|
197
|
+
- 要么回退到“微信端单实例 + 非微信仍走 `ste-popup`”那版
|
|
198
|
+
- 要么在新分支/临时文件里重写非微信实现
|
|
199
|
+
|
|
200
|
+
2. 非微信 `right` 模式单独做最小实现
|
|
201
|
+
- 只先支持 `position="right"`
|
|
202
|
+
- 只做遮罩、面板、打开关闭
|
|
203
|
+
- 先验证 H5 / APP 安卓模拟器行为一致
|
|
204
|
+
|
|
205
|
+
3. 验证通过后再补 `top / bottom / center`
|
|
206
|
+
|
|
207
|
+
### 技术判断
|
|
208
|
+
|
|
209
|
+
更推荐:
|
|
210
|
+
|
|
211
|
+
- 不复用 `ste-popup`
|
|
212
|
+
- 但也不要继续在当前这版未稳定的自定义实现上直接补洞
|
|
213
|
+
- 最好重新做一个最小可验证实现
|
|
214
|
+
|
|
215
|
+
原因:
|
|
216
|
+
|
|
217
|
+
- 当前问题集中在 APP 端动画表现
|
|
218
|
+
- 先缩小能力面能更快定位平台差异
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## 给下次会话的提示词
|
|
223
|
+
|
|
224
|
+
下次可以直接这样开:
|
|
225
|
+
|
|
226
|
+
```text
|
|
227
|
+
先读 uni_modules/stellar-ui/components/ste-page-container/WORKLOG-2026-03-12.md,再继续处理 ste-page-container。当前目标是:保留微信小程序单实例原生 page-container,非微信平台重点修 right 模式,优先保证 APP 安卓模拟器无回弹,必要时重写非微信实现,但先恢复插槽内容正常显示。
|
|
228
|
+
```
|
|
229
|
+
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<!-- #ifdef MP-WEIXIN -->
|
|
3
|
+
<page-container
|
|
4
|
+
:show="show"
|
|
5
|
+
:duration="duration"
|
|
6
|
+
:z-index="zIndex"
|
|
7
|
+
:overlay="overlay"
|
|
8
|
+
:position="position"
|
|
9
|
+
:round="round"
|
|
10
|
+
:close-on-slide-down="closeOnSlideDown"
|
|
11
|
+
:overlay-style="overlayStyle"
|
|
12
|
+
:custom-style="customStyle"
|
|
13
|
+
:safe-area-inset-bottom="safeAreaInsetBottom"
|
|
14
|
+
@beforeenter="emitEvent('beforeenter', $event)"
|
|
15
|
+
@enter="emitEvent('enter', $event)"
|
|
16
|
+
@afterenter="emitEvent('afterenter', $event)"
|
|
17
|
+
@beforeleave="emitEvent('beforeleave', $event)"
|
|
18
|
+
@leave="emitEvent('leave', $event)"
|
|
19
|
+
@afterleave="emitEvent('afterleave', $event)"
|
|
20
|
+
@clickoverlay="onClickOverlay"
|
|
21
|
+
>
|
|
22
|
+
<slot></slot>
|
|
23
|
+
</page-container>
|
|
24
|
+
<!-- #endif -->
|
|
25
|
+
|
|
26
|
+
<!-- #ifndef MP-WEIXIN -->
|
|
27
|
+
<ste-popup
|
|
28
|
+
:show.sync="innerShow"
|
|
29
|
+
:duration="duration"
|
|
30
|
+
:zIndex="zIndex"
|
|
31
|
+
:showMask="overlay"
|
|
32
|
+
:position="popupPosition"
|
|
33
|
+
:width="popupWidth"
|
|
34
|
+
:height="popupHeight"
|
|
35
|
+
:round="round"
|
|
36
|
+
:isMaskClick="overlay"
|
|
37
|
+
:showClose="false"
|
|
38
|
+
@clickMask="onClickOverlay"
|
|
39
|
+
@open-after="onPopupOpenAfter"
|
|
40
|
+
>
|
|
41
|
+
<view class="ste-page-container-content" :class="{ 'safe-area-bottom': safeAreaInsetBottom && position === 'bottom' }" :style="customStyle">
|
|
42
|
+
<slot></slot>
|
|
43
|
+
</view>
|
|
44
|
+
</ste-popup>
|
|
45
|
+
<!-- #endif -->
|
|
46
|
+
</template>
|
|
47
|
+
|
|
48
|
+
<script>
|
|
49
|
+
/**
|
|
50
|
+
* ste-page-container 页面容器
|
|
51
|
+
* @description 微信小程序下使用原生 page-container,其他平台使用 ste-popup 兼容实现
|
|
52
|
+
* @property {Boolean} show 是否显示容器
|
|
53
|
+
* @property {Number} duration 动画时长,单位 ms
|
|
54
|
+
* @property {Number} zIndex 层级
|
|
55
|
+
* @property {Boolean} overlay 是否显示遮罩
|
|
56
|
+
* @property {String} position 弹出位置,top/bottom/right/center
|
|
57
|
+
* @property {Boolean} round 是否展示圆角
|
|
58
|
+
* @property {Boolean} closeOnSlideDown 是否允许下滑关闭(仅微信小程序)
|
|
59
|
+
* @property {String} overlayStyle 遮罩层样式(仅微信小程序)
|
|
60
|
+
* @property {String} customStyle 容器样式
|
|
61
|
+
* @property {Boolean} safeAreaInsetBottom 是否适配底部安全区
|
|
62
|
+
*/
|
|
63
|
+
export default {
|
|
64
|
+
group: '基础组件',
|
|
65
|
+
title: 'PageContainer 页面容器',
|
|
66
|
+
name: 'ste-page-container',
|
|
67
|
+
props: {
|
|
68
|
+
show: { type: Boolean, default: false },
|
|
69
|
+
duration: { type: Number, default: 300 },
|
|
70
|
+
zIndex: { type: [Number, String], default: 100 },
|
|
71
|
+
overlay: { type: Boolean, default: true },
|
|
72
|
+
position: {
|
|
73
|
+
type: String,
|
|
74
|
+
default: 'bottom',
|
|
75
|
+
validator(value) {
|
|
76
|
+
return ['top', 'bottom', 'right', 'center'].includes(value);
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
round: { type: Boolean, default: false },
|
|
80
|
+
closeOnSlideDown: { type: Boolean, default: false },
|
|
81
|
+
overlayStyle: { type: String, default: '' },
|
|
82
|
+
customStyle: { type: String, default: '' },
|
|
83
|
+
safeAreaInsetBottom: { type: Boolean, default: false },
|
|
84
|
+
},
|
|
85
|
+
data() {
|
|
86
|
+
return {
|
|
87
|
+
innerShow: this.show,
|
|
88
|
+
leaveTimer: null,
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
computed: {
|
|
92
|
+
popupPosition() {
|
|
93
|
+
if (['top', 'bottom', 'right', 'center'].includes(this.position)) {
|
|
94
|
+
return this.position;
|
|
95
|
+
}
|
|
96
|
+
return 'bottom';
|
|
97
|
+
},
|
|
98
|
+
popupWidth() {
|
|
99
|
+
const customWidth = this.getCustomStyleValue('width');
|
|
100
|
+
if (customWidth) return customWidth;
|
|
101
|
+
if (this.popupPosition === 'right') return '80vw';
|
|
102
|
+
return '100vw';
|
|
103
|
+
},
|
|
104
|
+
popupHeight() {
|
|
105
|
+
const customHeight = this.getCustomStyleValue('height');
|
|
106
|
+
if (customHeight) return customHeight;
|
|
107
|
+
return 'auto';
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
watch: {
|
|
111
|
+
show(newVal) {
|
|
112
|
+
// #ifndef MP-WEIXIN
|
|
113
|
+
if (this.innerShow !== newVal) {
|
|
114
|
+
this.innerShow = newVal;
|
|
115
|
+
}
|
|
116
|
+
this.triggerTransition(newVal);
|
|
117
|
+
// #endif
|
|
118
|
+
},
|
|
119
|
+
innerShow(newVal) {
|
|
120
|
+
// #ifndef MP-WEIXIN
|
|
121
|
+
if (newVal !== this.show) this.$emit('update:show', newVal);
|
|
122
|
+
// #endif
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
beforeDestroy() {
|
|
126
|
+
this.clearTimers();
|
|
127
|
+
},
|
|
128
|
+
created() {
|
|
129
|
+
// #ifndef MP-WEIXIN
|
|
130
|
+
if (this.show) this.triggerTransition(true);
|
|
131
|
+
// #endif
|
|
132
|
+
},
|
|
133
|
+
methods: {
|
|
134
|
+
getCustomStyleValue(property) {
|
|
135
|
+
if (!this.customStyle) return '';
|
|
136
|
+
const regexp = new RegExp(`(?:^|;)\\s*${property}\\s*:\\s*([^;]+)`, 'i');
|
|
137
|
+
const match = this.customStyle.match(regexp);
|
|
138
|
+
return match ? match[1].trim() : '';
|
|
139
|
+
},
|
|
140
|
+
emitEvent(eventName, e) {
|
|
141
|
+
this.$emit(eventName, e);
|
|
142
|
+
},
|
|
143
|
+
onClickOverlay(e) {
|
|
144
|
+
this.$emit('clickoverlay', e);
|
|
145
|
+
},
|
|
146
|
+
onPopupOpenAfter(e) {
|
|
147
|
+
this.$emit('afterenter', e);
|
|
148
|
+
},
|
|
149
|
+
open() {
|
|
150
|
+
this.$emit('update:show', true);
|
|
151
|
+
},
|
|
152
|
+
close() {
|
|
153
|
+
this.$emit('update:show', false);
|
|
154
|
+
},
|
|
155
|
+
clearTimers() {
|
|
156
|
+
if (this.leaveTimer) {
|
|
157
|
+
clearTimeout(this.leaveTimer);
|
|
158
|
+
this.leaveTimer = null;
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
triggerTransition(show) {
|
|
162
|
+
this.clearTimers();
|
|
163
|
+
if (show) {
|
|
164
|
+
this.$emit('beforeenter');
|
|
165
|
+
this.$emit('enter');
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
this.$emit('beforeleave');
|
|
169
|
+
this.$emit('leave');
|
|
170
|
+
this.leaveTimer = setTimeout(() => {
|
|
171
|
+
this.$emit('afterleave');
|
|
172
|
+
this.leaveTimer = null;
|
|
173
|
+
}, this.duration);
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
</script>
|
|
178
|
+
|
|
179
|
+
<style lang="scss" scoped>
|
|
180
|
+
.ste-page-container-content {
|
|
181
|
+
width: 100%;
|
|
182
|
+
height: 100%;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.safe-area-bottom {
|
|
186
|
+
padding-bottom: constant(safe-area-inset-bottom);
|
|
187
|
+
padding-bottom: env(safe-area-inset-bottom);
|
|
188
|
+
box-sizing: border-box;
|
|
189
|
+
}
|
|
190
|
+
</style>
|
|
@@ -53,6 +53,7 @@ export default {
|
|
|
53
53
|
data() {
|
|
54
54
|
return {
|
|
55
55
|
elId: utils.guid(),
|
|
56
|
+
contentObserver: null,
|
|
56
57
|
};
|
|
57
58
|
},
|
|
58
59
|
computed: {
|
|
@@ -115,7 +116,7 @@ export default {
|
|
|
115
116
|
},
|
|
116
117
|
},
|
|
117
118
|
destroyed() {
|
|
118
|
-
this.disconnectObserver();
|
|
119
|
+
this.disconnectObserver('contentObserver');
|
|
119
120
|
},
|
|
120
121
|
};
|
|
121
122
|
</script>
|