Skip to content

跨端输出RN

跨端样式定义

RN 样式属性和 Web/小程序中 CSS 样式属性是相交关系,RN 有一小部分样式属性(比如 tintColor、writingDirection 等等) CSS 不支持,CSS 也有少部分样式属性 RN 不支持(比如 clip-path、animation、transition 等等)。

因此,一方面,在我们进行跨平台开发时,跨平台样式属性声明要尽量使用两边样式属性的交集;另一方面为了减少开发适配的成本,Mpx 内部也对 RN 的样式作了部分抹平。

Mpx 框架在样式处理部分的具体工作主要分为两大类有:

编译时的class类样式转化

  • 属性名转驼峰
  • 单位的校验和对齐
  • 过滤 RN 不支持的属性和属性值
  • 简写转换
  • 样式属性差异转换和拉齐

运行时的style样式处理

  • 属性名转驼峰
  • 单位的计算和处理
  • 100% 计算
  • css func 处理,包括 env()、calc()、var()

CSS选择器

RN 环境下仅支持单个类选择器,不支持类名组合选择器,不过逗号组合的选择器本质上还是单类选择器,是可以支持的。

css
/* 支持 */
.classname {
  color: red
}
.classA, .classB {
  color: red
}
/* 不支持 */
view, text {
  color: red
}
.classA .classB {
  color: red
}

样式单位

Mpx转RN, 支持以下单位,部分单位在部分情况下存在使用限制

数值类型单位说明

单位支持情况特殊说明
%支持百分比单位参考下面说明
px支持
rpx支持rpx会根据屏幕宽度动态计算成实际的px
vh支持屏幕的高度,在使用非自定义导航时,页面初次渲染计算出来的vh是屏幕高度,后续更新渲染使用实际可视区域高度,推荐使用此单位的页面使用自定义导航
vw支持

百分比单位说明

RN很多原生较多属性不支持百分比,比如font-size、translate等,但是这些属性在编写web、小程序代码的过程中使用较多,框架进行了抹平支持。以下这些属性在Mpx输出RN时专门进行了百分比单位的适配,部分属性存在编写的时候的特殊适配。

特殊的百分比计算规则
font-size

font-size 百分比计算依赖开发者传入的 parent-font-size 属性,框架将根据开发者传入 parent-font-size 的值来计算 font-size 的百分比大小

备注:当 font-size 设置为百分比,未设置 parent-font-size 属性或者 parent-font-size 属性值非数值,会报错提示开发者且框架不计算 font-size 直接返回

line-height

和 Web/小程序类似,当设置 line-height: 1.2; line-height: 120%; 这种 number 或百分比值时,实际都是按百分比来计算。line-height 的百分比计算基准是 font-size 的大小,所以在设置 line-height 为 number 或者百分比值时,要保证同时有设置 font-size 大小。

备注:设置 line-height 注意区分有无单位,line-height: 12 会按照 line-height: 1200% 来计算处理,line-height: 12px 会按照正常单位计算。

根据自身宽高计算百分比

translateX/translateY/border-radius 的百分比都是根据自身宽高的来计算的。

注意事项

  • RN 0.76 版本 translateX/translateY 支持百分比
  • translateX/border-radius 都是根据节点的 width 来计算百分比,而 translateY 是根据节点的 height 来计算的百分比
  • border-radius-*(top/right/bottom/left) 百分比计算逻辑和 border-radius 一致
  • 根据自身宽高计算百分比需要在完成渲染后在 onLayout 获取自身宽高计算并设置,故这些属性设置生效都在第一次 onLayout 后
  • 因动画执行不会触发 onLayout,所以最好不要在动画中使用这些属性的百分比
根据父节点宽高计算百分比

除了上述两中规则外,属性 width/left/right/height/top/bottom/margin/padding 等设置百分比时的计算基准都是父节点的宽高,且 RN 支持设置百分比,无需框架额外处理。

有一种情况例外,则是在上述属性值中设置为 calc 函数且表达式使用百分比,如 width: calc(100% - 10px)。

calc() 函数内的百分比使用方式

如有在 calc 函数表达式内使用百分比的场景,则需要开发者设置 parent-width 或 parent-height 属性,传入百分比计算的基准值。

以父节点高度为基准值计算百分比的属性如 height/top/bottom 则需要传入 parent-height 属性;以父节点宽度为基准值计算百分比的属性如 width/left/right 则需要传入 parent-width 属性。

备注:属性通过父节点宽度还是高度来计算基准,一般遵循纵向以高度为基准,横向以宽度为基准的大原则

色值 color 类型支持的值格式说明

  • hex-color(十六进制)
  • rgb/rgba
  • hsl/hsla
  • hwb
  • named color,具体参考颜色枚举值
  • Color ints(仅 RN 支持,如 0xff00ff00 )
css
/* <named-color> 值 */
color: red;
color: orange;
color: tan;
color: rebeccapurple;

/* <hex-color> 值 */
color: #090;
color: #009900;
color: #090a;
color: #009900aa;

/* <rgb()> 值 */
color: rgb(34, 12, 64, 0.6);
color: rgba(34, 12, 64, 0.6);
color: rgb(34 12 64 / 0.6);
color: rgba(34 12 64 / 0.3);
color: rgb(34 12 64 / 60%);
color: rgba(34.6 12 64 / 30%);

/* <hsl()> 值 */
color: hsl(30, 100%, 50%, 0.6);
color: hsla(30, 100%, 50%, 0.6);
color: hsl(30 100% 50% / 0.6);
color: hsla(30 100% 50% / 0.6);
color: hsl(30 100% 50% / 60%);
color: hsla(30.2 100% 50% / 60%);

/* <hwb()> 值 */
color: hwb(90 10% 10%);
color: hwb(90 10% 10% / 0.5);
color: hwb(90deg 10% 10%);
color: hwb(1.5708rad 60% 0%);
color: hwb(0.25turn 0% 40% / 50%);

文本样式继承

Web/小程序中,文本节点可以通过 div/view 节点进行直接包裹,在 div/view 节点上也可以直接设定对应文本样式。 但是在RN中,必须通过 Text 来创建文本节点,文本样式属性只有设置给 Text 节点才能生效。 Mpx 框架抹平了这部分的差异,在使用 Mpx 转 RN 时,我们可以使用 view 节点直接包裹文本,也可以在 view 节点上设置文本样式作用到直接子 text 节点上。 但仍因受限于RN内 text 的样式继承原则的限制,只有 view 节点下的子 text 节点可以继承 view 节点上的文本样式,且 text 节点之间可以继承。 具体参考以下代码:

示例代码

html
<!-- 示例1 -->
<view class="wrapper">
   文本1
   <text class="content">文本2</text>
   <text class="content"><text>文本3<text/></text>
   <view class="content">文本4</view>
   <view class="content"><view>文本5</view></view>
</view>

.wrapper {
    font-size: 20px;
}
.content {
    text-align: right;
}
<!-- 
小程序&web: 
- 文本1-6 均为字体大小20px,文字居右
RN: 
- 文本1 字体大小20px
- 文本2 字体大小20px,文字居右
- 文本3 字体大小20px,文字居右
- 文本4 文字居右
- 文本5 字体&居中未生效
-->

备注

  1. 只有父级 view 节点的文本样式可以被子 text 节点继承;
  2. view 节点直接包裹文本实际上等同于 view>text>文本,Mpx 框架在编译时若检测到 view 节点直接包裹文本会自动添加一层 text 节点;
  3. 多级 text 节点可实现文本样式的继承,比如 text>text>文本 ;
  4. 若不想使用 Mpx 内部实现的 view>text>文本 这种文本样式继承,可设置disable-default-style=true 来关闭该继承逻辑;

简写样式属性

在 Mpx 内对于通过 class 类来定义的样式会按照 RN 的样式规则在编译处理一遍,其中最重要的一部分就是将 RN 不支持简写属性按约定的规则转换成 RN 能支持多属性结构。

现已支持的简写属性如下:

注意事项

  • 考虑到运行时转化的性能开销问题,简写能力只在编译处理时转化,所以 class 类上设置时简写属性会处理转化的,而在 style 属性上使用了对应的简写是不会转化的,若对应的简写属性 RN 不支持,则在 RN style 属性上不能使用,需直接使用多个属性组合来实现。
  • 简写属性不支持 单个 var() 函数,所以简写属性传入单个 var() 编译时会有错误提示,并且原样返回,这可能会导致 RN 运行时错误。
  • 若是多个 var() 函数则会按顺序赋给各个属性

CSS函数

在介绍 CSS 函数前我们先来了解一下自定义属性的概念。

自定义属性(CSS 变量)

自定义属性(有时候也被称作 CSS 变量或者级联变量),带有前缀 -- 的属性名,表示的是带有值的自定义属性,比如 --example--name。

通常与 var() 一起使用,由自定义属性标记设定值(带有前缀 -- 的属性名,比如: --main-color: black;),由 var() 函数来获取值(比如: color: var(--main-color);)

备注

  • 自定义属性受级联的约束,并从其父级继承其值
  • 自定义属性名区分大小写

var()

var() 函数可以插入一个自定义属性(有时也被称为“CSS 变量”)的值,用来代替属性值部分。

var(<custom-property-name> , <declaration-value>? ):函数的第一个参数是要替换的自定义属性的名称。函数的第二个参数是可选的,用作回退值。如果第一个参数引用的自定义属性无效,则该函数将使用第二个值。

备注

  • 自定义属性的回退值允许使用逗号。例如,var(--foo, red, blue) 将 red, blue 同时指定为回退值(在第一个逗号之后到函数结尾前的值都会被认为是回退值)
  • var() 函数不能作为属性名、选择器或者其他除了属性值之外的值
vue
<!-- 代码示意 -->
<template>
  <view class="component">
    <view class="header">Header</view>
    <view class="content">Content</view>
    <view class="footer">Footer</view>
  </view>
</template>

<style>
  .component {
    --content-color: #b58df1;
    --header-color: pink;
  }
  .component .header {
    background-color: var(--header-color, blue);
  }
  .component .text {
    background-color: var(--content-color, black);
  }
  .component .footer {
    background-color: var(--footer-color, black);
  }
