worldsite / blog.sc

Blogging soul chat, stay cool. via: https://blog.sc
3 stars 0 forks source link

ReactNative #29

Open suhao opened 3 years ago

suhao commented 3 years ago

ReactNative

RND,可以简单看做是 ReactNative 在桌面系统上的实现,Native 部分采用C++开发。RND 的 JS Framework 基于 RN 0.57.8,node.js 运行时 8.1.2。

一、开发环境

  1. 安装nodejs:v12.10.0

  2. 安装vscode:v1.46.0

  3. 初始化工程:

    npm install -g react-native-cli
    react-native init demo --version 0.57.8
    npm install --save @suhao/react-node-desktop
    react-native clone-demo
  4. 调试

    react-native run-demo
  5. 打包

    react-native package

二、重要概念

1. Flexbox布局

image

在 flex 容器中默认存在两条轴,水平主轴(main axis) 和垂直的交叉轴(cross axis),这是默认的设置,当然你可以通过修改使垂直方向变为主轴,水平方向变为交叉轴,这个我们后面再说。

在容器中的每个单元块被称之为 flex item,每个项目占据的主轴空间为 (main size), 占据的交叉轴的空间为 (cross size)。

这里需要强调,不能先入为主认为宽度就是 main size,高度就是 cross size,这个还要取决于你主轴的方向,如果你垂直方向是主轴,那么项目的高度就是 main size。

实现 flex 布局需要先指定一个容器,任何一个容器都可以被置顶为 flex 布局,这样容器内部的元素就可以使用 flex 来进行布局。简单说来,如果你使用块元素如 div,你就可以使用 flex,而如果你使用行内元素,你可以使用 inline-flex。

需要注意的是:当时设置 flex 布局之后,子元素的 float、clear、vertical-align 的属性将会失效。

2. Style样式定义

<View style={{width:50,height:50,backgroundColor:'red'}}></View>

在React Native中,您并不需要学习什么特殊的语法来定义样式。仍然是使用JavaScript来写样式。所有的核心组件都接受名为style的属性。这些样式名基本上是遵循了web上的CSS的命名,只是按照JS的语法要求使用了驼峰命名法,例如将background-color改为backgroundColor。

style属性可以是一个普通的JavaScript对象。这是最简单的用法,因而在示例代码中很常见。你还可以传入一个数组——在数组中位置居后的样式对象比居前的优先级更高,这样你可以间接实现样式的继承。 比如:

<Text style={[styles.welcome,{fontSize:30}]}>
    Hello,RN
</Text>

实际开发中组件的样式会越来越复杂,我们建议使用StyleSheet.create来集中定义组件的样式。比如像下面这样:

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    welcome: {
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
    },
    instructions: {
        textAlign: 'center',
        color: '#333333',
        marginBottom: 5,
    },
    button: {
        backgroundColor:'black'
    }
});

常见的做法是按顺序声明和使用style属性,以借鉴CSS中的“层叠”做法(即后声明的属性会覆盖先声明的同名属性)。

3. Props参数传递

大多数组件在创建时就可以使用各种参数来进行定制。用于定制的这些参数就称为props(属性)。

以常见的基础组件Image为例,在创建一个图片时,可以传入一个名为source的prop来指定要显示的图片的地址,以及使用名为style的prop来控制其尺寸。

自定义的组件也可以使用props。通过在不同的场景使用不同的属性定制,可以尽量提高自定义组件的复用范畴。只需在render函数中引用this.props,然后按需处理即可。

4. State状态控制

我们使用两种数据来控制一个组件:props和state。props是在父组件中指定,而且一经指定,在被指定的组件的生命周期中则不再改变。 对于需要改变的数据,我们需要使用state。

一般来说,你需要在constructor中初始化state(译注:这是ES6的写法,早期的很多ES5的例子使用的是getInitialState方法来初始化state,这一做法会逐渐被淘汰),然后在需要修改时调用setState方法。

大多数组件在创建时就可以使用各种参数来进行定制。用于定制的这些参数就称为props(属性)。

假如我们需要制作一段不停闪烁的文字。文字内容本身在组件创建时就已经指定好了,所以文字内容应该是一个prop而文字的显示或隐藏的状态(快速的显隐切换就产生了闪烁的效果)则是随着时间变化的,因此这一状态应该写到state中。

典型的场景是在接收到服务器返回的新数据,或者在用户输入数据之后。你也可以使用一些“状态容器”比如Redux来统一管理数据流(译注:但我们不建议新手过早去学习redux)。

5. Props和State比较

props是properties的缩写,您可以把任意类型的数据传递给子组件,如此子组件的默认数据源就是props。在使用中可以通过this.props.data调用props属性,但是切记不能用this.props.xxx修改属性,这会导致props错乱。可以把props当做const类型来看待。

state是组件的内部状态属性,主要用来存储组件自身需要的数据。 除了初始化时可能由props来决定,之后就完全由组件自身去维护。 组件中由系统定义了setState方法,每次调用setState时都会更新组件的状态,触发render方法重新渲染界面。 需要注意的是render方法是被异步调用的,这可以保证同步的多个setState方法只会触发一次render,这样做是有利于提高性能的。

6. 组件生命周期

image

7. 生命周期调用和setState

image

8. 原生组件

React Native 的一个很大的技术特点就是它虽然用JavaScript语言开发,但是界面用原生端控件来渲染,从而获得平台上的组件本来就具备的所有特性和原生开发出来的界面一致的体验。

RN 中的原生组件通常包含原生端实现(用i平台原生语言开发)和JS端的载体(将原生控件的属性和方法暴露给JS端)两个部分。

原生组件使得RN具备很大的灵活性,RN官方自带的组件库不能满足需求的时候,可以随时将用原生语言开发的控件(包括开源的)封装成JS端可以使用的组件,这也使得RN 开源社区蓬勃发展,催生了各种开源RN组件,封装了各种高级组件,是RN官方组件的有益补充,降低了使用门槛,提高了开发效率。

9. 原生模块

React Native官方封装了一些API用来调用原生端能力,但是毕竟无法满足各种各样的需求。RN提供的原生模块特性为你提供了一种便捷的途径来将原生端的所有能力暴露给JS端调用。当RN官方还不支持某个你需要的原生特性时,你就可以用原生模块来自己实现该特性的封装。

RN原生模块的实现一般只需要编写原生端代码,暴露一些方法(支持回调,不支持直接返回值,因为跨语言通信是异步的)给JS端,JS端简单调用这些方法就可以了。有时为了使用方便,我们也可以将某个原生模块在JS端对应的实现一个类,封装里面的方法,这样调用方法的时候就可以利用IDE的代码自动补全功能,提高便利性,也可以同时封装一些额外的逻辑,比如参数校验等等。

常见错误

1. SyntaxError: Invalid regular expression: Unterminated character class at new RegExp ()

2. yarn与npm混合使用的依赖验证