React之生命周期

注:这里写的生命周期只是我用到过,还有比较常用的钩子函数,个人觉得react的生命周期用的流畅,react技术应该挺不错的了
先看一张图,用久了,错多了,这个图也会慢慢看懂的


1106982-20170811224737742-1564011484.jpg

react中的state改变时,都会调用componentWillUpdate,render,componentDidUpdate,这三个方法来重新渲染DOM(shouldComponentUpdate这个方法默认返回true)。

1.componentWillMount

1.componentWillMount() 是在组件挂载(mount)之前被调用.
2.componentWillMount()是唯一一个在服务器端渲染(ssr)调用的生命周期钩子
3.关于 setState 在 componentWillMount 使用:可以使用。因为它是 render 方法之前被调用,因此 setState 也不会导致重绘(re-render)

2. componentDidMount

componentDidMount() 在组件挂载之后立即执行
在这个钩子里合适:
a).ajax 请求,(会引出一个面试题)
b).初始化DOM节点的操作
c).设置计时器 setTimeout 或者 setInterval (温馨提示,别忘了在componentWillUnmount 关闭这些计时器)

关于 setState 在 componentDidMount 使用: 可以使用。但是经常导致性能问题。当然非要在 render 前拿到 DOM 节点的大小和位置,是可以用的。

3. componentWillReceiveProps(nextProps)

1.组件初次渲染时不会执行componentWillReceiveProps;
2.当props发生变化时执行componentWillReceiveProps;
3.在这个函数里面,旧的属性仍可以通过this.props来获取;
4.此函数可以作为 react 在 prop 传入之后, render() 渲染之前更新 state 的机会。即可以根据属性的变化,通过调用this.setState()来更新你的组件状态,在该函数中调用 this.setState() 将不会引起第二次渲染。
5.也可在此函数内根据需要调用自己的自定义函数,来对prop的改变做出一些响应。
6.更新 state 的值(比如重置)

componentWillReceiveProps (nextProps,nextState) {
        //其中接受一个参数是nextProps:为父组件传过来新的props,而 旧的属性还是可以通过this.props来获取!
        //第一次render时是不会被调用的
        //console.log(nextProps) 父组件传入的最新值
        //console.log(this.props) 上一次加载的值
        //组件初始化时不调用,组件接受新的props时调用。
        //如果当前点击的按钮传入的参数,与上一次传入的参数不一样的判断
        if(nextProps.farther!=this.props.farther){
                console.log("发送"+nextProps.farther+"的请求")
               this.setState({
                    children:nextProps.farther
              })
        }
      
    }

注意:当父组件向子组件传递引用类型(或复合类型,比如对象、数组等)的属性时,要注意打印的this.props和nextProps的内容是一致的,因为引用类型在内存中只有一份,传值时是浅拷贝

4. shouldComponentUpdate(nextProps, nextState)

  1.当改变state 或者 props 并且是在render之前会调用shouldComponentUpdate,说白了就是该钩子函数用于告诉 React 组件是否需要重新渲染。
  2.shouldComponentUpdate 默认return true,如果return false componentWillUpdate、render、componentDidUpdate都将不会被调用。千万记住一点, 当return false时,当他们的 state 发生改变时,并不会阻止子组件(child component)进行重新渲染。
  3.shouldComponentUpdate在两种情况下不会被调用:
     组件初始化
    使用forceUpdate的情况
  4. shouldComponentUpdate 还有一个知识点就是和 react 组件性能优化相关的。你可以this.state 和 nextState、this.props 和 nextProps 做比较来决定出 return false 并告诉 react 可以不更新该组件。如果做的只是一些浅层的数据比较完全可以用 PureComponent 来代替(深层的嵌套数据PureComponent也无能为力)。react 不建议在 shouldComponentUpdate 做深层的对比或者用 JSON.stringify(),因为这样反而损害到性能。

附加生命周期table

生命周期 是否可以调用this.setState 初始化是否执行
componentWillMount 可以
componentDidMount 可以
componentWillReceiveProps 可以
shouldComponentUpdate 不可以
componentWillUpdate 不可以
componentDidUpdate 可以
componentWillUnmount 不可以

特别特别特别注意:
①componentWillMount 和 componentWillReceiveProps 调用 setState 不会重复渲染(re-render)
②componentDidUpdate,不能直接 this.setState, 不然会溢出栈。需要对 prevProps 与 this.props 和 prevState 和 this.state 做一个判断再执行 this.setState。就类似while循环不能陷入死循环。

原作链接:https://www.jianshu.com/p/4d2838ae7b29

你可能感兴趣的:(React之生命周期)