</style>
<!-- 实际效果 -->
<!-- Header 背景色是 #b58df1 -->
<!-- Content 背景色是 pink -->
<!-- Footer 背景色是 black(--footer-color 未定义,回退值生效) -->

calc()

calc() 函数允许在声明 CSS 属性值时执行一些计算。

calc() 函数用一个表达式作为它的参数,用这个表达式的结果作为值。

这个表达式采用标准操作符处理法则的简单表达式,支持加减乘除 ,乘法计算需要乘数中至少有一个是 number,除法计算要求除数(/右面的数)必须是 number。

备注

  • + 和 - 运算符的两边必须要有空白字符,* 和 / 这两个运算符前后不需要空白字符,但如果考虑到统一性,仍然推荐加上空白符。
  • 能数值化的单位都支持 calc() 函数
  • 百分比的计算逻辑详见样式单位部分的百分比单位说明
css
/* 代码示意 */

/* property: calc(expression) */
.test {
    width: calc(100% - 80px);
}

/* 使用 CSS 变量嵌套使用 calc() */
.foo {
    --widthA: 100px;
    --widthB: calc(var(--widthA) / 2);
    --widthC: calc(var(--widthB) / 2);
    width: var(--widthC);
}

.demo {
    font-size: calc(1.5rem + 3vw);
}

env()

env() 用于将定义的环境变量的值插入到 CSS 中。

第一个参数为系统环境变量,具体可选值有 safe-area-inset-top、safe-area-inset-right、safe-area-inset-bottom、safe-area-inset-left,分别定义了视口上右下左各边缘的安全距离。

第二个可选参数是环境变量不可用时的回退值。

env() 函数通过和 var() 函数类似形式, 区别在于:一是环境变量是系统定义的,而 var() 函数是开发者自定义;二是环境变量是全局生效,而 var() 函数的自定义属性不能在声明之外使用。

css
/* 代码示意 */
.demo {
  padding: env(safe-area-inset-top, 20px) env(safe-area-inset-right, 20px) env(safe-area-inset-bottom, 20px) env(safe-area-inset-left, 20px);
}

注意事项

使用原子类

后续支持。

混合编写RN代码

在编写Mpx组件时,在特定情况下(处于性能考虑等因素),可能会涉及到混合开发(在Mpx项目内编写RN组件)

使用RN组件

在Mpx组件内引用RN组件,采用如下方式

  • RN组件注册方式:需在components属性下进行引用注册。
  • RN组件的属性与事件:属性与事件参考RN原生支持的属性与事件名,对应赋值方式按照Mpx语法进行双括号包裹,组件使用的值需要通过 REACTHOOKSEXEC方法的返回值的方式进行声明。
  • RN组件的样式定义: 组件支持样式属性的透传,通过在RN组件上定义styles即可透传样式
  • 其他功能: 支持在RN组件内使用slot
javascript
<template>
    <view>
        <!-- 事件的value需要使用双括号包裹 -->
        <ScrollView onScroll="{{scrollAction}}">
          <View styles="{{viewStyle}}">
            <!-- 可混合编写mpx组件 -->
            <view>我是Mpx组件</view>
            <!-- 支持在RN组件内部定义插槽 -->
            <slot name="myslot"></slot>
          <View>
        </ScrollView>
    </view>
</template>
<script>
    import { createComponent, REACTHOOKSEXEC } from '@mpxjs/core'
    import { ScrollView } from 'react-native-gesture-handler'
    createComponent({
        components: {
            ScrollView
        }
        [REACTHOOKSEXEC](){
            return {
              viewStyle: {
                width: 200,
                height: 200
              }
            }
        }
    })
</script>

使用React hooks

Mpx提供了hooks的执行机制,通过在Mpx组件内注册REACTHOOKSEXEC方法,保障RN组件的初始化执行。hooks的返回值支持数据与方法

  • 模板上RN组件/Mpx组件的数据渲染
  • 模板上的Props传递
  • 模板上的样式定义
  • 模板上的事件的绑定与透传
javascript
<template>
    <view>
        <ScrollView onScroll="{{onScroll}}">
            <View>
                <Text>{{count}}</Text>
            </View>
        </ScrollView>
    </view>
</template>
<script>
import { createComponent, REACTHOOKSEXEC } from '@mpxjs/core'
import { ScrollView } from 'react-native-gesture-handler'
import { View, Text} from 'react-native'
import { useState } from 'react'
createComponent({
    components: {
        ScrollView,View, Text
    },
    [REACTHOOKSEXEC](prop) {
        // 所有使用hooks的部分在此处进行注册与执行
        const [count, setCount] = useState(0);
        const onScroll = () => {
            setCount(count + 1)
        }
        // 返回值用于可用于模板上
        return {
            count,
            onScroll
        }
    }
})
</script>

能力支持范围

模版语法

模版指令

Mpx 输出 React Native 支持以下模版指令。

wx:if

输出React Native已支持,详情查看 - wx:if

wx:else

输出React Native已支持,详情查看 - wx:else

wx:elif

输出React Native已支持,详情查看 - wx:elif

wx:show

输出React Native已支持,详情查看 - wx:show

wx:for

输出React Native已支持,详情查看 - wx:for

wx:for-item

输出React Native已支持,详情查看 - wx:for-item

wx:for-index

输出React Native已支持,详情查看 - wx:for-index

wx:class

输出React Native已支持,详情查看 - wx:class

wx:style

输出React Native已支持,详情查看 - wx:style

wx:model

输出React Native已支持,详情查看 - wx:model

wx:model-prop

输出React Native已支持,详情查看 - wx:model-prop

wx:model-event

输出React Native已支持,详情查看 - wx:model-event

wx:model-value-path

输出React Native已支持,详情查看 - wx:model-value-path

wx:model-filter

输出React Native已支持,详情查看 - wx:model-filter

wx:ref

使用wx:ref可以更方便获取基础节点及自定义组件实例。

  • 如果获取的是基础节点(nodeRef),那么可以通过基础节点暴露的相应 api 获取基础节点的样式属性等内容;
  • 如果是获取的自定义组件实例,那么可以直接调用组件实例上的方法或属性;
html
<template>
  <!-- 基础组件 -->
  <view wx:ref="tref">123</view>
  <!-- 自定义组件 -->
  <test-component wx:ref="cref"></test-component>
</template>


<script>
    import { createPage } from "@mpxjs/core"

    createPage({
        ready() {
            // 基础节点 nodeRef 获取节点的样式属性
            this.$refs.tref.fields({size: true}, function (res) {
                console.log(res)
            }).exec()

            this.$refs.cref.show() // 拿到 test-component 组件实例,调用组件实例内部的 show 方法
        }
    })
</script>

@mode

跨端输出 React Native 时,对模版中节点或属性进行平台纬度的条件编译。详情查看

@_mode

跨端输出 React Native 时,对节点或属性进行平台纬度的条件编译并保留跨平台转换能力。详情查看

@env

跨端输出场景下,除了 mode 平台场景值,Mpx 框架还提供自定义 env 目标应用,来实现在不同应用下编译产出不同的代码。

参考:

mpxTagName

支持跨平台输出时针对节点标签名进行条件编译,可以配合属性维度条件编译使用, 例如在 iOS 环境下希望将某个 view 标签替换为 cover-view,可以使用该功能:

html
<view mpxTagName@ios="cover-view">will be cover-view in iOS</view>

事件处理

目前 Mpx 输出 React Native 的事件编写遵循小程序的事件编写规范,支持事件的冒泡及捕获

普通事件绑定

js
<view bindtap="handleTap">
    Click here!
</view>

绑定并阻止事件冒泡

js
<view catchtap="handleTap">
    Click here!
</view>

事件捕获

js
<view capture-bind:touchstart="handleTap1">
  outer view
  <view capture-bind:touchstart="handleTap2">
    inner view
  </view>
</view>

中断捕获阶段和取消冒泡阶段

js
<view capture-catch:touchstart="handleTap1">
  outer view
</view>

在此基础上也新增了事件处理内联传参的增强机制。

html
<template>
 <!--Mpx增强语法,模板内联传参,方便简洁-->
 <view bindtap="handleTapInline('inline')">内联传参</view>
 </template>
 <script setup>
  // 直接通过参数获取数据,直观方便
  const handleTapInline = (params) => {
    console.log('params:', params)
  }
  // ...
</script>

除此之外,Mpx 也支持了动态事件绑定

html
<template>
 <!--动态事件绑定-->
 <view wx:for="{{items}}" bindtap="handleTap_{{index}}">
  {{item}}
</view>
 </template>
 <script setup>
  import { ref } from '@mpxjs/core'

  const items = ref(['Item 1', 'Item 2', 'Item 3', 'Item 4'])
  const handleTap_0 = (event) => {
    console.log('Tapped on item 1');
  },

  const handleTap_1 = (event) => {
    console.log('Tapped on item 2');
  },

  const handleTap_2 = (event) => {
    console.log('Tapped on item 3');
  },

  const handleTap_3 = (event) => {
    console.log('Tapped on item 4');
  }
</script>

更多事件相关内容可以查看 Mpx 事件处理

注意事项

  1. 当同一个元素上同时绑定了 catchtap 和 bindtap 事件时,两个事件都会被触发执行。但是是否阻止事件冒泡的行为,会以模板上第一个绑定的事件标识符为准。 如果第一个绑定的是 catchtap,那么不管后面绑定的是什么,都会阻止事件冒泡。如果第一个绑定的是 bindtap,则不会阻止事件冒泡。
  2. 当同一个元素上绑定了 capture-bind:tap 和 bindtap 事件时,事件的执行时机会根据模板上第一个绑定事件的标识符来决定。如果第一个绑定的是 capture-bind:tap,则事件会在捕获阶段触发,如果第一个绑定的是 bindtap,则事件会在冒泡阶段触发。
  3. 当使用了事件委托想获取 e.target.dataset 时,只有点击到文本节点才能获取到,点击其他区域无效。建议直接将事件绑定到事件触发的元素上,使用 e.currentTarget 来获取 dataset 等数据。
  4. 由于 tap 事件是由 touchend 事件模拟实现,所以如果子组件绑定了 catchtap,那么父组件的 touchend 事件将不会响应。同理如果子组件绑定了 catchtouchend,那么父组件的 tap 事件将不会响应。
  5. 如果元素上设置了 opacity: 0 的样式,会导致 ios 事件无法响应。

