在哪些生命周期中可以修改组件的state?
在 React 类组件 中,只有某些生命周期可以安全地修改(setState)组件的 state。
哪些生命周期可以修改 state?
可以使用 setState 的生命周期
1. constructor(不推荐 setState)
可以直接给 this.state 赋值,但 不能用 setState。
constructor() {
super();
this.state = { count: 0 }; // OK
}
2. componentDidMount(可以 setState)
组件挂载后可以安全更新状态,比如请求数据。
componentDidMount() {
this.setState({ count: 1 });
}
3. componentDidUpdate(可以 setState:需条件判断)
必须加条件判断,否则会死循环!
componentDidUpdate(prevProps) {
if (prevProps.value !== this.props.value) {
this.setState({ value: this.props.value });
}
}
4. componentWillUnmount(不用于修改 UI)
可以 setState,但 不会触发重新渲染(因为组件已卸载),所以一般没意义。
通常用于清理,不建议 setState。
5. getDerivedStateFromProps(不推荐,但允许:返回新 state)
静态方法,不能用 setState,但可以通过返回值更新 state。
static getDerivedStateFromProps(nextProps, prevState) {
if (nextProps.value !== prevState.value) {
return { value: nextProps.value }; // 更新 state
}
return null;
}
6. getSnapshotBeforeUpdate(不能 setState)
不允许 setState。
绝对不能修改 state 的生命周期
| 生命周期 | 能否修改 state? | 原因 |
|---|---|---|
| render | ❌ 不能 | 会造成无限循环渲染 |
| shouldComponentUpdate | ❌ 不能 | 不能副作用,必须纯函数 |
| componentWillMount (废弃) | ❌ 不安全 | |
| componentWillReceiveProps (废弃) | ❌ 不安全 | |
| componentWillUpdate (废弃) | ❌ 不安全 |
总结(最重要)
可以 setState 的安全位置:
-
componentDidMount
-
componentDidUpdate(必须加条件判断!)
不推荐但可以:
- getDerivedStateFromProps(通过返回值更新)
禁止:
-
render
-
shouldComponentUpdate
-
getSnapshotBeforeUpdate
-
任何旧版 UNSAFE_ 生命周期
浙公网安备 33010602011771号