- 挂载时
- 更新时
- 卸载时
https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram
https://zh-hans.reactjs.org/docs/react-component.html#static-getderivedstatefromprops
componentWillUpdate死循环问题
- shouldCompnentUpdate & componentWillUpdate中不能修改 this.setState
- 会引起循环引用,导致 render无法被调用,死循环
- componentWillReceiveProps中修改 this.setState也会引起死循环
- antd Form.setFieldValues也会引起死循环,一定要对比值
state问题
- 只有在 render及之后的声明周期方法中,this.state才指向更新后的 state
- render之前的方法
- shouldComponentUpdate
- componentWillUpdate
- this.state指向的是更新前的 state
常用的生命周期
- 只有 class类组件才有声明周期
- 函数组件没有生命周期;不要在函数组件中调用声明周期方法
1 挂载时
2 更新时
3 卸载时
- componentWillUnmount 组件被卸载前调用
- 执行清除工作
- 清除定时器,绑定的事件,第三库的DOM元素;避免内存泄漏
全部的生命周期
getDerivedStateFromProps
- static getDerivedStateFromProps
static方法里面,没有 this
- https://zh-hans.reactjs.org/docs/react-component.html#static-getderivedstatefromprops
- return null 不渲染 ```jsx class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; }
static getDerivedStateFromError(error) { // 更新 state 使下一次渲染可以显降级 UI return { hasError: true }; } render() { if (this.state.hasError) { // 你可以渲染任何自定义的降级 UI return
Something went wrong.
; } return this.props.children; } } ```
getSanpshotBeforeUpdate
static getSanpshotBeforeUpdate
- https://zh-hans.reactjs.org/docs/react-component.html#getsnapshotbeforeupdate ```jsx class ScrollingList extends React.Component { constructor(props) { super(props); this.listRef = React.createRef(); }
getSnapshotBeforeUpdate(prevProps, prevState) { // 我们是否在 list 中添加新的 items ? // 捕获滚动位置以便我们稍后调整滚动位置。 if (prevProps.list.length < this.props.list.length) { const list = this.listRef.current; return list.scrollHeight - list.scrollTop; } return null; }
componentDidUpdate(prevProps, prevState, snapshot) { // 如果我们 snapshot 有值,说明我们刚刚添加了新的 items, // 调整滚动位置使得这些新 items 不会将旧的 items 推出视图。 //(这里的 snapshot 是 getSnapshotBeforeUpdate 的返回值) if (snapshot !== null) { const list = this.listRef.current; list.scrollTop = list.scrollHeight - snapshot; } }
render() { return (
{/ …contents… /}); } } ```