基础组件

目前 Mpx 输出 React Native 仅支持以下组件,文档中未提及的组件以及组件属性即为不支持,具体使用范围可参考如下文档

基础组件通用属性

属性名类型默认值说明
enable-offsetBooleanfalse设置是否要获取组件的布局信息,若设置了该属性,会在 e.target 中返回组件的 offsetLeft、offsetWidth 信息
enable-varBooleantrue默认支持使用 css variable,若想关闭该功能可设置为 false
parent-font-sizeNumber父组件字体大小,主要用于百分比计算的场景,如 font-size: 100%
parent-widthNumber父组件宽度,主要用于百分比计算的场景,如 width: calc(100% - 20px),需要在外部传递父组件的宽度
parent-heightNumber父组件高度,主要用于百分比计算的场景,如 height: calc(100% - 20px),需要在外部传递父组件的高度

以上基础组件的通用属性仅在 React Native 环境中支持。在跨平台输出到小程序或 Web 时,这些属性将无法使用。

由于 view、text、scroll-view、image 和 input 组件都是基于 React Native 原生组件实现的,因此这些组件默认继承原生组件支持的属性。

view

视图容器。 属性

属性名类型默认值说明
hover-classstring指定按下去的样式类。
hover-start-timenumber50按住后多久出现点击态,单位毫秒
hover-stay-timenumber400手指松开后点击态保留时间,单位毫秒
animationObjectundefined传递动画的实例, 可配合mpx.createAnimation方法一起使用
enable-backgroundBooleanfalseRN环境特有属性,是否要开启background-image、background-size和background-postion的相关计算或渲染,请根据实际情况开启
enable-animationBooleanfalseRN环境特有属性,开启要开启动画渲染,请根据实际情况开启
enable-fast-imageBooleanfalseRN环境特有属性,开启后将使用 react-native-fast-image 进行图片渲染,请根据实际情况开启

注意事项

  1. 未使用背景图、动图或动画,请不要开启enable-backgroundenable-animationenable-fast-image属性,会有一定的性能消耗。

scroll-view

可滚动视图区域。

属性

属性名类型默认值说明
scroll-xBooleanfalse允许横向滚动动
scroll-yBooleanfalse允许纵向滚动
upper-thresholdNumber50距顶部/左边多远时(单位 px),触发 scrolltoupper 事件
lower-thresholdNumber50距底部/右边多远时(单位 px),触发 scrolltolower 事件
scroll-topNumber0设置纵向滚动条位置
scroll-leftNumber0设置横向滚动条位置
scroll-with-animationBooleanfalse在设置滚动条位置时使用动画过渡
enable-back-to-topBooleanfalse点击状态栏的时候视图会滚动到顶部
enhancedBooleanfalsescroll-view 组件功能增强
refresher-enabledBooleanfalse开启自定义下拉刷新
scroll-anchoringBooleanfalse开启滚动区域滚动锚点
scroll-into-viewBooleanfalse值应为某子元素id(id不能以数字开头)
refresher-default-styleString'black'设置下拉刷新默认样式,支持 blackwhitenone,仅安卓支持
refresher-backgroundString'#fff'设置自定义下拉刷新背景颜色,仅安卓支持
refresher-triggeredBooleanfalse设置当前下拉刷新状态,true 表示已触发
paging-enabledNumberfalse分页滑动效果 (同时开启 enhanced 属性后生效),当值为 true 时,滚动条会停在滚动视图的尺寸的整数倍位置
show-scrollbarNumbertrue滚动条显隐控制 (同时开启 enhanced 属性后生效)
enable-trigger-intersection-observerBoolean[]RN环境特有属性,是否开启intersection-observer
simultaneous-handlersArray<object>[]RN环境特有属性,主要用于组件嵌套场景,允许多个手势同时识别和处理并触发,这个属性可以指定一个或多个手势处理器,处理器支持使用 this.$refs.xxx 获取组件实例来作为数组参数传递给 scroll-view 组件
wait-forArray<object>[]RN环境特有属性,主要用于组件嵌套场景,允许延迟激活处理某些手势,这个属性可以指定一个或多个手势处理器,处理器支持使用 this.$refs.xxx 获取组件实例来作为数组参数传递给 scroll-view 组件

事件

事件名说明
binddragstart滑动开始事件,同时开启 enhanced 属性后生效
binddragging滑动事件,同时开启 enhanced 属性后生效
binddragend滑动结束事件,同时开启 enhanced 属性后生效
bindscrolltoupper滚动到顶部/左边触发
bindscrolltolower滚动到底部/右边触发
bindscroll滚动时触发
bindrefresherrefresh自定义下拉刷新被触发

注意事项

  1. 目前不支持自定义下拉刷新节点,使用 slot="refresher" 声明无效,在 React Native 环境中还是会被当作普通节点渲染出来
  2. 若使用 scroll-into-view 属性,需要 id 对应的组件节点添加 wx:ref 标记,否则无法正常滚动
  3. simultaneous-handlers 为 RN 环境特有属性,具体含义可参考react-native-gesture-handler
  4. wait-for 为 RN 环境特有属性,具体含义可参考react-native-gesture-handler

swiper

滑块视图容器。

属性

属性名类型默认值说明
indicator-dotsBooleanfalse是否显示面板指示点
indicator-colorcolorrgba(0, 0, 0, .3)指示点颜色
indicator-active-colorcolor#000000当前选中的指示点颜色
autoplayBooleanfalse是否自动切换
currentNumber0当前所在滑块的 index
intervalNumber5000自动切换时间间隔
durationNumber500滑动动画时长
circularBooleanfalse是否采用衔接滑动
verticalBooleanfalse滑动方向是否为纵向
previous-marginString0前边距,可用于露出前一项的一小部分,接受px
next-marginString0后边距,可用于露出后一项的一小部分,接受px
scaleBooleanfalse滑动时是否开启前后元素缩小,默认是缩放0.7倍, 暂不支持自定义
easing-functionStringlinear支持 linear、easeInCubic、easeOutCubic、easeInOutCubic
bindchangeeventhandlecurrent 改变时会触发 change 事件,event.detail = {current, source}

事件

事件名说明
bindchangecurrent 改变时会触发 change 事件,event.detail = {current, source}

swiper-item

仅可放置在swiper组件中,宽高自动设置为100%。

属性

属性名类型默认值说明
item-idstring该 swiper-item 的标识符

movable-area

movable-view的可移动区域。

注意事项

  1. movable-area不支持设置 scale-area,缩放手势生效区域仅在 movable-view 内

movable-view

可移动的视图容器,在页面中可以拖拽滑动。movable-view 必须在 movable-area 组件中,并且必须是直接子节点,否则不能移动。

属性

属性名类型默认值说明
directionStringnone目前支持 all、vertical、horizontal、none
inertiabooleanfalsemovable-view是否带有惯性
out-of-boundsbooleanfalse超过可移动区域后,movable-view是否还可以移动
xNumber定义x轴方向的偏移
yNumber定义y轴方向的偏移
frictionNumber7摩擦系数
disabledbooleanfalse是否禁用
animationbooleantrue是否使用动画
simultaneous-handlersArray<object>[]主要用于组件嵌套场景,允许多个手势同时识别和处理并触发,这个属性可以指定一个或多个手势处理器,处理器支持使用 this.$refs.xxx 获取组件实例来作为数组参数传递给 movable-view 组件
wait-forArray<object>[]主要用于组件嵌套场景,允许延迟激活处理某些手势,这个属性可以指定一个或多个手势处理器,处理器支持使用 this.$refs.xxx 获取组件实例来作为数组参数传递给 movable-view 组件

事件

事件名说明
bindchange拖动过程中触发的事件,event.detail = {x, y, source}
bindscale缩放过程中触发的事件,event.detail = {x, y, scale}
htouchmove初次手指触摸后移动为横向的移动时触发
vtouchmove初次手指触摸后移动为纵向的移动时触发

注意事项

  1. simultaneous-handlers 为 RN 环境特有属性,具体含义可参考react-native-gesture-handler
  2. wait-for 为 RN 环境特有属性,具体含义可参考react-native-gesture-handler

root-portal

使整个子树从页面中脱离出来,类似于在 CSS 中使用 fixed position 的效果。主要用于制作弹窗、弹出层等。 属性

属性名类型默认值说明
enablebooleantrue是否从页面中脱离出来

注意事项

  1. style 样式不支持中使用百分比计算、css variable

cover-view

视图容器。 功能同 view 组件

cover-image

视图容器。 功能同 image 组件

icon

图标组件

属性

属性名类型默认值说明
typeStringicon 的类型,有效值:success、success_no_circle、info、warn、waiting、cancel、download、search、clear
sizeString | Number23icon 的大小
colorStringicon 的颜色,同 css 的 color

text

文本。

属性

属性名类型默认值说明
user-selectbooleanfalse文本是否可选。

注意事项

  1. 未包裹 text 标签的文本,会自动包裹 text 标签。
  2. text 组件开启 enable-offset 后,offsetLeft、offsetWidth 获取时机仅为组件首次渲染阶段

button

按钮。

属性

属性名类型默认值说明
sizeStringdefault按钮的大小,default:默认大小,mini:小尺寸
typeStringdefault按钮的样式类型,primary:绿色,default:白色,warn:红色
plainBooleanfalse按钮是否镂空,背景色透明
disabledBooleanfalse是否禁用
loadingBooleanfalse名称前是否带 loading 图标
open-typeString微信开放能力,当前仅支持 share
hover-classString指定按钮按下去的样式类。当 hover-class="none" 时,没有点击态效果
hover-start-timeNumber20按住后多久出现点击态,单位毫秒
hover-stay-timeNumber70手指松开后点击态保留时间,单位毫秒

