zoukankan      html  css  js  c++  java
  • 面试题:react生命周期

    一:挂载卸载

    1、constructor:

    react数据的初始化,他接收2个参数,props和context。如果要使用这两个参数,就要使用super(),否则会造成this指向错误。
    

    2、componentWillMount

    用在服务端渲染时使用。组件已经经历了constructor初始化数据,但还未渲染DOM.
    

    3、componentDidMount

    组件第一次渲染完成,dom节点已生成。可以在这里请求ajax,返回数据setState后,组件会重新渲染。
    

    4、componentWillUnMount

    在此次完成组件的卸载和数据的销毁。
    可以移除 setTimeout 、setInterval、组件的监听等。

    二:更新

    1、componentWillReceiveProps(nextProps)

    在接收父组件改变后的props,需要重新渲染组件时使用。
    接收参数nextProps
    对比this.props 和 nextProps 将nextProps的state改为当前的state,页面可以重新渲染。
    

    2、shouldComponentUpdate(nextProps,nextState)

    主要用于性能优化。
    唯一控制组件重新渲染的声明周期。由于setState之后,页面会重新渲染,但是这里如果返回false,则会阻止渲染更新。
    原因:react父组件的重新渲染会导致所有子组件也重新渲染。这时不需要子组件全部跟着重新渲染的,可以在子组件的这个声明周期中进行判断是否需要渲染。
    

    3、componentWillUpdate(nextProps,nextState)

    shouldComponentUpdate,返回true后,组件进入重新渲染的进程。
    此时进入componentWillUpdate中,也可以同样拿到nextProps和nextState
    

    4、componentDidUpdate(prevProps, prevState)

    组件更新完毕后,react只会在第一次初始化成功会进入componentDidMount,之后每次重新渲染都会进入到componentDidUpdate中,在这里可以拿到prevProps和prevState,也就是更新前的props和state 

    三:render()

    render函数会插入jsx生成dom结构,react会生成一个虚拟dom树,在每一次组件更新的时候,react会通过diff算法比较更新前后的dom树,比较dom后找到最小差异的dom节点,并重新渲染
    

      

    新增加的声明周期:

    1、getDerivedStateFromProps(nextProps,nextState)

    代替 componentWillReceiveProps

    componentWillReceiveProps:
    判断前后两个props是否相同,如果不同,将新的的props更新到对应的state上去。
    这样处理会 破坏 state数据的单一数据源,导致组件状态变得不可预测,也会增加重绘次数。
    getDerivedStateFromProps:
    在新版本中的更新 state 与触发回调重新分配到,getDerivedStateFromProps中触发条件,在componentDidUpdate中进行数据的更新。使数据结构更加清晰。而且在getDerivedStateFromProps中禁止使用this.props ,强制比较nextProps和prevState的值,以确保在根据当前的props来更新state的值。

    2、getSnapshotBeforeUpdate(prevProps, prevState)

    代替componentWillUpdate

    componentWillUpdate:
    在组件更新前,读取某个dom元素的状态,并在componentDidUpdate中更新。
    
    区别:
    1、在react开始渲染模式后,在render阶段读取到的dom元素状态并不总是和commit阶段相同,这就导致componentDidUpdate中使用componentWillUpdate中读取到的元素已失效。
    2、getSnapShotBeforeUpdate会在最终的render之前被调用,也就是getSnapShotBeforeUpdate中读取到的dom状态可以保证和componentDidUpdate一至。
    此生命周期返回的任何值,都作为参数传递给componentDidUpdate中。
    

      

      

  • 相关阅读:
    OSPF
    【今日CS 视觉论文速览】 24 Jan 2019
    【今日CS 视觉论文速览】Wed, 23 Jan 2019
    【今日CS 视觉论文速览】 21 Jan 2019
    【Processing学习笔记】安装与入门
    【今日CS 视觉论文速览】Part2, 18 Jan 2019
    【今日CS 视觉论文速览】Fri, 18 Jan 2019
    【今日CS 视觉论文速览】Thu, 17 Jan 2019
    【今日CS 视觉论文速览】Part2, 16 Jan 2019
    【今日CS 视觉论文速览】Wed, 16 Jan 2019
  • 原文地址:https://www.cnblogs.com/liumcb/p/13954793.html
Copyright © 2011-2022 走看看