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中。
    

      

      

  • 相关阅读:
    Python之__slots__
    Python之methodtype方法
    Postman+Newman+Jenkins+Git持续集成时遇到的问题
    Postman接口测试_Jenkins实现持续集成构建流程01
    Git常用命令
    Postman接口测试_Newman运行集合脚本
    Postman接口测试_创建工作流
    使用OpenXML操作PPT公共方法总结
    EPPlus实现Excel工作簿中插入图片
    centos7配置tomcat为系统服务(systemctl进行管理)
  • 原文地址:https://www.cnblogs.com/liumcb/p/13954793.html
Copyright © 2011-2022 走看看