label

用来改进表单组件的可用性

注意事项

  1. 当前不支持使用 for 属性找到对应 id,仅支持将控件放在该标签内,目前可以绑定的空间有:checkbox、radio、switch。

checkbox

多选项目

属性

属性名类型默认值说明
valueStringcheckbox 标识,选中时触发 checkbox-group 的 change 事件,并携带 checkbox 的 value
disabledBooleanfalse是否禁用
checkedBooleanfalse当前是否选中,可用来设置默认选中
colorString#09BB07checkbox的颜色,同css的color

checkbox-group

多项选择器,内部由多个checkbox组成。

事件

事件名说明
bindchangecheckbox-group 中选中项发生改变时触发 change 事件,detail = { value: [ 选中的 checkbox 的 value 的数组 ] }

radio

单选项目

属性

属性名类型默认值说明
valueStringradio 标识,当该 radio 选中时,radio-group 的 change 事件会携带 radio 的 value
disabledBooleanfalse是否禁用
checkedBooleanfalse当前是否选中,可用来设置默认选中
colorString#09BB07checkbox 的颜色,同 css 的 color

radio-group

单项选择器,内部由多个 radio 组成

事件

事件名说明
bindchangeradio-group 中选中项发生改变时触发 change 事件,detail = { value: [ 选中的 radio 的 value 的数组 ] }

form

表单。

当点击 form 表单中 form-type 为 submit 的 button 组件时,会将表单组件中的 value 值进行提交,需要在表单组件中加上 name 来作为 key。

事件

事件名说明
bindsubmit携带 form 中的数据触发 submit 事件,event.detail = {value : {'name': 'value'} }
bindreset表单重置时会触发 reset 事件

input

输入框。

属性

属性名类型默认值说明
valueString输入框的初始内容
typeStringtextinput 的类型,可选值为 textnumberidcarddigit,不支持 safe-passwordnickname
passwordBooleanfalse是否是密码类型
placeholderString输入框为空时占位符
placeholder-classString指定 placeholder 的样式类,仅支持 color 属性
placeholder-styleString指定 placeholder 的样式,仅支持 color 属性
disabledBooleanfalse是否禁用
maxlengthNumber140最大输入长度,设置为 -1 的时候不限制最大长度
auto-focusBooleanfalse(即将废弃,请直接使用 focus )自动聚焦,拉起键盘
focusBooleanfalse获取焦点
confirm-typeStringdone设置键盘右下角按钮的文字,仅在 type='text' 时生效,可选值为 sendsearchnextgodone
confirm-holdBooleanfalse点击键盘右下角按钮时是否保持键盘不收起
cursorNumber指定 focus 时的光标位置
cursor-colorString光标颜色
selection-startNumber-1光标起始位置,自动聚集时有效,需与 selection-end 搭配使用
selection-endNumber-1光标结束位置,自动聚集时有效,需与 selection-start 搭配使用

事件

事件名说明
bindinput键盘输入时触发,event.detail = { value, cursor },不支持 keyCode
bindfocus输入框聚焦时触发,event.detail = { value },不支持 height
bindblur输入框失去焦点时触发,event.detail = { value },不支持 encryptedValueencryptError
bindconfirm点击完成按钮时触发,event.detail = { value }
bind:selectionchange选区改变事件, event.detail = { selectionStart, selectionEnd }

方法

可通过 ref 方式调用以下组件实例方法

方法名说明
focus使输入框得到焦点
blur使输入框失去焦点
clear清空输入框的内容
isFocused返回值表明当前输入框是否获得了焦点

textarea

多行输入框。

属性

属性名类型默认值说明
valueString输入框内容
typeStringtextinput 的类型,不支持 safe-passwordnickname
placeholderString输入框为空时占位符
placeholder-classString指定 placeholder 的样式类,仅支持 color 属性
placeholder-styleString指定 placeholder 的样式,仅支持 color 属性
disabledBooleanfalse是否禁用
maxlengthNumber140最大输入长度,设置为 -1 的时候不限制最大长度
auto-focusBooleanfalse(即将废弃,请直接使用 focus )自动聚焦,拉起键盘
focusBooleanfalse获取焦点
auto-heightBooleanfalse是否自动增高,设置 auto-height 时,style.height不生效
confirm-typeStringdone设置键盘右下角按钮的文字,可选值为 sendsearchnextgodone,不支持 return
confirm-holdBooleanfalse点击键盘右下角按钮时是否保持键盘不收起
cursorNumber指定 focus 时的光标位置
cursor-colorString光标颜色
selection-startNumber-1光标起始位置,自动聚集时有效,需与 selection-end 搭配使用
selection-endNumber-1光标结束位置,自动聚集时有效,需与 selection-start 搭配使用

事件

事件名说明
bindinput键盘输入时触发,event.detail = { value, cursor },不支持 keyCode
bindfocus输入框聚焦时触发,event.detail = { value },不支持 height
bindblur输入框失去焦点时触发,event.detail = { value },不支持 encryptedValueencryptError
bindconfirm点击完成按钮时触发,event.detail = { value }
bindlinechange输入框行数变化时调用,event.detail = { height: 0, lineCount: 0 },不支持 heightRpx
bind:selectionchange选区改变事件, event.detail = {selectionStart, selectionEnd}

方法

可通过 ref 方式调用以下组件实例方法

方法名说明
focus使输入框得到焦点
blur使输入框失去焦点
clear清空输入框的内容
isFocused返回值表明当前输入框是否获得了焦点

picker-view

嵌入页面的滚动选择器。其中只可放置 picker-view-column 组件,其它节点不会显示

  • 属性
属性名类型默认值说明
valueArray<number>[]数组中的数字依次表示 picker-view 内的 picker-view-column 选择的第几项(下标从 0 开始),数字大于 picker-view-column 可选项长度时,选择最后一项。
indicator-styleString设置选择器中间选中框的样式
indicator-classString设置选择器中间选中框的类名
mask-styleString设置蒙层的样式
mask-classString设置蒙层的类名
  • 事件
事件名说明
bindchange滚动选择时触发 change 事件,event.detail = {value},其中 value 为数组,表示 picker-view 内的 picker-view-column 当前选择的是第几项(下标从 0 开始)
  • 触感反馈回调方法

通过在全局注册 mpx.config.rnConfig.pickerVibrate 方法,在每次滚动选择时会调用该方法。

注册触感方法名类型说明
pickerVibrateFunction注册自定义触感反馈方法。调用时机:在每次滚动选择时会调用该方法。可以在方法内自定义实现类似 iOS 端原生表盘的振动触感。

picker-view-column

滚动选择器子项。仅可放置于 picker-view 中,其孩子节点的高度会自动设置成与 picker-view 的选中框的高度一致

picker

从底部弹起的滚动选择器。

属性

属性名类型默认值说明
modestringselector选择器类型,合法值如下表所示
disabledbooleanfalse是否禁用
  • mode 合法值

    合法值说明
    selector普通选择器
    multiSelector多列选择器
    time时间选择器
    date日期选择器
    region省市区选择器

公共事件

事件名说明
bindcancel取消选择时触发
bindchangevalue 改变时触发 change 事件,event.detail = {value}
普通选择器:mode = selector

属性

属性名类型默认值说明
rangearray[object]/array[]mode 为 selector 或 multiSelector 时,range 有效
range-keystringfalse当 range 是一个 Object Array 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容
valuenumber0表示选择了 range 中的第几个(下标从 0 开始)
多列选择器:mode = multiSelector

属性

属性名类型默认值说明
rangearray[object]/array[]mode 为 selector 或 multiSelector 时,range 有效
range-keystringfalse当 range 是一个 Object Array 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容
valuearray[]表示选择了 range 中的第几个(下标从 0 开始)
bindcolumnchange列改变时触发
多列选择器:时间选择器:mode = time

属性

属性名类型默认值说明
valuestring[]表示选中的时间,格式为"hh:mm"
startstringfalse表示有效时间范围的开始,字符串格式为"hh:mm"
endstring[]表示有效时间范围的结束,字符串格式为"hh:mm"
多列选择器:时间选择器:mode = date

属性

属性名类型默认值说明
valuestring当天表示选中的日期,格式为"YYYY-MM-DD"
startstringfalse表示有效日期范围的开始,字符串格式为"YYYY-MM-DD"
endstring[]表示有效日期范围的结束,字符串格式为"YYYY-MM-DD"
fieldsstringday有效值 year,month,day,表示选择器的粒度
fields 有效值:
属性名说明
year选择器粒度为年
month选择器粒度为月份
day选择器粒度为天
省市区选择器:mode = region

属性

属性名类型默认值说明
valuearray[]表示选中的省市区,默认选中每一列的第一个值
custom-itemstring可为每一列的顶部添加一个自定义的项
levelstringregion选择器层级
level 有效值:
属性名说明
province选省级选择器
city市级选择器
region区级选择器

image

图片。

属性

属性名类型默认值说明
srcStringfalse图片资源地址及 base64 格式数据
modeStringscaleToFill图片裁剪、缩放的模式,可选值为 scaleToFillaspectFitaspectFillwidthFixheightFixtopbottomcenterleftrighttop lefttop rightbottom leftbottom right
enable-fast-imageBooleanfalseRN环境特有属性,开启后将使用 react-native-fast-image 进行图片渲染,请根据实际情况开启

事件

事件名说明
binderror当错误发生时触发,event.detail = { errMsg }
bindload当图片载入完毕时触发,event.detail = { height, width }

注意事项

  1. image 组件默认宽度320px、高度240px
  2. image 组件进行缩放时,计算出来的宽高可能带有小数,在不同webview内核下渲染可能会被抹去小数部分

switch

开关选择器。

属性

属性名类型默认值说明
checkedboolean是否选中
disabledbooleanfalse是否禁用
typestringswitch样式,有效值:switch, checkbox
colorstring#04BE02switch 的颜色,同 css 的 color

事件

事件名说明
bindchange点击的时候触发

