请详述 React 组件的生命周期主要划分为哪几个阶段,并分别指出在这些阶段中会触发哪些生命周期函数?
考察说明
考查对 React 组件生命周期阶段划分及其对应钩子函数的理解。
回答思路
- 【回答框架 1】React 组件生命周期主要分为三个阶段:挂载阶段、更新阶段和卸载阶段。挂载阶段依次执行 constructor、static getDerivedStateFromProps、render、componentDidMount;更新阶段在 props 或 state 变化时,会执行 static getDerivedStateFromProps、shouldComponentUpdate、render、getSnapshotBeforeUpdate、componentDidUpdate;卸载阶段执行 componentWillUnmount。
- 【回答框架 2】React 16 之后引入了新的生命周期函数,并标记了 componentWillMount、componentWillReceiveProps、componentWillUpdate 为不安全的生命周期,建议使用 getDerivedStateFromProps 和 getSnapshotBeforeUpdate 替代。getDerivedStateFromProps 是静态方法,在每次渲染前调用,用于根据 props 派生 state;getSnapshotBeforeUpdate 在 DOM 更新前调用,其返回值会作为 componentDidUpdate 的第三个参数。
- 【回答框架 3】constructor 中需要注意不能调用 this.setState,应直接给 this.state 赋值;render 必须为纯函数,不应执行副作用操作。componentDidMount 适合执行异步请求、订阅事件或操作 DOM;componentDidUpdate 中需要比较前后 props 或 state,以避免无限循环;componentWillUnmount 中必须清理定时器、取消订阅等,防止内存泄漏。
- 【回答框架 4】在函数组件中,生命周期通过 useEffect 等 Hook 来模拟,useEffect 支持在依赖变化时执行副作用,其清理函数对应 componentWillUnmount 的行为;同时还可以通过 useLayoutEffect 在 DOM 变更后同步执行副作用。
- 【回答框架 5】React 18 中 Strict Mode 会在开发环境模拟组件挂载、卸载、再挂载的过程,以帮助发现副作用问题;生产环境不受影响。因此在实际开发中,需关注生命周期函数内的幂等性。
- 【关键点 1】React 生命周期三阶段:挂载、更新、卸载。
- 【关键点 2】旧版生命周期函数如 componentWillMount 等已标记不安全,推荐使用新版 getDerivedStateFromProps 与 getSnapshotBeforeUpdate。
- 【关键点 3】挂载时顺序:constructor -> getDerivedStateFromProps -> render -> componentDidMount。
- 【关键点 4】更新时常见顺序:getDerivedStateFromProps -> shouldComponentUpdate -> render -> getSnapshotBeforeUpdate -> componentDidUpdate。
- 【关键点 5】函数组件用 useEffect 模拟生命周期,并需在清理函数中处理取消订阅等操作。
- 【易错点 1】在 constructor 中调用 setState 会引发警告,应在 constructor 中直接给 state 赋值。
- 【易错点 2】shouldComponentUpdate 中未深比较对象或数组可能导致不必要的渲染或遗漏更新,注意使用 immutable 数据。
- 【易错点 3】在 componentDidUpdate 中不进行条件判断就调用 setState,可能造成无限循环更新。