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开发模式
模式对比

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组件

<Clock clickAction={() => {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 (
            <TouchableOpacity
                onPress={() => {
                    if (this.props.clickAction) {
                        this.props.clickAction();
                    }
                }}
            >
                <View style={styles.view}>
                    <Text style={styles.text}>
                        {'Stay ' + this.state.secondCount + 's'}
                    </Text>
                </View>
            </TouchableOpacity>
        );
    }
}

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

export default Clock;

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

生命周期

生命周期
  • 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()而产生的副作用。生命周期为下图所示

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,439评论 1 33
  • 介绍 React Native是Facebook在React.js Conf2015大会上推出的一个用于开发And...
    JimmyOu阅读 985评论 0 0
  • 起步 安装官方脚手架: npm install -g create-react-app 创建项目: create-...
    Twoold阅读 1,215评论 0 0
  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 1,010评论 0 1
  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 2,818评论 0 24