8-生命周期

React 组件的生命周期

React.js 将组件渲染,并且构造 DOM 元素然后塞入页面的过程称为组件的挂载。这一节我们学习了 React.js 控制组件在页面上挂载和删除过程里面几个方法:
componentWillMount:组件挂载开始之前,也就是在组件调用 render 方法之前调用。
componentDidMount:组件挂载完成以后,也就是 DOM 元素已经插入页面后调用。
componentWillUnmount:组件对应的 DOM 元素从页面中删除之前调用。

现在我们应该知道一件事情, 有了 组件 和 props, 我们就可以把一个页面拆成一个个小组件.

有了 内部状态, 我们就可以让组件在某些时候做出一些变化.

我们的页面就是通过一个个小的组件, 组合成一个大的组件, 一份份小的 jsx, 组合成一份大的 jsx.

最后交给 ReactDOM.render(), 通过 DOM 操作, 把 Virtual DOM 渲染成浏览器真实的 DOM.

理解生命周期

挂载阶段
组件也是有生命的, 如果一个组件被渲染到了页面, 那么这个组件的生命便开始了.

也就是 Virtual DOM 变成真实 DOM的这个过程. 组件生命的开始也叫组件的挂载.

上代码:

import React from 'react';
import ReactDOM from 'react-dom';

class A extends React.Component {

  render(){
    return (
      <div>
        <p> 数字: 999 </p>
        <button>click once</button>
      </div>
    )
  }
}

ReactDOM.render(
  <div>
    <A/>
  </div>
  , document.getElementById('root'));

<A/> 开始的时候还只是一份虚拟dom, 可一旦把它渲染到浏览器, 我们便说这个组件被挂载了.

更新阶段
说白了就是 setState 导致 React.js 重新渲染组件并且把组件的变化应用到 DOM 元素上的过程,这是一个组件的变化过程。

一个被挂载的组件, 某些时候可能会变化, 也就是被更新:

class A extends React.Component {

  constructor(props){
    super(props);

    this.state = {
      num: Math.random().toString().slice(2, 8)
    };
  }

  changeNum=()=>{
    this.setState({
      num: Math.random().toString().slice(2, 8)
    });
  }

  render(){

    let {num} = this.state;

    return (
      <div>
        <p> 数字: {num} </p>
        <button
          onClick={this.changeNum}
        >click once</button>
      </div>
    )
  }
}

我们改造下 A 组件. 每次点击按钮, 数字就会改变. 也就是这个组件会变化, 这个时候, 我们就说这个组件被更新了.

卸载阶段 当一个已经被挂载的组件从页面删除掉, 那么这个组件实例的生命就结束了. 我们就说这个组件被卸载了.

我们改一下上面的代码:

class B extends React.Component{

  render(){
    return (
      <div>我是组件 B</div>
    )
  }
}

class A extends React.Component {

  constructor(props){
    super(props);

    this.state = {
      isShowB: true
    };
  }

  changeNum=()=>{
    this.setState({
      isShowB: !this.state.isShowB
    });
  }

  render(){

    let {isShowB} = this.state;

    return (
      <div>
        {
          isShowB ? (
            <B/>
          ) : (
            <p>我不是B</p>
          )
        }
        <button
          onClick={this.changeNum}
        >click once</button>
      </div>
    )
  }
}

在第一次点击按钮之前, 有一个 B 组件的实例被挂载到页面, 而点击按钮之后, 这个 B 组件实例就会被卸载掉.

重复的点击按钮, 就会不断有新的 B 组件实例被挂载, 然后被卸载.

生命周期函数

无论是组件挂载, 更新, 还是卸载. 都是一个瞬间的事情. 但是在这个瞬间执行之前和之后, React 会调用一些函数, 我们把这些函数叫做生命周期函数.

Mounting(挂载) 阶段

    • 组件挂载时首先执行
    • 在这里可以:
      • 初始化 state
      • 给事件函数绑定 this
  • componentWillMount()
    • 组件将要挂载时执行
  • render()
    • 返回此刻组件的 JSX 结构
  • componentDidMount()
    • 组件挂载完成后执行
    • 在这里可以:
      • 开启定时器
      • 发起请求
      • 访问真实的 DOM 元素

这些函数是组件挂载阶段执行的函数.

因为一个组件实例只能被出生一次, 也就是一生只能被挂载一次, 所以这些函数在这个组件实例的生命周期中只会执行一次.

当然, render() 函数是个例外. 在挂载阶段它需要返回 JSX 结构, 在更新阶段, 它也需要返回新的 JSX 结构. 所以 render()可能会执行多次.

Updateing(更新) 阶段

  • componentWillReceiveProps( nextProps )
    • 父组件更新的时候执行
  • shouldComponentUpdate( nextProps, nextState )
    • 返回 bool 值, 默认返回 true
    • 如果返回 false, 当前组件不会更新, 之后的生命周期函数不执行
    • 性能优化的主要手段之一
 // 更新前执行的,所以在没有更新之前
    shouldComponentUpdate(nP,nS){
        return !this.props.content === nP.content
    }
  • componentWillUpdate( nextProps, nextState )
    • 组件将要更新时执行
  • render()
  • componentDidUpdate( prevProps, prevState )
    • 组件更新之后执行

Unmounting(卸载) 阶段

  • componentWillUnmount()
    • 组件将要卸载的时候执行
      • 可以在这里:
        • 移除事件绑定
        • 清空定时器
        • 取消请求

很长一段时间, 组件的生命周期就是 挂载, 更新, 卸载三个阶段.

在更新到了 16.0.0 之后, 新增了一个 错误处理的阶段.

新增了一个函数:

  • componentDidCatch( error, info )

当子组件的生命周期函数(包括 render(), constructor()和其他生命周期函数)里面抛出了错误, 那么这个函数就会执行.

注意, 在此组件之下的子组件发生错误的时候才会执行, 组件自身的生命周期函数发生错误不会捕获到.

关于生命周期函数

在上面我们初步了解了组件的生命周期函数, 并且我在每个生命周期函数的下面做了简单的说明.

现在我们只要知道生命周期函数会在什么之后执行就可以了.

有些生命周期会频繁使用, 而有些则会很少用到.

关于如何生命周期函数在什么时候用这种问题, 这需要随着时间, 随着你解决各种业务需求之后, 会慢慢越来越有体会.

现在, 你还不需要太关心这方面的问题.
image.png

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

推荐阅读更多精彩内容

  • 说在前面 关于 react 的总结过去半年就一直碎碎念着要搞起来,各(wo)种(tai)原(lan)因(le)。心...
    陈嘻嘻啊阅读 6,864评论 7 41
  • 生命周期流程图简单如下: 组件让你把用户界面分成独立的,可重复使用的部分,并且将每个部分分开考虑。React.Co...
    Simple_Learn阅读 1,079评论 0 0
  • 了解React生命周期,对我们理解React的工作过程很有帮助。所有的事物都有自己的生命过程,React组件也不例...
    Srtian阅读 228评论 0 0
  • part1 最近的工作状态还是比较不错的,很能明显的感受到自己这一个月成长的很快。 很喜欢这种不注重人际关系的氛围...
    安_1116阅读 259评论 0 0
  • 清早悠悠转醒,忽然发觉已经到四月末 了。我想着还是出去走走,抓住四月的尾巴也是好的。 林徽因有诗——《你是人间的四...
    山非南山阅读 529评论 0 2