React 生命周期及相关用法

2019-12-31  本文已影响0人  行走的蛋白质
react 生命周期 react 生命周期
阶段详解
constructor(props, context) {
    super(props, context)
}

注:只要使用了 constructor() 就必须写 super() 否则会导致 this 的指向错误。

componentWillReceiveProps(nextPorps) {
    nextPorps.matchIndex !== this.state.matchIndex && this.setState({
        matchIndex: nextPorps.matchIndex
    }, () => {
        console.log(this.state.matchIndex:nextPorps)
    })
}
componentDidMount() {
    this.isMount = true
    axios.post().then((res) => {
        this.isMount && this.setState({
            xxx: res
        })
    })
}
componentWillUnMount() {
    this.isMount = false
}
// before
componentWillReceiveProps(nextProps) {
    if(nextProps.isLogin !== this.props.isLogin) {
        this.setState({
            isLogin: nextProps.isLogin
        })
    }

    if(nextProps.isLogin) {
        this.handleClose()
    }
}

// after
static getDerivedStateFromProps(nextProps, prevState) {
    if(nextProps.isLogin !== prevState.isLogin) {
        return {
            isLogin: nextProps.isLogin
        }
    }

    return null
}
componentDidUpdate(prevProps, prevState) {
    if(!prevState.isLogin && this.props.isLogin) {
        this.handleClose()
    }
}

两者最大的不同:
在 componentWillReceiveProps 中我们做两件事:
1.根据 props 来更新 state
2.触发一些回调,比如动画或者页面跳转等。
而在新版本中:
1.官方将更新 state 与触发回调重新分配到了 getDerivedStateFromProps 与 componentDidUpdate 中,使得组件整体的更新逻辑更加清晰。
2.在 getDerivedStateFromProps 中还禁止了组件去访问 this.props,强制让开发者去比较 nextProps 和 prevState 中的值,以确保当前开发者用到 getDerivedStateFromProps 这个函数的时候就是根据当前的 props 来更新组件的 state,而不是去做一些其它让组件自身状态变的不可预测的事情。

上一篇下一篇

猜你喜欢

热点阅读