React 的几个注意点

受控组件和无状态组件

  • 非受控组件

    • 推荐使用受控组件来实现表单. 在受控组件中, 表单数据是有React组件处理
    • 如果让表单数据有DOM处理时, 替代方案为使用非受控组件
    • <input type="text" ref={input =>this._name = input} /> 如是, 不通过value控制其值,
  • 受控组件

    • <input type="text" value={this.state.name} onChange={this.handleNameChange}/>
    • 以上handleNameChange获取输入的值 this.setState({ name: event.target.value }); 赋值给state, 然后在触发刷新, 对用input的value赋新的值
  • 无状态组件

    • 语法简洁, 占内存小(少了class的诸多属性), 无副作用(纯函数), 函数式写法(柯里化)

    • 函数式组件: 使用props

      function Welcome(props) { return <h1>Hello, {props.name}</h1>; }

    • 状态组件/类组件的优点:

      • 可以使用this
      • 拥有局部状态: this.state
      • 声明周期钩子

生命周期流程

  • 父子组件嵌套的生命周期, 先初始化父组件, 在父组件的render组件中初始化子组件, 当子组件都创建完成后(都完成了componentDidMount方法后) 父组件执行componentDidMount

  • 启动过程

    father constructor
    father componentWillMount
    father render
    son constructor
    son componentWillMount
    son render
    son componentDidMount
    father componentDidMount
    
  • 组件更新过程

    son componentWillReceiveProps
    son shouldComponentUpdate 根据返回值 true/false 决定是否继续执行
    son componentWillUpdate
    son render
    son componentDidUpdate
    

setState() 执行流程, 生命周期.

  • 从源码全面剖析 React 组件更新机制---这个说的好,可以多看几遍

  • 利用队列机制管理state, 避免重复的view刷新

  • replaceState({}) 会完全替代原有的state, setState不会影响未涉及的state

  • 如果组件正处于创建或更新组件阶段,则把新的更新放入dirtyComponents稍后处理

    • 故getInitialState,componentWillMount, render,componentWillUpdate 中setState都不会引起updateComponent。但在componentDidMount和componentDidUpdate中则会。
  • 主要流程如下

    • 1.enqueueSetState将state放入队列中,并调用enqueueUpdate处理要更新的Component

    • 2.如果组件当前正处于update事务中,则先将Component存入dirtyComponent中。否则调用batchedUpdates处理。

    • 3.batchedUpdates发起一次transaction.perform()事务

    • 4.开始执行事务初始化,运行,结束三个阶段

      • 1.初始化:事务初始化阶段没有注册方法,故无方法要执行

      • 2.运行:执行setSate时传入的callback方法,一般不会传callback参数,

      • 3.结束:更新isBatchingUpdates为false,并执行FLUSH_BATCHED_UPDATES这个wrapper中的close方法

      • FLUSH_BATCHED_UPDATES在close阶段,会循环遍历所有的dirtyComponents,调用updateComponent刷新组件,并执行它的pendingCallbacks, 也就是setState中设置的callback。第二个参数?
        
  • 我的理解: setState 修改state是异步操作, 意思就是不能立即获取this.state 修改的值, 当调用了setState后,把本次操作放入队列中, 如果组件未在创建/更新,那么立即执行更新流程, 如果组件在刷新,那么本次更新操作放入稍后执行的队列中等待执行.

  • 批处理时会把待处理数组中每一个操作从第一个依次传递给后一个,直到待处理操作为空,把最后的结果设置给state

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

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,408评论 1 33
  • 说在前面 关于 react 的总结过去半年就一直碎碎念着要搞起来,各(wo)种(tai)原(lan)因(le)。心...
    陈嘻嘻啊阅读 6,840评论 7 41
  • 已经是高三的下学期,顾安也每天只睡五个小时,她不得不拼命,因为她很清楚,这是她唯一能够咸鱼翻身的机会。班上...
    鹿崝阅读 472评论 0 0
  • 中老年人在5点半,就生物钟自动醒来。 热情饱满地赶往了老年人活动中心~ 发现太早没有开门后,匆匆吃了个贵价早餐(1...
    丸子Sophia阅读 199评论 0 0
  • 小时候以为世界就那么大,长大了才知道,原来世界没有边界。 开始渴望能早早的等来一班车,哪怕是最后一班,也...
    dumpling_阅读 202评论 0 1