Skip to content

Commit e4f9853

Browse files
authored
Merge branch 'master' into fix-error-location
2 parents 0f4896d + 33992dd commit e4f9853

Some content is hidden

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

51 files changed

+1209
-324
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: 123 additions & 5 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
@@ -2639,3 +2683,77 @@ module.exports = defineConfig({
26392683
})
26402684
</script>
26412685
```
2686+
2687+
2688+
#### 分享
2689+
2690+
##### mpx.config.rnConfig.openTypeHandler.onShareAppMessage
2691+
2692+
当使用 [button 组件](./rn.html#button) 并指定 `open-type="share"` 时,将触发分享。在 RN 中是分享实现需由容器实现,可在 onShareAppMessage 中完成分享逻辑实现。
2693+
2694+
其参数为当前页面的 onShareAppMessage 钩子返回内容,如果返回返回内容中包含 promise,将会在 fulfilled 后将其结果合并再触发 onShareAppMessage
2695+
2696+
`(shareInfo: { title: string, path: string, imageUrl?: string }) => void`
2697+
2698+
2699+
2700+
#### 路由
2701+
2702+
2703+
**mpx.config.rnConfig.parseAppProps**
2704+
2705+
`(props: Record<string, any>) => ({ initialRouteName: string, initialParams: Record<string, any> }| void)`
2706+
2707+
用于获取初始路由配置的函数,参数为RN根组件接收到的参数
2708+
2709+
+ initialRouteName: 首页路径,例如 pages/index
2710+
2711+
+ initialParams: 首页onLoad参数,例如 \{ a: 1 \}
2712+
2713+
2714+
2715+
2716+
2717+
2718+
**mpx.config.rnConfig.onStateChange**
2719+
2720+
`(state: Record<string, any>) => void`
2721+
2722+
当导航状态发生变化时触发,例如页面跳转、返回等。可在此回调中将 ReactNative 路径栈同步到容器中。
2723+
2724+
2725+
2726+
##### mpx.config.rnConfig.onAppBack
2727+
2728+
`() => boolean`
2729+
2730+
页面栈长度为 1(即根页面)且用户尝试退出 App 时触发。
2731+
2732+
+ true:允许退出应用
2733+
2734+
+ false:阻止退出应用
2735+
2736+
2737+
##### mpx.config.rnConfig.onStackTopBack
2738+
2739+
控制首页回退按钮是否展示,并监听点击事件。
2740+
2741+
如果绑定该函数,则首页显示返回按钮,点击后调用该函数作为回调,如果未绑定该函数,则首页不会展示返回按钮。
2742+
2743+
如需实现点击返回,请在函数内部手动调用 back。
2744+
2745+
2746+
2747+
#### 折叠屏适配
2748+
2749+
2750+
##### mpx.config.rnConfig.customDimensions
2751+
2752+
`(dimensions: { window: ScaledSize; screen: ScaledSize }) => { window: ScaledSize; screen: ScaledSize } | void`
2753+
2754+
在某些情况下,我们可能不希望当前 ReactNative 全屏展示,Mpx 内部基于 ScreenWidth 与 ScreenHeight 作为 rpx、vh、vw、媒体查询、onResize等特性的依赖内容,此时可在 `mpx.config.rnConfig.customDimensions` 中自定义 screen 信息来得到想要的渲染效果。
2755+
2756+
可在此方法中返回修改后的 dimensions,如果无返回或返回undefined,则以入参作为返回值
2757+
2758+
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.7"
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.7",
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.6",
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,

0 commit comments

Comments
 (0)