标签:变化 receive 说明 否则 初始化 state ret 情况 his
本篇文章我们来学习 React 的生命周期
大部分团队不见得会跟进升到 16.0 以后版本,所以我们先来学习 16.0 以前的生命周期
这里我画了一张流程图,我们根据本图来分析:
也就是以下代码中类的构造方法( constructor() ), Test 类继承了 react Component 这个基类,也就继承这个 React 的基类,才能有 render(),生命周期等方法可以使用,这也说明为什么 函数组件不能使用这些方法 的原因。
super(props) 用来调用基类的构造方法( constructor() ), 也将父组件的 props 注入给子组件,功子组件读取(组件中 props 只读不可变,state 可变)。 而 constructor() 用来做一些组件的初始化工作,如定义 this.state 的初始内容。
import React, { Component } from 'react';
class Test extends Component {
constructor(props) {
super(props);
}
}
在讲述此阶段前需要先明确下 React 组件更新机制。setState 引起的 state 更新或父组件重新 render 引起的 props 更新,更新后的 state 和 props 相对之前无论是否有变化,都将引起子组件的重新 render 。
class Child extends Component {
shouldComponentUpdate(nextProps){ // 应该使用这个方法,否则无论props是否有变化都将会导致组件跟着重新渲染
if(nextProps.someThings === this.props.someThings){
return false
}
}
render() {
return <div>{this.props.someThings}</div>
}
}
第二种:在 componentWillReceiveProps 方法中,将 props 转换成自己的 state
class Child extends Component {
constructor(props) {
super(props);
this.state = {
someThings: props.someThings
};
}
componentWillReceiveProps(nextProps) { // 父组件重传props时就会调用这个方法
this.setState({someThings: nextProps.someThings});
}
render() {
return <div>{this.state.someThings}</div>
}
}
根据官网的描述
在该函数( componentWillReceiveProps )中调用 this.setState() 将不会引起第二次渲染。
是因为 componentWillReceiveProps 中判断 props 是否变化了,若变化了,this.setState 将引起 state 变化,从而引起 render ,此时就没必要再做第二次因重传 props 引起的 render 了,不然重复做一样的渲染了。
2.组件本身调用 this.setState,无论 state 有没有变化。可通过 shouldComponentUpdate 方法优化。
class Child extends Component {
constructor(props) {
super(props);
this.state = {
someThings:1
}
}
shouldComponentUpdate(nextStates){ // 应该使用这个方法,否则无论state是否有变化都将会导致组 件重新渲染
if(nextStates.someThings === this.state.someThings){
return false
}
}
handleClick = () => { // 虽然调用了setState ,但state并无变化 const preSomeThings = this.state.someThings
this.setState({
someThings: preSomeThings
})
}
render() {
return <div onClick = {this.handleClick}>{this.state.someThings}</div>
}
}
shouldComponentUpdate(nextProps, nextState)
此方法通过比较 nextProps,nextState 及当前组件的 this.props, this.state,返回 true 时当前组件将继续执行更新过程,返回 false 则当前组件更新停止,以此可用来减少组件的不必要渲染,优化组件性能。
这边也可以看出,就算 componentWillReceiveProps() 中执行了 this.setState ,更新了 state,但在 render 前 (如 shouldComponentUpdate ,shouldComponentUpdate ), this.state 依然指向更新前的 state ,不然 nextState 及当前组件的 this.state 的对比就一直是 true 了。
componentDidUpdate(prevProps, prevState)
此方法在组件更新后被调用,可以操作组件更新的 DOM,prevProps 和 prevState 这两个参数指的是组件更新前的 props 和 state
componentWillUnmount
此方法在组件被卸载前调用,可以在这里执行一些清理工作,比如清楚组件中使用的定时器,清楚 componentDidMount 中手动创建的 DOM 元素等,以避免引起内存泄漏。
标签:变化 receive 说明 否则 初始化 state ret 情况 his
原文地址:https://www.cnblogs.com/-muzi/p/11964834.html