react处理多次请求_React组件的生命周期

38b54d0656bab62a02f8d6f9e4bc967e.png

《快速上手React编程》CH5 React组件的生命周期

React组件的生命周期有仨,挂载、更新、卸载。字面意思,挂载就是建立React对象与实际DOM的联系,更新就有新的状态或者属性的时候触发变更,卸载就是解除这一联系。

这三个生命周期对应了一些事件,事件可以理解成这些生命周期的钩子,可以在这些事件发生的前前后后进行拦截,搞一些额外的操作。这些事件定义在类里会被React在该执行的时候,直接调用(重构父组件方法)。

constructor在这三个生命周期之前。

另外还有一个this.forceUpdate方法,可以用于强制刷新,不依赖state和props的变更,场景是render使用了不属于state和props的数据时使用,但是官方不建议这么用,因为“它让组件变得不纯”,不再是个纯函数了,我感觉像个外挂,render不应该依赖state和props以外的数据,的确不用最好。

1、挂载:

挂载有俩事件,componentWillMount和componentDidMount,前者在服务端同构代码里会被执行,后者不会,所以写在后者里的逻辑可以确保只在前端执行。前者执行的时候还没有挂载,后者执行了就是真实DOM准备好了(子组件也挂载好了,子组件的componentDidMount会比父组件的这个函数先执行)。

用途:

1) componentWillMount :可以在componentWillMount的时候调用setState,防止在DOM挂载好之前,多次setState,导致react元素被多次render,这些render的中间结果都不会被显示在DOM上,只有最后一次会,所以写这里可以避免这些中间结果的渲染。

2) componentDidMount:一个是因为仅在浏览器执行,所以在服务器/浏览器代码同构的时候,可以用于保证代码仅在浏览器执行。另一个是有DOM了再去拿数据,因为拿数据是异步的,写在componentWillMount里,不能保证数据先好还是DOM挂载先好,逻辑上行为不好预测。所以DOM好了再去拿数据,比较稳。

感觉考虑上主要是什么时候setState不会触发额外渲染,以及异步请求在事件里的执行顺序。

2、更新:

更新有四个事件

1) 收到新属性前 componentWillReceiveProps,

2) 是否要更新 shouldComponentUpdate,

3) 更新前 componentWillUpdate,

4) 更新后 componentDidUpdate。

这四个事件都只在更新的时候会被触发,初始化的时候,都不会被调用。它们分别在更新组件属性、更新组件状态、使用this.forceUpdate三种情况下有不同的执行顺序。

更新组件属性-事件顺序:收到新属性前、是否需要更新、更新前、render、更新后。

更新组件状态-事件状态:是否需要更新、更新前、render、更新后。

this.forceUpdate-事件状态:更新前、render、更新后。

很容易理解,要更新组件属性才有“收到新属性”这件事,强制更新就不用判断是不是需要更新了,一定要更新的。

1) componentWillReceiveProps(newProps):

在父组件传递新的props时会被触发,这时候可以允许类根据新的props设置自己的状态值。但是需要注意的是,新的props不一定跟老的props不同,可能是完全相同的,这个事件也一样会被调用。估计是父组件被setState了就会出这个事件。

2) shouldComponentUpdate(newProps, newState)

这个函数如果返回false,React将不会重新渲染。

感觉上是,React虽然有算法计算虚拟DOM的差别,但是如果这里人为控制它不去渲染,可以节约这部分算法的性能损耗,这在处理多个(书中是“上百个”)组件时有用。

3) componentWillUpdate(newProps, newState)

渲染前,此时this.props和this.state还是老值,没有更新。

这里不要使用setState,因为在这里setState会重新触发这个函数,瞎玩会死循环。

4) componentDidUpdate(oldProps, oldState)

渲染后。这里DOM保证更新好了,可以写一些依赖更新后DOM的业务逻辑。

3、卸载

它就一个事件,componentWillUnmount,也很好理解,组件卸载前,父组件用不到这个子组件了,子组件就会触发卸载,这里可以清除子组件的定时器、DOM上的事件监听等逻辑,防止内存泄漏。

其它知识点:

window的onResize可以监听浏览器大小变更。

ReactDOM.findDOMNode(this)可以拿到当前组件挂载的真实节点。

window的onbeforeunload可以监听tab页的关闭事件。

写状态最好在constructor里初始化,避免在render函数里判断状态是否存在。

内存泄漏:Js内存泄漏及解决方案 - carekee - 博客园

——————————————————————————————————————

感觉这一章是React玩花板子的根基,我看得比较细。

借助这些东西,可以对性能进行优化,可以明确什么时候有实际DOM。

寥寥此生虚度 - 暗杠 - 单曲 - 网易云音乐​music.163.com
93c6f25eceff9457520afe19e27597d7.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值