页面链接。

属性

属性名类型默认值说明
hover-classstringfalse指定按下去的样式类。
hover-start-timenumber50按住后多久出现点击态,单位毫秒
hover-stay-timenumber400手指松开后点击态保留时间,单位毫秒
open-typeStringnavigate可支持navigateBackredirectswitchTabreLaunchnavigateTo
urlString``当前Navite内的跳转链接

事件

事件名说明
bindtap点击的时候触发

rich-text

富文本。

属性

属性名类型默认值说明
nodesarray/string[]节点列表/HTML String

canvas

画布。

事件

属性名类型说明
bindtouchstarteventhandle手指触摸动作开始
bindtouchmoveeventhandle手指触摸后移动
bindtouchendeventhandle手指触摸动作结束
bindtouchcanceleventhandle手指触摸动作被打断
bindlongpresseventhandle手指长按 350ms 之后触发
binderroreventhandle当发生错误时触发 error 事件, detail = {errMsg}

API

方法名说明
createImage创建一个图片对象。 仅支持在 2D Canvas 中使用
createImageData创建一个 ImageData 对象。仅支持在 2D Canvas 中使用
getContext该方法返回 Canvas 的绘图上下文。仅支持在 2D Canvas 中使用
toDataURL返回一个包含图片展示的 data URI

注意事项

  1. canvas 组件目前仅支持 2D 类型,不支持 webgl
  2. 通过 Canvas.getContext('2d') 接口可以获取 CanvasRenderingContext2D 对象,具体接口可以参考 (HTML Canvas 2D Context)[https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D] 定义的属性、方法
  3. canvas 的实现主要借助于 PostMessage 方式与 webview 容器通信进行绘制,所以对于严格依赖方法执行时机的场景,如调用 drawImage 绘图,再通过 getImageData 获取图片数据的场景,调用时需要使用 await 等方式来保证方法的执行时机
  4. 通过 Canvas.createImage 画图,图片的链接不能有特殊字符,安卓手机可能会 load 失败

web-view

承载网页的容器。会自动铺满整个RN页面

属性

属性名类型默认值说明
srcStringwebview 指向网页的链接,如果需要对跳转的URL设定白名单可跳转,需要在业务跳转之前出来该逻辑
bindmessageEventHandler网页向RN通过 postMessage 传递数据
bindloadEventHandler网页加载成功时候触发此事件
binderrorEventHandler网页加载失败的时候触发此事件

注意事项

  1. web-view网页中可使用@mpxjs/webview-bridge@2.9.68版本提供的接口返回RN页面或与RN页面通信,具体使用细节可以参见Webview API

自定义组件

创建自定义组件在 RN 环境下部分实例方法、属性存在兼容性问题不支持, 文档此部分会详细列出各方法、属性的支持度。

组件属性
属性RN描述
properties用于声明组件接收的外部属性,详情可查看
data组件的内部数据,和 properties 一同用于组件的模板渲染,详情可查看
observers组件数据字段监听器,详情可查看
methods组件方法定义,详情可查看
behaviors输出 RN 不支持
created组件生命周期函数-详情可查看
attached组件生命周期函数-详情可查看
ready组件生命周期函数-详情可查看
detached组件生命周期函数-详情可查看
externalClasses输出 RN 需要配置构建配置
options输出 RN 不支持,一些选项,诸如 multipleSlots、virtualHost、pureDataPattern,这些功能输出 RN 不支持
lifetimes组件生命周期声明对象-详情可查看
pageLifetimes组件所在页面的生命周期声明对象-详情可查看
组件实例属性和方法

生成的组件实例可以在组件的方法、生命周期函数中通过 this 访问。组件包含一些通用属性和方法。

未在本文档中列出的实例属性和方法则在 RN 中不支持。

