Skip to content

Commit 59445d7

Browse files
authored
Merge branch 'master' into feat-preview-image-add-current
2 parents 465cd1b + 33992dd commit 59445d7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+909
-269
lines changed

docs-vitepress/api/app-config.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ mpx.config.webRouteConfig = {
158158
```
159159

160160
## webConfig
161-
web 环境下的一些配置,如路由模式,页面切换动画效果等
161+
web 环境下的一些配置,如路由模式
162162

163163
- **用法**:
164164
```js
@@ -169,3 +169,4 @@ mpx.config.webConfig.routeConfig = {
169169
// 禁用页面切换动画
170170
mpx.config.webConfig.disablePageTransition = true
171171
```
172+
此处的 `disablePageTransition` 后续将被废弃,请使用编译阶段的[disablePageTransition](./compile.md#webconfig)进行配置

docs-vitepress/api/compile.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -824,8 +824,17 @@ module.exports = defineConfig({
824824

825825
transRpxFn 配置用于自定义输出 web 时对于 rpx 样式单位的转换逻辑,常见的方式有转换为 vw 或转换为 rem
826826

827+
`{useSSR: boolean}`
828+
829+
useSSR 默认值为 `false`,当 SSR 模式下使用异步分包时,需要将 useSSR 设置为 `true`, 其他场景不需要。
830+
831+
`{disablePageTransition: boolean}`
832+
833+
用于配置禁用/开启页面切换动画,默认禁用
834+
835+
827836
```js
828-
// vue.config.js
837+
// mpx.config.js
829838
module.exports = defineConfig({
830839
pluginOptions: {
831840
mpx: {
@@ -834,7 +843,11 @@ module.exports = defineConfig({
834843
transRpxFn: function (match, $1) {
835844
if ($1 === '0') return $1
836845
return `${$1 * +(100 / 750).toFixed(8)}vw`
837-
}
846+
},
847+
// 当 SSR 模式下使用异步分包时
848+
useSSR: true,
849+
// 开启页面切换动画
850+
disablePageTransition: false
838851
}
839852
}
840853
}

docs-vitepress/guide/advance/platform.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ onShow|是
630630
onHide|是
631631
onUnload|是
632632
onError|是
633-
onServerPrefetch
633+
onServerPrefetch|
634634
created|是
635635
attached|是
636636
ready|是

docs-vitepress/guide/platform/rn.md

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ RN:
183183
> 1. 只有父级 view 节点的文本样式可以被子 text 节点继承;
184184
> 2. view 节点直接包裹文本实际上等同于 view>text>文本,Mpx 框架在编译时若检测到 view 节点直接包裹文本会自动添加一层 text 节点;
185185
> 3. 多级 text 节点可实现文本样式的继承,比如 text>text>文本 ;
186-
> 4. 若不想使用 Mpx 内部实现的 view>text>文本 这种文本样式继承,可设置`disable-default-style=true` 来关闭该继承逻辑;
187186
### 简写样式属性
188187
在 Mpx 内对于通过 class 类来定义的样式会按照 RN 的样式规则在编译处理一遍,其中最重要的一部分就是将 RN 不支持简写属性按约定的规则转换成 RN 能支持多属性结构。
189188

@@ -682,7 +681,7 @@ Mpx 输出 React Native 支持以下模版指令。
682681
注意事项
683682

684683
1. 目前不支持自定义下拉刷新节点,使用 slot="refresher" 声明无效,在 React Native 环境中还是会被当作普通节点渲染出来
685-
2. 若使用 scroll-into-view 属性,需要 id 对应的组件节点添加 wx:ref 标记,否则无法正常滚动
684+
2. 若使用 scroll-into-view 属性,需要 id 对应的组件节点添加 wx:ref 标记,否则无法正常滚动。另外组件节点需要是内置基础组件,自定义组件暂不支持。
686685
3. simultaneous-handlers 为 RN 环境特有属性,具体含义可参考[react-native-gesture-handler](https://docs.swmansion.com/react-native-gesture-handler/docs/fundamentals/gesture-composition/#simultaneouswithexternalgesture)
687686
4. wait-for 为 RN 环境特有属性,具体含义可参考[react-native-gesture-handler](https://docs.swmansion.com/react-native-gesture-handler/docs/fundamentals/gesture-composition/#requireexternalgesturetofail)
688687

@@ -707,7 +706,9 @@ Mpx 输出 React Native 支持以下模版指令。
707706
| next-margin | String | `0` | 后边距,可用于露出后一项的一小部分,接受px |
708707
| scale | Boolean | `false` | 滑动时是否开启前后元素缩小,默认是缩放0.7倍, 暂不支持自定义 |
709708
| easing-function | String | `linear` | 支持 linear、easeInCubic、easeOutCubic、easeInOutCubic|
710-
| bindchange | eventhandle|| current 改变时会触发 change 事件,`event.detail = {current, source}`|
709+
| simultaneous-handlers | `Array<object>`| [] | RN环境特有属性,主要用于组件嵌套场景,允许多个手势同时识别和处理并触发,这个属性可以指定一个或多个手势处理器,处理器支持使用 this.$refs.xxx 获取组件实例来作为数组参数传递给 swiper 组件|
710+
| wait-for | `Array<object>`| [] | RN环境特有属性,主要用于组件嵌套场景,允许延迟激活处理某些手势,这个属性可以指定一个或多个手势处理器,处理器支持使用 this.$refs.xxx 获取组件实例来作为数组参数传递给 swiper 组件|
711+
| disableGesture | Boolean| false | 禁用 swiper 滑动手势。若开启用户无法通过手势滑动 swiper,只能通过开启 autoPlay 进行自动轮播|
711712

712713

713714

@@ -979,6 +980,34 @@ movable-view的可移动区域。
979980
| bindlinechange | 输入框行数变化时调用,`event.detail = { height: 0, lineCount: 0 }`,不支持 `heightRpx` |
980981
| bind:selectionchange | 选区改变事件, `event.detail = {selectionStart, selectionEnd}` |
981982

983+
#### progress
984+
进度条。
985+
986+
属性
987+
988+
| 属性名 | 类型 | 默认值 | 说明 |
989+
| ----------------------- | ------- | ------------- | ---------------------------------------------------------- |
990+
| percent | Number | `0` | 百分比进度,范围0-100 |
991+
| stroke-width | Number\|String | `6` | 进度条线的宽度,单位px |
992+
| color | String | | 进度条颜色(已废弃,请使用 activeColor) |
993+
| activeColor | String | `#09BB07` | 已选择的进度条的颜色 |
994+
| backgroundColor | String | `#EBEBEB` | 未选择的进度条的颜色 |
995+
| active | Boolean | `false` | 进度条从左往右的动画 |
996+
| active-mode | String | `backwards` | 动画播放模式,`backwards`: 从头开始播放;`forwards`: 从上次结束点接着播放 |
997+
| duration | Number | `30` | 进度增加1%所需毫秒数 |
998+
999+
事件
1000+
1001+
| 事件名 | 说明 |
1002+
| ----------------| --------------------------------------------------- |
1003+
| bindactiveend | 动画完成时触发,`event.detail = { percent }` |
1004+
1005+
注意事项
1006+
1007+
1. 不支持 `show-info` 属性,即不支持在进度条右侧显示百分比
1008+
2. 不支持 `border-radius` 属性自定义圆角大小
1009+
3. 不支持 `font-size` 属性设置右侧百分比字体大小
1010+
9821011
#### picker-view
9831012

9841013
嵌入页面的滚动选择器。其中只可放置 [*picker-view-column*](#picker-view-column) 组件,其它节点不会显示
@@ -1001,11 +1030,11 @@ movable-view的可移动区域。
10011030

10021031
- 触感反馈回调方法
10031032

1004-
通过在全局注册 `mpx.config.rnConfig.pickerVibrate` 方法,在每次滚动选择时会调用该方法。
1033+
通过在全局注册 `mpx.config.rnConfig.onPickerVibrate` 方法,在每次滚动选择时会调用该方法。
10051034

10061035
| 注册触感方法名 | 类型 | 说明 |
10071036
| ----------------------| --------------| ------------------- |
1008-
| pickerVibrate | Function | 注册自定义触感反馈方法。调用时机:在每次滚动选择时会调用该方法。可以在方法内自定义实现类似 iOS 端原生表盘的振动触感。 |
1037+
| onPickerVibrate | Function | 注册自定义触感反馈方法。调用时机:在每次滚动选择时会调用该方法。可以在方法内自定义实现类似 iOS 端原生表盘的振动触感。 |
10091038

10101039
#### picker-view-column
10111040

@@ -2590,6 +2619,21 @@ mpx.config.rnConfig.downloadChunkAsync = function (packages) {
25902619
}
25912620
```
25922621

2622+
针对异步分包加载异常的场景:
2623+
2624+
* 异步组件加载失败:微信小程序提供了 [`wx.onLazyLoadError`](https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onLazyLoadError.html) 的全局 api 来监听异步组件加载失败,这个 api 同样在Mpx转RN场景下生效;
2625+
* 异步页面加载失败:微信小程序未提供相关的监听异常的 api,Mpx转RN提供了一个额外的全局监听函数:
2626+
2627+
```javascript
2628+
// RN 场景下监听异步页面加载失败的全局配置
2629+
mpx.config.rnConfig.onLazyLoadPageError = function (error) {
2630+
console.log(
2631+
error.subpackage, // 加载失败的分包名
2632+
error.errType // 加载失败的类型:'timeout' | 'fail'
2633+
)
2634+
}
2635+
```
2636+
25932637
此外针对Mpx转RN的场景,还提供了一些异步分包的配置选项:
25942638

25952639
```javascript
@@ -2650,7 +2694,7 @@ module.exports = defineConfig({
26502694
其参数为当前页面的 onShareAppMessage 钩子返回内容,如果返回返回内容中包含 promise,将会在 fulfilled 后将其结果合并再触发 onShareAppMessage
26512695

26522696
`(shareInfo: { title: string, path: string, imageUrl?: string }) => void`
2653-
2697+
26542698

26552699

26562700
#### 路由
@@ -2712,4 +2756,4 @@ module.exports = defineConfig({
27122756
可在此方法中返回修改后的 dimensions,如果无返回或返回undefined,则以入参作为返回值
27132757

27142758

2715-
例如在折叠屏中我们期望只在其中一半屏上展示,可在customDimensions中判断当前是否为折叠屏展开状态,如果是则将 ScreenWidth 设置为原来的一半。
2759+
例如在折叠屏中我们期望只在其中一半屏上展示,可在customDimensions中判断当前是否为折叠屏展开状态,如果是则将 ScreenWidth 设置为原来的一半。

lerna.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"version": "2.10.12"
2+
"version": "2.10.14"
33
}

packages/api-proxy/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@mpxjs/api-proxy",
3-
"version": "2.10.8",
3+
"version": "2.10.13",
44
"description": "convert miniprogram API at each end",
55
"module": "src/index.js",
66
"types": "@types/index.d.ts",
@@ -37,7 +37,7 @@
3737
},
3838
"homepage": "https://github.com/didi/mpx#readme",
3939
"dependencies": {
40-
"@mpxjs/utils": "^2.10.8",
40+
"@mpxjs/utils": "^2.10.13",
4141
"axios": "^1.7.3"
4242
},
4343
"peerDependencies": {

packages/api-proxy/src/platform/api/create-selector-query/rnNodesRef.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,11 @@ const wrapFn = (fn) => {
4141
const getMeasureProps = (measureProps = []) => {
4242
return wrapFn((nodeInstance, resolve) => {
4343
const nodeRef = nodeInstance.nodeRef.current
44-
const navigation = getFocusedNavigation()
44+
const navigation = getFocusedNavigation() || {}
4545
setTimeout(() => {
4646
nodeRef.measure(function (x, y, width, height, pageX, pageY) {
47-
pageY = pageY - navigation.layout.top
47+
const layout = navigation.layout || {}
48+
pageY = pageY - (layout.top || 0)
4849
const rectAndSize = {
4950
width,
5051
height,

packages/core/@types/index.d.ts

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,11 @@ interface Context {
121121
createSelectorQuery: WechatMiniprogram.Component.InstanceMethods<Record<string, any>>['createSelectorQuery']
122122
createIntersectionObserver: WechatMiniprogram.Component.InstanceMethods<Record<string, any>>['createIntersectionObserver'],
123123
getPageId: WechatMiniprogram.Component.InstanceMethods<Record<string, any>>['getPageId']
124+
getOpenerEventChannel: WechatMiniprogram.Component.InstanceMethods<Record<string, any>>['getOpenerEventChannel']
124125
}
125126
type ExtendedComponentOptions = {
126-
disconnectOnUnmounted: boolean
127-
shallowReactivePattern: RegExp
127+
disconnectOnUnmounted?: boolean
128+
shallowReactivePattern?: RegExp
128129
} & WechatMiniprogram.Component.ComponentOptions
129130

130131
interface ComponentOpt<D extends Data, P extends Properties, C, M extends Methods, Mi extends Array<any>, S extends Record<any, any>> extends Partial<WechatMiniprogram.Component.Lifetimes & WechatMiniprogram.Component.OtherOption> {
@@ -274,7 +275,7 @@ export interface RnConfig {
274275
*
275276
* @param state 当前的导航状态对象
276277
*/
277-
onStateChange?: (state: Record<string, any>) => void;
278+
onStateChange?: (state: Record<string, any>) => void
278279

279280
/**
280281
* 用于获取初始路由配置的函数。
@@ -286,7 +287,7 @@ export interface RnConfig {
286287
*/
287288
parseAppProps?: (
288289
props: Record<string, any>
289-
) => { initialRouteName?: string; initialParams?: any } | void;
290+
) => { initialRouteName?: string; initialParams?: any } | void
290291

291292
/**
292293
* 页面栈长度为 1(即根页面)且用户尝试退出 App 时触发。
@@ -295,20 +296,20 @@ export interface RnConfig {
295296
* - `true`:允许退出应用
296297
* - `false`:阻止退出应用
297298
*/
298-
onAppBack?: () => boolean;
299+
onAppBack?: () => boolean
299300

300301
/**
301302
* 是否禁用框架内部的 AppStateChange 监听。
302303
*/
303-
disableAppStateListener?: boolean;
304+
disableAppStateListener?: boolean
304305

305306
/**
306307
* 控制首页回退按钮是否展示,并监听点击事件。
307308
*
308309
* 如果绑定该函数,则首页显示返回按钮,点击后调用该函数作为回调。
309310
* 如需返回,请在函数内部手动调用 `back()`。
310311
*/
311-
onStackTopBack?: () => void;
312+
onStackTopBack?: () => void
312313

313314
/**
314315
* 容器实现的 open-type 能力集合。
@@ -324,16 +325,26 @@ export interface RnConfig {
324325
* @returns `void`
325326
*/
326327
onShareAppMessage?: (shareInfo: {
327-
title: string;
328-
path: string;
329-
imageUrl?: string;
330-
}) => void;
331-
};
328+
title: string
329+
path: string
330+
imageUrl?: string
331+
}) => void
332+
}
332333

333334
/**
334335
* 在使用 picker-view-column 时,触发短震动反馈。
335336
*/
336-
pickerVibrate?: () => void;
337+
onPickerVibrate?: () => void
338+
339+
/**
340+
* 分包页面加载失败时触发
341+
* @param subpackage 失败分包名
342+
* @param errType 失败类型
343+
*/
344+
onLazyLoadPageError?: (error: {
345+
subpackage: string
346+
errType: 'timeout' | 'fail'
347+
}) => void
337348

338349
/**
339350
* 自定义屏幕尺寸信息,用于 mpx style 渲染等依赖尺寸的功能。
@@ -343,7 +354,7 @@ export interface RnConfig {
343354
*/
344355
customDimensions?: <T extends { window: ScaledSize; screen: ScaledSize }>(
345356
dimensions: T
346-
) => T | void;
357+
) => T | void
347358

348359
/**
349360
* 异步分包加载配置。
@@ -352,18 +363,18 @@ export interface RnConfig {
352363
/**
353364
* 加载超时时长配置,单位为毫秒。
354365
*/
355-
timeout: number;
366+
timeout: number
356367

357368
/**
358369
* 异步分包页面加载超时或失败时,自定义兜底页面文件路径。
359370
*/
360-
fallback: string;
371+
fallback: string
361372

362373
/**
363374
* 异步分包页面加载时,自定义 loading 页面文件路径。
364375
*/
365-
loading: string;
366-
};
376+
loading: string
377+
}
367378

368379
/**
369380
* 加载并执行异步分包的方法。
@@ -373,14 +384,14 @@ export interface RnConfig {
373384
* @param params.package 分包名
374385
* @returns Promise,表示加载完成
375386
*/
376-
loadChunkAsync?: (params: { url: string; package: string }) => Promise<any>;
387+
loadChunkAsync?: (params: { url: string; package: string }) => Promise<any>
377388

378389
/**
379390
* 下载多个异步分包的方法(不执行)。
380391
*
381392
* @param packages 分包名数组
382393
*/
383-
downloadChunkAsync?: (packages: Array<string>) => void;
394+
downloadChunkAsync?: (packages: Array<string>) => void
384395
}
385396

386397
interface MpxConfig {

packages/core/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@mpxjs/core",
3-
"version": "2.10.12",
3+
"version": "2.10.13",
44
"description": "mpx runtime core",
55
"keywords": [
66
"miniprogram",
@@ -19,7 +19,7 @@
1919
],
2020
"main": "src/index.js",
2121
"dependencies": {
22-
"@mpxjs/utils": "^2.10.8",
22+
"@mpxjs/utils": "^2.10.13",
2323
"lodash": "^4.1.1",
2424
"miniprogram-api-typings": "^3.10.0"
2525
},

packages/core/src/core/proxy.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,8 @@ export default class MpxProxy {
334334
selectAllComponents: this.target.selectAllComponents.bind(this.target),
335335
createSelectorQuery: this.target.createSelectorQuery ? this.target.createSelectorQuery.bind(this.target) : envObj.createSelectorQuery.bind(envObj),
336336
createIntersectionObserver: this.target.createIntersectionObserver ? this.target.createIntersectionObserver.bind(this.target) : envObj.createIntersectionObserver.bind(envObj),
337-
getPageId: this.target.getPageId.bind(this.target)
337+
getPageId: this.target.getPageId.bind(this.target),
338+
getOpenerEventChannel: this.target.getOpenerEventChannel.bind(this.target)
338339
}
339340
])
340341
if (!isObject(setupResult)) {
@@ -501,11 +502,19 @@ export default class MpxProxy {
501502
const hooks = this.hooks[hookName] || []
502503
let result
503504
if (isFunction(hook) && !hooksOnly) {
505+
const setContext = hookName !== BEFORECREATE
506+
if (setContext) {
507+
setCurrentInstance(this)
508+
}
504509
result = callWithErrorHandling(hook.bind(this.target), this, `${hookName} hook`, params)
510+
if (setContext) {
511+
unsetCurrentInstance()
512+
}
505513
}
506514
hooks.forEach((hook) => {
507515
result = params ? hook(...params) : hook()
508516
})
517+
509518
return result
510519
}
511520

0 commit comments

Comments
 (0)