在哪些生命周期中可以修改组件的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_ 生命周期

posted @ 2025-11-21 09:14  煜火  阅读(6)  评论(0)    收藏  举报