属性名类型RN 是否支持描述
isString输出 RN 暂不支持,未来支持, 组件的文件路径
idString节点id
datasetString节点dataset
方法名RN是否支持描述
setData设置data并执行视图层渲染
triggerEvent触发事件
createSelectorQuery输出 RN 暂不支持,未来支持,建议使用 ref
selectComponent输出 RN 暂不支持,未来支持,建议使用 ref
selectAllComponents输出 RN 暂不支持,未来支持,建议使用 ref
$set向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新
$watch观察 Mpx 实例上的一个表达式或者一个函数计算结果的变化
$delete删除对象属性,如果该对象是响应式的,那么该方法可以触发观察器更新(视图更新
$refs一个对象,持有注册过 ref的所有 DOM 元素和组件实例,调用响应的组件方法或者获取视图节点信息。
$forceUpdate用于强制刷新视图,不常用,通常建议使用响应式数据驱动视图更新
$nextTick在下次 DOM 更新循环结束之后执行延迟回调函数,用于等待 Mpx 完成状态更新和 DOM 更新后再执行某些操作
$i18n输出 RN 暂不支持,国际化功能访问器,用于获取多语言字符串资源
$rawOptions访问组件原始选项对象

样式规则

position

设置元素的定位样式

值类型

enum: absolute, relative, 默认relative。

备注:RN 不支持 fixed 定位

代码示例
css
position: absolute;
top: 10px

top|right|left|bottom

设置元素的不同方向的偏移量

值类型

number,单位参考数值类型单位说明

代码示例
css
position: relative;
top: 10%;

z-index

控制元素的堆叠覆盖顺序。

值类型

number,纯数值,无单位

代码示例
css
position: absolute;
top: 0;
z-index: 1;

display

设置元素的布局方式。

值类型

enum: flex/none

备注

  • RN display 仅支持 flex 布局,其他在 Web/小程序常用的布局如 block、inline-block、inline、inline-flex、grid、table 等 RN 不支持,为了保证代码有更好的跨端适配,最好使用 flex 布局。
  • 和 Web/小程序一致,RN 下 Text 节点默认为行内 inline 布局
代码示例
css
/* 默认 */ 
display:flex
/* 隐藏 */
display:none

justify-content

用来设置元素列之间的间隔大小,默认值 flex-start

值类型

enum: flex-start/flex-end/center/space-between/space-around/space-evenly

代码示例
css
justify-content: center; /* 居中排列 */
justify-content: flex-start; /* 从行首起始位置开始排列 */
justify-content: flex-end; /* 从行尾位置开始排列 */

align-content

设置单根轴线上的子元素的对齐方式。

值类型

enum: flex-start/flex-end/center/stretch/space-between/space-around/space-evenly

代码示例
css
/** 支持 **/
align-content: flex-start;
align-content: flex-end;
align-content: center;
align-content: stretch;
align-content: space-between;
align-content: space-around;
align-content: space-evenly;

/** 不支持 **/
align-content: safe center;
align-content: unsafe center;

align-items

设置单根轴线上的子元素的对齐方式。默认会是交叉轴上的。

值类型

enum: flex-start/flex-end/center/stretch/baseline

代码示例
css
/** 支持 **/
align-items: flex-start;
align-items: flex-end;
align-items: center;
align-items: stretch;
align-items: baseline;

/** 不支持 **/
align-items: first baseline;
align-items: last baseline;

align-self

设置单个子元素在单根轴线上的对齐方式

值类型

enum: auto/flex-start/flex-end/center/stretch/baseline

代码示例
css
/** 支持 **/
align-self: auto;
align-self: flex-start;
align-self: flex-end;
align-self: center;
align-self: stretch;
align-self: baseline;

/** 不支持 **/
align-self: first baseline;
align-self: last baseline;

flex-grow

设置 flex 元素的增长系数,默认值为0,不支持放大

值类型

number,纯数值无单位,>= 0

代码示例
css
flex-grow: 3;

flex-shrink

设置 flex 元素的收缩规则。

flex 元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值,flex-shrink 默认为0,不支持收缩

值类型

number,纯数值无单位,>= 0

代码示例
css
flex-shrink: 2;

flex-basis

设置指定了 flex 元素在主轴方向上的初始大小,默认值 auto。

值类型

enum: auto

number,单位参考数值类型单位说明

备注

当一个元素同时被设置了 flex-basis (除值为 auto 外) 和 width (或者在 flex-direction: column 情况下设置了height) , flex-basis 具有更高的优先级。

代码示例
css
flex-basis: 10px;
flex-basis: 10rpx;
flex-basis: 20%;
flex-basis: auto;
flex-basis: 0;

flex

flex-grow flex-shrink flex-basis 的简写,和所有简写属性一致,仅支持定义在类上

简写规则

可以使用一个,两个或三个值来指定 flex 属性。

单值语法,值必须是以下之一:

  • 一个 <flex-grow> 的有效值:此时简写会扩展为 flex: <flex-grow> 1 0
  • 一个 <flex-basis> 的有效值:此时简写会扩展为 flex: 1 1 <flex-basis>
  • 关键字 none/initial 。

双值语法,第一个值必须是一个 flex-grow 的有效值,第二个值必须是以下之一:

  • 一个 flex-shrink 的有效值:此时简写会扩展为 flex: <flex-grow> <flex-shrink> 0
  • 一个 flex-basis 的有效值:此时简写会扩展为 flex: <flex-grow> 1 <flex-basis>

三值语法,值必须按照以下顺序指定:

  • 一个 flex-grow 的有效值。
  • 一个 flex-shrink 的有效值。
  • 一个 flex-basis 的有效值。

几种情况

  • initial 相当于将属性设置为 flex: 0 1 auto
  • auto 相当于将属性设置为 flex: 1 1 auto
  • none 相当于将属性设置为 flex: 0 0 auto
  • flex-grow/flex-shrink 负值无效,省略时默认值为 1;flex-basis 若值为0,则必须加上单位,省略时默认值为 0
代码示例
css
/** 单值,flex-grow 有效值 **/
flex: 1;
/* 等同于 */
flex: 0 1 1;

/** 单值,flex-basis 有效值 **/
flex 30px
/* 等同于 */
flex: 1 1 30px

/* 双值:flex-grow + flex-basis 有效值 */
flex: 1 30px
/* 等同于 */
flex: 1 1 30px

/* 双值:flex-grow + flex-shrink 有效值 */
flex: 2 2
/* 等同于 */
flex: 2 2 0

flex-direction

设置主轴的方向。

值类型

enum: row/row-reverse/column/column-reverse

代码示例
css
flex-direction: row;
flex-direction: row-reverse;
flex-direction: column;
flex-direction: column-reverse;

flex-wrap

设置元素是否换行。当值为wrap时,alignItems:center不生效。

值类型

enum: wrap, nowrap, wrap-reverse

代码示例
css
flex-wrap: wrap;
flex-wrap: nowrap;
flex-wrap: wrap-reverse;

flex-flow

flex-direction flex-wrap 的简写形式,值按固定顺序分别赋值给 flex-direction flex-wrap,若值个数不够则后置位属性不设置;和所有简写属性一致,仅支持定义在类上

代码示例
css
/* flex-direction flex-wrap 缺省则不设置 */
flex-flow: row;
/* flex-direction |  flex-wrap */
flex-flow: row nowrap;

direction

用来设置元素列之间的间隔大小

值类型

enum: inherit/ltr/rtl

代码示例
css
/* 支持 */
direction: ltr;
direction: rtl;
direction: inherit;

column-gap

用来设置元素列之间的间隔大小

值类型

number,单位参考数值类型单位说明

代码示例
css
/* 支持 */
column-gap: 3px;
column-gap: 25rpx;
column-gap: 3%;

row-gap

用来设置元素行之间的间隙大小

值类型

number,单位参考数值类型单位说明

代码示例
css
/* 支持 */
row-gap: 20px;
row-gap: 10%;

gap

用于设置行、列的间隙,该属性用来表示 row-gap 和可选的 column-gap 的值。如果缺失 column-gap,则其会被设置成跟 row-gap 一样的值。

值类型

number,单位参考数值类型单位说明

代码示例
css
/* 一个值 */
gap: 16%;
/* 两个值 */
gap: 20px 10px;
gap: 21px 82%;
/* calc() 值 */
gap: calc(10% + 20px);
gap: calc(20px + 10%) calc(10% - 5px);

height

设置元素高度

值类型

enum: auto

number,单位参考数值类型单位说明

代码示例
css
/* 支持 */
height: 120px;
height: 130rpx;
height: auto;

max-height

设置元素最大高度

值类型

number,单位参考数值类型单位说明

代码示例
css
/* 支持 */
max-height: 120px;
max-height: 75%;

min-height

设置元素最小高度

值类型

number,单位参考数值类型单位说明

代码示例
css
/* 支持 */
min-height: 120px;
min-height: 130rpx;

width

设置元素宽度

值类型

enum: auto

number,单位参考数值类型单位说明

代码示例
css
/* 支持 */
width: auto;
width: 10%;

max-width

设置元素最大宽度

值类型

number,单位参考数值类型单位说明

代码示例
css
/* 支持 */
max-width: 75%;
max-width: 75px;

min-width

设置元素最小宽度

值类型

number,单位参考数值类型单位说明

代码示例
css
/* 支持 */
min-width: 10%;
min-width: 120px;

margin-top|margin-bottom|margin-right|margin-left

上下左右外边距

值类型

enum: auto

number,单位参考数值类型单位说明

代码示例
css
margin-top: 2px;
margin-top: 2rpx;
margin-top: 10%;

margin

设置外边距

RN margin 属性仅支持单值的,设置多值时是由框架按简写逻辑在编译时处理的,和所有简写属性一致,多值的简写形式仅在class类上支持。

值类型

enum: auto

number,单位参考数值类型单位说明

代码示例
css
/* all */
margin: 2px;

/* top and bottom | left and right */
margin: 5% auto;

/* top | left and right | bottom */
margin: 1rpx auto 2rpx;

/* top | right | bottom | left */
margin: 1rpx 2rpx 2rpx ;

padding-top|padding-bottom|padding-left|padding-right

上下左右内边距

值类型

number,单位参考数值类型单位说明

代码示例
css
/** padding-top **/
padding-top: 2px;
padding-top: 2rpx;
padding-top: 10%;

padding

设置内边距

RN padding 属性仅支持单值的,设置多值时是由框架按简写逻辑在编译时处理的,和所有简写属性一致,多值的简写形式仅在class类上支持。

值类型

number,单位参考数值类型单位说明

代码示例
css
/* all */
padding: 2px;

/* top and bottom | left and right */
padding: 5% 10%;

/* top | left and right | bottom */
padding: 1rpx 0 2rpx;

/* top | right | bottom | left */
padding: 1rpx 2rpx 2rpx ;

border-top-width|border-bottom-width|border-left-width|border-right-width

设置上下左右各边框的宽度

值类型

number,单位参考数值类型单位说明

代码示例
css
border-top-width: 2px;

border-width

设置边框的宽度

RN border-width 属性仅支持单值的,设置多值时是由框架按简写逻辑在编译时处理的,和所有简写属性一致,多值的简写形式仅在class类上支持。

值类型

number,单位参考数值类型单位说明

代码示例
css
/* all border */
border-width: 2px;

/* 顶部和底部 | 左侧和右侧 */
border-width: 2px 1.5em;

/* 顶部 | 左侧和右侧 | 底部 */
border-width: 1px 2em 1.5cm;

/* 顶部 | 右侧 | 底部 | 左侧 */
border-width: 1px 2em 0 4rem;

border-top-color|border-bottom-color|border-left-color|border-right-color

设置上下左右各边框的颜色

值类型

color: 参考Color

代码示例
css
border-top-color: red;

border-color

设置边框的颜色

RN border-color 属性仅支持单值的,设置多值时是由框架按简写逻辑在编译时处理的,和所有简写属性一致,多值的简写形式仅在class类上支持。

值类型

color: 参考Color

代码示例
css
/* border-color: color; 单值语法 */
border-color: red;

/* border-color: vertical horizontal; 双值语法*/
border-color: red #f015ca;

/* border-color: top horizontal bottom; 三值语法 */
border-color: red yellow green;

/* border-color: top right bottom left; 四值语法 */
border-color: red yellow green blue;

border-style

设置边框的样式

值类型

enum: solid|dotted|dashed

注意事项:RN 不支持分开设置各边框线的形态,所以 RN 上 border-style 不支持简写形式

代码示例
css
/** 支持 **/
/* all border */
border-color: solid;
border-color: dotted;
border-color: dashed;

/** 不支持 **/
border-style: double;
border-style: groove;
border-style: ridge;
border-style: dotted solid;
border-style: hidden double dashed;
border-style: none solid dotted dashed;

/** 不支持 **/
/* horizontal | vertical */
border-style: dotted solid;
/* top | horizontal | bottom */
border-style: hidden double dashed;
/* top | right | bottom | left */
border-style: none solid dotted dashed;

border

border-width border-style border-color 的简写模式, 值按固定顺序分别赋值给 border-width border-style border-color,若值个数不够则后置位属性不设置;和所有简写属性一致,仅支持定义在类上

代码示例
css
/* border-width | border-style | border-color */
border: 1px solid red;
/* border-width */
border: 1px;
/* border-width | border-style */
border: 1px solid;
/* border-width | border-style | border-color */
border: 1px double pink;

border-top|border-right|border-bottom|border-left

border-(top|right|bottom|left)-width border-(top|right|bottom|left)-style border-(top|right|bottom|left)-color 的简写模式, 值按固定顺序分别赋值给 border--width border--style border-*-color,若值个数不够则后置位属性不设置;和所有简写属性一致,仅支持定义在类上

值类型

number,单位参考数值类型单位说明

代码示例
css
border-top: 1px;
border-top: 2px dotted;
border-top: medium dashed green;

border-bottom-left-radius|border-bottom-right-radius|border-top-left-radius|border-top-right-radius

上下左圆角大小

值类型

number,单位参考数值类型单位说明

代码示例
css
border-bottom-left-radius: 2px;

border-radius

圆角大小

RN border-radius 属性仅支持单值的,设置多值时是由框架按简写逻辑在编译时处理的,和所有简写属性一致,多值的简写形式仅在class类上支持。

值类型

number,单位参考数值类型单位说明

代码示例
css
/* all */
border-radius: 2px;
/* top-left | top-right | bottom-right | bottom-left */
border-radius: 10px 10px 10px 0;

background-color

设置背景色

值类型

color: 参考Color

代码示例
css
background-color: red;

background-image

设置背景图

值类型

string: url / linear-gradient

注意事项

  • 背景图和背景色仅支持 view 节点
  • 开发者可通过 enable-background 属性来控制是否开启背景图片和渐变色的支持
  • 渐变不支持turn、px单位,只支持渐变距离百分比。
代码示例
css
/* 支持 */
background-image: url("https://res.wx.qq.com/wxdoc/dist/assets/img/0.4cb08bb4.jpg");
background-image linear-gradient(270deg, rgba(255,255,255,0.40), rgba(255,255,255,0.00))
background-image: linear-gradient(to top, blue, red)
background-image: linear-gradient(to right bottom, blue, red)
background-image: linear-gradient(45deg, blue, red)
background-image: linear-gradient(45deg, blue 0%, orange 40%, red)
background-image: linear-gradient(to left top, blue, red)



/* 不支持 */
background-image: linear-gradient(rgba(0, 0, 255, 0.5), rgba(255, 255, 0, 0.5));
background-image: linear-gradient(.25turn, red, blue) //  turn单位不支持
background-image: linear-gradient(45deg, red 100px, blue) //px单位不支持
background-image: linear-gradient(red 0%, orange 10% 30%, yellow 50% 70%, green 90% 100%);

background-size

设置背景图大小

值类型

enum: contain/cover/auto

number,单位参考数值类型单位说明

注意事项

  • 仅支持 view 节点
  • 支持一个值,这个值指定图片的宽度,图片的高度隐式的为 auto;支持两个值,第一个值指定图片的宽度,第二个值指定图片的高度;不支持逗号分隔的多个值
代码示例
css
/* 支持 */
background-size: 50%;
background-size: 50% 25%;
background-size: contain;
background-size: cover;
background-size: auto;
background-size: 20px auto;

/* 不支持 */
background-size: 50%, 25%, 25%;

background-repeat

设置是否重复背景图

值类型

enum: no-repeat

备注:仅支持 view 节点

代码示例
css
background-repeat: no-repeat;

/* 不支持 */
background-repeat: repeat;

background-postion

设置背景图大小

值类型

enum: center/left/right/top/bottom

number,单位参考数值类型单位说明

注意事项

  • 仅支持 view 节点
代码示例
css
/* 支持 */
background-position: center;
background-position: 10%;
background-position: 10px;
background-position: 10px 20px;
background-position: 10px center;
background-position: right 10px center;
background-position: right 10px bottom 10px;

/* 不支持 */
background-position: 1cm 2cm;
background-position: 10ch 8em;
background-position: right 3em bottom 10px;

background

背景的简写属性,只能在view上使用

值类型

仅支持 background-image|background-color|background-size|background-repeat|background-position,具体每个属性的支持情况详见各属性的介绍文档

备注:仅支持 view 节点

代码示例
css
/* 支持 */
background: url("https://res.wx.qq.com/wxdoc/dist/assets/img/0.4cb08bb4.jpg") pink no-repeat;
background: #000;
background: url("https://res.wx.qq.com/wxdoc/dist/assets/img/0.4cb08bb4.jpg") pink;
background: linear-gradient(rgba(0, 0, 255, 0.5), rgba(255, 255, 0, 0.5));

box-shadow

设置阴影颜色、阴影偏移量、阴影模糊半径,因 RN 不支持 box-shadow 属性,实际是由 mpx 按 RN 支持的 shadowOffset: { width?: number, height?: number }; shadowRadius: number; shadowColor: number; 属性和顺序转换成对应的属性。

值类型

offset-x|offset-y|blur-radius 值为 number,单位参考数值类型单位说明,shadow-color 为 color 类型,参考Color

简写规则
  • 按 offset-x|offset-y|blur-radius|spread-radius|color 顺序赋值
  • 赋值过程中,如遇到不支持的属性会忽略该属性;若属性值校验不合法,则忽略该值,继续校验下一个值是否合法,合法则赋值,不合法则继续校验下一个值
  • android 下仅支持 shadowColor,故框架在 android 模式下不会添加 shadowOffset/shadowRadius
  • 在设置 box-shadow 有效值的情况下,ios 下会新增 shadowOpacity: 1 来展示阴影
代码示例
css
/* offset-x | offset-y | blur-radius | color */
box-shadow: 0 1px 3px rgba(139,0,0,0.32);
/* x 偏移量 | y 偏移量 | 阴影模糊半径 | 阴影扩散半径 | 阴影颜色 */
/* 因第四个值 spread-radius 阴影扩散半径 不支持,故 1px 在框架处理时会被忽略 */
box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);

