ReactNative初步

文章基本没写过,发现很多东西不动动笔很容易就忘记了,这里主要用于记录自己的一些理解和别人好的文章截取,内容结构比较随意,也没有常规套路,想到啥写点啥,主要是面向自己,也许不适用于大部分人,有问题可以一起交流。

必备知识点

对于前端同学,这些知识点应该不足一道。其实这些点更适于APP端的同学,现在很多APP端同学都有机会扩展一下自己的rn技能,希望我这里能帮到一些人,下面这些点都是我刚开始写rn解决问题的主要知识点。
其中对于js语法其实没必要事无巨细的学习一遍,完全可以一边开发rn一边去补充,当然如果要深入进去的话,肯定是要去好好学习一下的。flex-box布局和JSX基本上也没有深挖的必要,写的多了自然就记住了。react.js这个肯定是需要持续学习的,初期搞懂生命周期、数据载体、数据传递方式基本上就可以上手了,后面深入的点有很多,再慢慢去学习。

  • es6 / es7
    • () => {} 箭头函数
    • class
    • promise
    • async await
    • 一些语法糖map、foreach。。。
    • 等等
  • flex-box布局
  • JSX
  • react.js
    • 生命周期
    • props state
    • diff
    • virtual dom
    • 等等
native与rn开发模式
ReactNative初步_第1张图片
模式对比

Native最常见的是MVC开发模式,数据通过controller设置到view上,view上的交互再通过controller反映到model上。而在RN开发中,所有界面的结构组织及展示都是基于组件的,整个页面的构成更接近组件的拼接,对于每个组件,除了来自父组件的props数据,其本身是个状态机,所有页面的变化都是跟状态一一对应的,每指定一种状态,都会有一个对应的页面。页面上的交互通过一些事件来改变状态,进而又更新了页面。所以整个页面的变化都是跟随状态单向变化的,交互的控制流向也是单向的。

props & state

props
  • props 是一种从父级向子级传递数据的方式
  • props 也是父子组件进行通信的一种方式
  • props 不应被手动修改
state
  • state 是component的状态,每个component都是一个状态机
  • 在constructor中初始化
  • 通过this.setState()修改
props state
能否从父组件获取初始值 true false
父组件能否修改 true false
在组件内部能否修改 false true
示例

父组件调用Clock组件

 {console.log('Clock click!')}}/>

Clock类

import React from 'react';
import {
    StyleSheet,
    Text,
    View,
    TouchableOpacity
} from 'react-native';
import PropTypes from 'prop-types';

class Clock extends React.Component {
    static propTypes = {
        clickAction: PropTypes.func,
    };

    constructor(props) {
        super(props);
        this.state = {
            secondCount: 0,
        };
    }

    componentDidMount() {
        this.timer = setInterval(
            () => {
                this.setState((state) => {
                    return {
                        ...state,
                        secondCount: state.secondCount + 1,
                    };
                });
            },
            1000,
        );
    }

    componentWillUnmount() {
        clearInterval(this.timer);
    }

    render() {
        return (
             {
                    if (this.props.clickAction) {
                        this.props.clickAction();
                    }
                }}
            >
                
                    
                        {'Stay ' + this.state.secondCount + 's'}
                    
                
            
        );
    }
}

const styles = StyleSheet.create({
    view: {
        marginVertical: 20,
        flexDirection: 'row',
        justifyContent: 'center',
        alignItems: 'center',
    },
    text: {
        fontSize: 20,
        color: '#ff9942',
    }
});

export default Clock;

代码比较简单,state控制记录停留了多少秒,props是父组件传递的一个方法,在适当的地方调用。

生命周期

ReactNative初步_第2张图片
生命周期
  • shouldComponentUpdate(nextProps, nextState)方法中,我们可以根据 nextProps 或 nextState 的值来确定是否需要重新渲染组件。默认是返回 true,如果返回 false,则后续流程会被中断。主要是用来判断不必要的渲染逻辑,当这里判断逻辑的复杂度如果超过了diff算法,就会得不偿失
  • componentWillUpdate(nextProps, nextState) 是在即将更新组件之前的操作。这个方法在当前最新版本的react.js中被重命名为UNSAFE_componentWillUpdate(nextProps, nextState)。在这个方法中,我们不能去调用setState方法,或者做其它可能会引起组件重新渲染的操作。
  • componentDidUpdate(prevProps, prevState, snapshot) 方法会在组件重新渲染完成之后调用。我们可以看到这时参数名已变成 prevProps和prevState,保存的是更新之前的 props和state。在这个方法中,可以去执行DOM操作,也可以去做网络请求等操作。这里虽然可以调用 setState()方法,不过需要注意加判断逻辑,避免无限循环。

react.js 16.3版本后,实际上,在官方的最新文档中,有几个生命周期方法已被标记为 UNSAFE

  • UNSAFE_componentWillMount()
  • UNSAFE_componentWillUpdate()
  • UNSAFE_componentWillReceiveProps()

这几个方法对应的无前缀方法如下:

  • componentWillMount()
  • componentWillUpdate()
  • componentWillReceiveProps()

static getDerivedStateFromProps(props, state)这是在 React 16.3 新加入的方法,主要是为了避免在 UNSAFE_componentWillReceiveProps 中使用setState()而产生的副作用。生命周期为下图所示

参考

  • https://mp.weixin.qq.com/s/mvhk2ehvS_fL3wO_tELdoA

你可能感兴趣的:(ReactNative初步)