深入理解React

前段时间参加了一场知乎Live,老师解析得很透彻,昨天仔细又听了几遍,写个笔记分享出来:

理解React的工作原理

本质:

  1. UI = f(data)

    • 数据(props & state)驱动function改变UI
    • 如何实现,对大部分dev来说不care,virtual Dom, DIff函数
    • virtual Dom如何比对:
      • 动态使用子组件的时候一定要使用key
      • diff算法:用来比对文件前后的变化(类似git diff,git diff的算法时间复杂度O(n^3))
      • react放弃比对(如下图:A移动到B),取其次:删除A,R上增加X,B上增加A(O(n)的时间复杂度,从根节点往下比对,先比较类型,类型不同,会触发Mount,类型相同会触发update)
      • image
      • key的作用:由于react使用了另一种比对方式,当遇到如下场景,会产生很多不必要的渲染消耗,动态产生的子组件需要key这个prop:
        image
      • 1.key的值在兄弟节点之间唯一,2.key的值在渲染的过程中要稳定
  2. 一切都是组件
    组件化:软件都像乐高积木一样
    组件化的模型不需要关心别人的积木怎么搭
    react中组件可以做任何事情

  3. 声明式编程 (Declarative Programming)
    实现了申明式:很少去调用react的api,声明式,而不是主动去调用API改变

冒泡:拍桌子-》拍大楼-》拍地球
jq,命名式设计,对冒泡的处理:bind(), live(), delegate(),on()

JSX的优势与局限

争议:HTML内容,CSS样式,JS动态。全都放到一个文件里
结论:应该遵循相关逻辑code应该放到一起的原则
CSS侵入性:引入一个class影响全局css class
麻烦:jsx需要babel,又需要webpack

render函数:
1.花括号里不能写语句,只能写表达式
2.纯函数,不要使用push,reverse。。

使用props还是state

react一切皆组件,小组件组成大组件
props:组件外部传入的数据
state:组件内部的状态,一个组件的state可以作为
传给子组件的数据来源,一个组件改变自己的状态只能改变state,绝对不能修改传入的props


image

尽量构建一个state很少的组件(无状态)尽量使用props解决问题

生命周期

三种过程:

  • mount:从无到有
  • update: 因为状态改变或者属性改变,分为state
    change引发的,和props引发的
  • unmount:从有到无的过程

mount过程:

getDefaultProps(默认props)
getInitialState(初始的state)
componentWillMount(mount之前做的事情)
render(执行这个改变state与props)
componentDidMount(只在浏览器端执行,服务器端吐出来的是字符串)

因state改变引发的update过程:

shouldComponentUpdate
componentWillUpdate
render
componentDidUpdate

因父组件想要render这个组件改变引发的update过程:

componentWillReceiveProps
shouldComponentUpdate(可以截胡,节省不必要的渲染性能开销,提高react性能)
componentWillUpdate
render
componentDidUpdate

为什么尽量使用无状态组件

组件分解,遵守函数式编程的原则,大部分组件以纯函数形式表现(单元测试,少bug)

组件分类为:有状态+无状态有些宽泛,也可以有组件什么都不画

import React from 'react';

export default class HeartBeat extends React.Component {
  render() {
    return null;
  }

  componentDidMount() {
    this.timer = setInterval(() => {
      fetch('/api/v1/heartbeat');
    }, 5000);
  }

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

创建高阶组件(HoC,Higher-Order Component)

HOC应用场景:如果功能在组件之间可以共享,那么创建HOC

包含方式创建:

const HoC = (WrappedComponent) => {
    const WrappingComponent = (props) => (
        <div className="foo">
            <WrappedCompoent {...props} />
        </div>
    );
    return WrappingComponent;
};

继承方式创建(不推荐):

const HoC = (WrappedComponent) => {
    class WrappingComponent extends WrappendComponent {
        render() (
            const {user, ...otherProps} = this.props;
            this.props = otherProps;
            return super.render();
        }
    }
    return WrappingComponent;
};

一个HOC没有说只有一个组件类作为参数:

const HoC = (WrappedComponent, LoginView) => {
    const WrappingComponent = () => {
         const {user} = this.props;  
         if (user) {
            return <WrappedComponent {...this.props} />
         } else {
            return <LoginView {...this.props} />
         }
    };
    return WrappingComponent;
};

组件之间通讯

对react来说,组件间通信的确是一件棘手的事情,所以在构建大型应用的时候,我们不得不引入第三方的东西来处理(比如:redux)

  1. 父子通信关系
    方法一:
    • 父传子:props直接传
    • 子传父:父通过props传递函数让子调用来影响父
      方法二:
    • ref(不推荐)
    • callback(promise)


      父子通信
  2. 兄弟通信关系
    父组件造两个函数传给两个子组件,父组件桥接作用,让两个子组件通信(很笨拙)


    兄弟通信
  3. 任意位置两个组件通信
    全局变量+emmit


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

推荐阅读更多精彩内容