react

react 常用生命周期

2019-07-31  本文已影响0人  违背

gitbub https://github.com/15997111963/about_react_lifeCycle

以下UNSAFE_开头的周期都是官方将要废弃的周期

保留UNSAFE_前缀还可以继续使用 在最新的16.9中将抛出warning 在17.0的大版本中彻底移除componentWillMount、componentWillUpdate、componentWillReceiveProps这三个生命周期 帮助理解 但不建议继续使用和学习

组件挂载时

constructor()

static getDerivedStateFromProps(props, state)

在我个人看来这个周期是主要为了能更好的派生数据 很多时候我们当前需要用到的数据来自于props而我们也无法直接使用props需要进行二次派生 这个时候我们就可以用这个周期将派生的数据存在state里以供使用 而不是频繁的触发componentWillReceiveProps不停的render()

static getDerivedStateFromProps(props, state) {
    if (state.data.length === 0 && props.data.length) {
        return { data: props.data }
    }
    return null
}

此方法的用法很好理解 是否需要更新state 不需要就return null 如果需要 可以根据props和上一次的state做一些简单的比较 return的对象就会更新state

如果我们只想要更新state里的data 但不更新其他的 我们不需要像redux里一样return {...state, data} 我们只需要更新自己想要更新的那一条就可以了

对于上面讲到的很多时候需要根据当前props和下一次进行比较而做一些业务或是更新 这个时候我们就可以考虑使用componentDidUpdate 甚至是 shouldComponentUpdate(当然 考虑到周期的取名和合理性 我们还是尽量避免这种姿势)

UNSAFE_componentWillMount()

render()

componentDidMount()

update更新时

既然是更新时 那就代表 下面这些会按顺序全部都触发!
当然 不完全是这样 组件内部state的更新不会触发UNSAFE_componentWillReceivePropsgetDerivedStateFromProps
但如果是组件内部的state更新了 子组件用到了这里的state(也就是子组件的props 父组件的state) 则会遵循规则 子组件会触发这些周期 组件之间都会遵循这些机制

UNSAFE_componentWillReceiveProps(nextProps, nextState)

    UNSAFE_componentWillReceiveProps(nextProps, nextState) {
        if (this.state.visible !== nextProps.visible) {
            this.setState({ visible: nextProps.visible })
        }
    }

static getDerivedStateFromProps(props, state)

shouldComponentUpdate(nextProps, nextState)

官方认为state每次更新了 就应该重新render 大部分情况下我们应该遵循渲染的规则

大多出现在需要优化的地方propsstate不可控 频繁触发render的时候 如长时间的倒计时等

只作为优化而存在 也可参考使用PureComponent浅比较组件

若你使用的是纯函数式组件也想达到此效果或是目的可以使用React.memo()

如果你也在同时学习或使用hook 你也可以使用useMemo

    shouldComponentUpdate(nextProps, nextState){
        if (this.props.value !== nextProps.value) {
            return true
        }
        return false
    }

UNSAFE_componentWillUpdate(nextProps, nextState)

getSnapshotBeforeUpdate(prevProps, prevState)

render()

componentDidUpdate(prevProps, prevState, snapshot)

    componentDidUpdate(prevProps, prevState, snapshot) {
        if (this.props.value !== prevProps.value) {
          this.changeValue(this.props.value)
        }
    }

卸载时

componentWillUnmount()

componentWillUnmount() {
    this.setState = (state, callback) => { return }
    window.removeEventListener()
    clearInterval()
}

这是本人曾经学习到使用后来一点点积累的笔记整理出来的 仅供参考 如果有写的不对的有是遗漏 欢迎及时指出

上一篇 下一篇

猜你喜欢

热点阅读