注意事项

  • android 仅支持 shadowColor,ios 也支持 shadowOffset/shadowRadius/shadowColor/shadowOpacity, 不支持设置 spread-radius 阴影扩散半径
  • 在节点有设置 overflow:hidden; 同时设置 box-shadow,Web/小程序能正常展示阴影,RN 不能正常展示阴影,需单独新增一级节点来添加阴影
  • RN 0.76 新架构支持 boxShadow 属性

backface-visibility

指定当 image 背面朝向观察者时是否可见,仅 image 支持

值类型

enum: visible/hidden

备注:仅支持 view 节点

代码示例
css
backface-visibility: visible;

object-fit

确定当元素 image 与原始图像尺寸不匹配时如何调整图像大小

值类型

enum: cover/contain/fill/scale-down

备注:仅支持 view 节点

代码示例
css
object-fit: contain;

transform

设置旋转、缩放、倾斜或平移

值类型

array of objects (only rn): [{matrix: number[]}, {perspective: number}, {rotate: string}, {rotateX: string}, {rotateY: string}, {rotateZ: string}, {scale: number}, {scaleX: number}, {scaleY: number}, {translateX: number}, {translateY: number}, {skewX: string}, {skewY: string}]

string

代码示例
css
/* rn & css */
transform: 'rotateX(45deg) rotateZ(0.785398rad)';
/* 仅rn支持 */
transform: [{rotateX: '45deg'}, {rotateZ: '0.785398rad'}]

transform-origin

设置视图变换的原点,默认情况下,变换的原点是中心。

值类型
  • 单值时,该值必须是 px、百分比或关键字 left、center、right、top 和 bottom 之一;
  • 双值时,第一个值代表 X 偏移, 必须是 px、百分比或关键字 left、center 和 right 之一, 第二个值代表 Y 偏移,必须是 px、百分比或关键字 top、center 和 bottom 之一;
  • 三值时,前两个值与双值语法相同,第三个值代表 Z 偏移,必须是 px。
代码示例
css
transform-origin: bottom;
transform-origin: 10px 2px;
transform-origin: right bottom 20px;

opacity

设置节点的不透明度

值类型

number

  • 0 元素完全透明 (即元素不可见).
  • 任何一个位于 0.0-1.0 之间的 <number> 元素半透明 (即元素后面的背景可见).
  • 1 元素完全不透明 (即元素后面的背景不可见).

注意事项:在 RN 上设置节点 opacity: 0; 时该节点不会触发事件响应

代码示例
css
/* 完全不透明 */
opacity: 1;

/* 半透明 */
opacity: 0.6;

/* 完全透明 */
opacity: 0;

pointer-events

控制视图是否可以成为触摸事件的目标

值类型

enum

  • auto/none
  • box-none 仅 RN 支持,表示当前视图不会成为触摸事件的目标,但其子视图可以
  • box-only 仅 RN 支持,表示当前视图可以成为触摸事件的目标,但其子视图不能
代码示例
css
pointer-events: auto;
pointer-events: none;

overflow

控制元素溢出时所需的行为

值类型

enum: visible/hidden/scroll

代码示例
css
/* 支持 */
overflow: visible;
overflow: hidden;
overflow: scroll;

/* 不支持 */
overflow: clip;
overflow: auto;
overflow: hidden visible;

aspect-ratio

规定盒子首选纵横比

值类型

number, string

代码示例
css
/* 支持 */
aspect-ratio: 1 / 1;
aspect-ratio: 1;
aspect-ratio: 0.5;
aspect-ratio: auto;

color

值类型

color 参考 Color

备注:文本样式继承规则

代码示例
css
color: orange;
color: #fff;
color: #fafafa;
color: rgb(255, 255, 255);
color: rgba(255, 99, 71, 0.2)

font-family

可设置系统字体,引入字体文件,暂时不支持。

值类型

string

注意事项

代码示例
css
/* 支持 */
font-family: PingFangSC-Regular

/* 不支持 */
font-family: "Gill Sans", sans-serif;

font-size

可设置字体的大小

值类型

number,单位参考数值类型单位说明

备注:

代码示例
css
font-size: 12px;
font-size: 12rpx;

font-style

设置文本的字体样式。

值类型

enum: normal,italic

备注:文本样式继承规则

代码示例
css
font-style: italic;
font-style: normal;

font-weight

设置文字的权重。

值类型

enum: 100,200,300,400,500,600,800,900,normal,bold

备注:

  • 文本样式继承规则
  • 若在自定义字体图标上加 font-weight,可能会导致在某些安卓上不展示图标或者图标展示异常
  • 100,200,300,400,500,600,800,900 在 RN 上是字符串类型而非数值类型,非字符串类型可能会导致某些安卓机型异常
代码示例
css
font-weight: 100;
font-weight: 200;
font-weight: 300;
font-weight: 400;
font-weight: 500;
font-weight: 600;
font-weight: 700;
font-weight: 800;
font-weight: 900;

font-weight: normal;
font-weight: bold;

font-variant

设置文本的字体变体

值类型

enum: small-caps/oldstyle-nums/lining-nums/tabular-nums/proportional-nums

备注:文本样式继承规则

代码示例
css
font-variant: small-caps;
font-variant: oldstyle-nums;
font-variant: lining-nums;
font-variant: tabular-nums;
font-variant: lining-nums;
font-variant: proportional-nums;

letter-spacing

定义字符之间的间距

值类型

number,单位参考数值类型单位说明

备注:文本样式继承规则

代码示例
css
letter-spacing: 2px;
letter-spacing: 2rpx;

line-height

设置行高。

值类型

number,单位参考数值类型单位说明

备注:

代码示例
css
line-height: 16px
line-height: 16rpx
line-height: 100%
line-height: 1

text-align

设置文本的水平对齐方式。

值类型

enum: left, right, center, justify

备注:文本样式继承规则

代码示例
css
/** 支持 **/
text-align: left;
text-align: right;
text-align: center;
text-align: justify;

/** 不支持 **/
text-align: match-parent;
text-align: auto;
text-align: justify-all;

text-decoration-line

设置文本的装饰线样式。

值类型

enum: none, underline, line-through, underline line-through

备注:文本样式继承规则

代码示例
css
/** 支持 **/
text-decoration-line: none;
text-decoration-line: underline;
text-decoration-line: line-through;
text-decoration-line: underline line-through;

/** 不支持 **/
text-decoration-line: overline;

text-decoration-style

设置文本的装饰线样式

值类型

enum: solid/double/dotted/dashed

备注

代码示例
css
text-decoration-style: double;

text-decoration-color

设置文本的装饰线颜色

值类型

color 参考 Color

备注

代码示例
css
text-decoration-color: #21ff21;

text-decoration

text-decoration-line text-decoration-style text-decoration-color 的简写格式

简写规则
  • 按 text-decoration-line text-decoration-style text-decoration-color 顺序赋值
  • 赋值过程中,如遇到不支持的属性会忽略该属性;若属性值校验不合法,则忽略该值,继续校验下一个值是否合法,合法则赋值,不合法则继续校验下一个值
  • android 下仅转换 text-decoration-line,text-decoration-style/text-decoration-color 因不支持不会添加

备注:文本样式继承规则

代码示例
css
text-decoration: underline;
text-decoration: underline dotted;
text-decoration: underline dotted red;

text-transform

设置文本的大小写转换。

值类型

enum: none, uppercase, lowercase, capitalize

备注:文本样式继承规则

代码示例
css
/** 支持 **/
text-transform: none;
text-transform: uppercase;
text-transform: lowercase;
text-transform: capitalize;

/** 不支持 **/
text-transform: full-width;
text-transform: full-size-kana;
text-transform: math-auto;

vertical-align

用来指定行内文本的对齐方式

值类型

enum: auto/top/bottom/middle

备注

代码示例
css
/* 支持 */
vertical-align: auto;
vertical-align: middle;
vertical-align: top;
vertical-align: bottom;

/* 不支持 */
vertical-align: baseline;
vertical-align: sub;
vertical-align: super;
vertical-align: text-top;
vertical-align: text-bottom;

user-select

用于控制用户是否可以选择文本

值类型

enum: auto/text/none/contain/all

备注: 文本样式继承规则

代码示例
css
/* 关键字值 */
user-select: none;
user-select: auto;
user-select: text;
user-select: contain;
user-select: all;

text-shadow

设置文本阴影,因 RN 不支持 text-shadow 属性,实际是由 mpx 按 RN 支持的 textShadowOffset: { width?: number, height?: number }; textShadowRadius: number; textShadowColor: number; 属性和顺序转换成对应的属性。

值类型

offset-x|offset-y|blur-radius 值为 number,单位参考数值类型单位说明,textShadowColor 为 color 类型,参考Color

简写规则
  • 按 offset-x|offset-y|blur-radius|color 顺序赋值
  • 赋值过程中,如遇到不支持的属性会忽略该属性;若属性值校验不合法,则忽略该值,继续校验下一个值是否合法,合法则赋值,不合法则继续校验下一个值

备注:文本样式继承规则

代码示例
css
/* offset-x | offset-y | blur-radius | color */
text-shadow: 1rpx 3rpx 0 #2E0C02;

/* offset-x | offset-y */
text-shadow: 5px 10px;

/* offset-x | offset-y | color */
/* 因为第三个值是 color 类型,赋值给 textShadowRadius 检验不合法,继续赋值给下一个属性 textShadowColor 校验合法 */
text-shadow: 5px 5px #558abb;

应用能力

app配置

对标参考微信app配置, 以下仅标注支持项或者特殊关注项,未标注的均未支持

配置项支持情况特殊说明
entryPagePath支持
pages支持
window子属性部分支持参考下面window配置部分
tabbar暂未支持
networkTimeout支持
subpackages支持分包在RN下暂未进行拆包处理,仅能正常打包在一起,分包能力待后续支持
usingComponents支持
vw支持
window配置

app里面的window配置,参考微信内window配置说明

配置项支持情况特殊说明
navigationBarBackgroundColor支持
navigationBarTextStyle支持
navigationStyle支持
backgroundColor支持

页面配置

页面配置内可配置页面级别的属性,参考微信页面配置说明

配置项支持情况特殊说明
navigationBarBackgroundColor支持
navigationBarTextStyle支持
navigationStyle支持
backgroundColor支持
usingComponents支持
disableScroll不支持RN下默认页面不支持滚动,如需滚动需要使用可滚动的元素包裹

状态管理

pinia

暂未支持

store

已支持

i18n

支持

原子类能力

开发中,暂未支持

依赖注入(Provide/Inject)

开发中,暂未支持

环境API

在RN环境中也提供了一部分常用api能力,方法名与使用方式与小程序相同,个别api提供的能力或者返回值(返回值部分如果不支持,会在调用是有warn提醒)会比微信小程序提供的能力少一些,以下是使用说明:

使用说明

如果全量引入api-proxy这种情况下,需要如下配置

javascript
// 全量引入api-proxy
import mpx from '@mpxjs/core'
import apiProxy from '@didi/mpxjs-api-proxy'
mpx.use(apiProxy, { usePromise: true })

需要在mpx项目中需要配置externals

bash
externals: {
  ...
  '@react-native-async-storage/async-storage': '@react-native-async-storage/async-storage',
  '@react-native-clipboard/clipboard': '@react-native-clipboard/clipboard',
  '@react-native-community/netinfo': '@react-native-community/netinfo',
  'react-native-device-info': 'react-native-device-info',
  'react-native-safe-area-context': 'react-native-safe-area-context',
  'react-native-reanimated': 'react-native-reanimated',
  'react-native-get-location': 'react-native-get-location',
  'react-native-haptic-feedback': 'react-native-haptic-feedback'
},

如果引用单独的api-proxy方法这种情况,需要根据下表说明是否用到以下方法,来确定是否需要配置externals,配置参考上面示例

api方法依赖的react-native三方库
showActionSheetreact-native-reanimated
getNetworkType、
offNetworkStatusChange、
onNetworkStatusChange
@react-native-community/netinfo
getLocation、
openLocation、
chooseLocation
react-native-get-location
setStorage、
setStorageSync、
getStorage、
getStorageSync、
getStorageInfo、
getStorageInfoSync、
removeStorage,
removeStorageSync,
clearStorage,
clearStorageSync
@react-native-async-storage/async-storage
getSystemInfo、
getSystemInfoSync、
getDeviceInfo、
getWindowInfo、
getLaunchOptionsSync、
getEnterOptionsSync
react-native-device-info
getWindowInfo、
getLaunchOptionsSync、
getEnterOptionsSync
react-native-safe-area-context
vibrateShort、
vibrateLong
react-native-haptic-feedback

在RN 项目中,如果是以全量引入api-proxy的方法需要在RN环境中执行以下所有的命令,如果只是使用单个api的能力,可以参考上表来判断安装对应的包

bash
// 安装api-proxy下所用到的依赖 如果
npm i @react-native-async-storage/async-storage
npm i @react-native-clipboard/clipboard
npm i @react-native-community/netinfo
npm i react-native-safe-area-context
npm i react-native-device-info
npm i react-native-reanimated
npm i react-native-haptic-feedback
ios项目需要执行如下命令
cd ios
pod install

npm i react-native-get-location

android下需要做如下配置: 安装react-native-get-location包后,需要在AndroidManifest.xml中定义位置权限,参考文档

html
<!-- Define ACCESS_FINE_LOCATION if you will use enableHighAccuracy=true  -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<!-- Define ACCESS_COARSE_LOCATION if you will use enableHighAccuracy=false  -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

安装react-native-haptic-feedback包后需要在安卓中配置,配置参考文档 打开 android/app/src/main/java/[...]/MainApplication.java. 在文件的顶部添加以下导入下面的代码片段

import com.mkuczera.RNReactNativeHapticFeedbackPackage;

修改设置,将下面的配置添加到android/settings.gradle文件中

js
include ':react-native-haptic-feedback'
project(':react-native-haptic-feedback').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-haptic-feedback/android')

react-native-reanimated在mpx和RN项目都要安装,安装好包后需要在babel.config.json文件中做如下配置,并且RN环境中使用的react-native-reanimated与mpx项目中安装的react-native-reanimated版本要一致: 配置参考文档

javascript
module.exports = {
    presets: [
      ... // don't add it here :)
    ],
    plugins: [
      ...
      'react-native-reanimated/plugin',
    ],
};

注意事项:

  1. 调用 @mpxjs/api-proxy 当中抹平跨端环境的 createSelectorQuery 方法创建的 SelectorQuery 实例,在使用过程中需要手动调用实例上的 in 方法来指定组件上下文。示例:
javascript
import { createComponent } from '@mpxjs/core'

createComponent({
  attached () {
    const query = wx.createSelectorQuery()
    query.select('#the-id').boundingClientRect()
    query.selectViewport().scrollOffset()
    query.exec(function(res){
      res[0].top       // #the-id节点的上边界坐标
      res[1].scrollTop // 显示区域的竖直滚动位置
    }).in(this) // this 为组件实例
  }
})
  1. SelectorQuery.select/SelectorQuery.selectAll 方法目前仅支持2种选择器写法
  • id 选择器:#id
  • class 选择器(可连续指定多个):.a-class.a-class.b-class.c-class

Webview API

对于web-view组件打开的网页,想要跟RN通信,或者跳转到RN页面,提供了以下能力

方法名说明
navigateTo保留当前webview页面,跳转RN页面
navigateBack关闭当前页面,返回上一页或多级RN页面
switchTab跳转到RN的 tabBar 页面
reLaunch关闭所有页面,打开到应用内的某个RN页面
redirectTo关闭当前页面,跳转到应用内的某个RN页面
getEnv获取当前环境
postMessage向RN发送消息,实时触发组件的message事件
invoke开放一个webview页面和web页面互通消息的能力
webview-bridge示例代码
javascript
import webviewBridge from '@mpxjs/webview-bridge'
webviewBridge.navigateTo({
  url: 'RN地址',
  success: () => {
    console.log('跳转成功')
  }
})
invoke示例代码

对于业务中一些特殊的方法,需要有web与RN进行交互的这种情况,基于这种情况在mpx框架内部提供了挂载方法的能力,在webview-bridge提供了invoke通信的能力,具体使用方法如下:

RN环境中挂载getTime的逻辑

javascript
import mpx from '@mpxjs/core'
...
// 普通方法
mpx.config.webviewConfig = {
  apiImplementations: {
    getTime:  (options = {}) => {
      const { params = {} } = options
      return {
        text: params.text,
        time: '2024-12-24'
      }
    }
  }
}
// 或者promise
mpx.config.webviewConfig = {
  apiImplementations: {
    getTime:  (options = {}) => {
      return new Promise((resolve, reject) => {
        const { params = {} } = options
        if (params.text) {
          resolve({
            text: params.text,
            time: '2024-12-24'
          })
        } else {
          reject(new Error('没有传text参数'))
        }
      })
    }
  }
}
...

web中通信的逻辑

javascript
import webviewBridge from '@mpxjs/webview-bridge'
webviewBridge.invoke('getTime', {
  params: {
    text: '我是入参'
  },
  success: (res) => {
    console.log('接收到的消息:', res.time)
  }
})

其他使用限制

如事件的target等