React 严格模式(Strict Mode)是一个开发工具,用于在开发环境中识别潜在问题,但不会影响生产环境。它主要帮助开发者发现以下几类问题:
1. 识别不安全的生命周期方法
- 问题:类组件中使用
componentWillMount
、componentWillReceiveProps
、componentWillUpdate
等可能导致副作用的生命周期方法。 - 严格模式行为:在开发环境中发出警告,推荐使用
getDerivedStateFromProps
或componentDidUpdate
替代。
2. 发现意外的副作用
- 问题:在渲染过程中执行副作用(如数据获取、DOM 操作),可能导致重复执行或状态不一致。
- 严格模式行为:
- 双调用检测:在开发环境中故意重复调用以下函数,暴露依赖单一调用的问题:
- 函数组件的主体
useState
、useMemo
、useReducer
的初始化函数
- 示例:
const Example = () => { useEffect(() => { console.log('副作用执行'); // 开发环境会打印两次 return () => console.log('副作用清理'); // 开发环境会调用两次 }, []); return <div>Example</div>; };
- 双调用检测:在开发环境中故意重复调用以下函数,暴露依赖单一调用的问题:
3. 检测过时的 context API
- 问题:使用旧版
React.createContext
和contextType
,可能导致状态管理混乱。 - 严格模式行为:在使用旧版 API 时发出警告,推荐使用新的 Context API(
useContext
Hook)。
4. 暴露遗忘的资源清理
- 问题:未正确清理副作用(如未清除的定时器、未取消的网络请求)。
- 严格模式行为:通过双调用机制模拟组件挂载-卸载-重新挂载的过程,确保清理函数正确处理资源释放。
useEffect(() => { const timer = setInterval(() => console.log('定时任务'), 1000); return () => clearInterval(timer); // 严格模式会验证此清理函数 }, []);
5. 检测意外的状态更新
- 问题:在不可变数据结构中直接修改状态(如
this.state.items.push(newItem)
)。 - 严格模式行为:通过双调用机制暴露因状态突变导致的不一致问题。
6. 准备并发渲染(Concurrent Mode)
- 问题:某些代码模式在并发渲染下可能出错(如同步阻塞渲染)。
- 严格模式行为:提前警告可能在未来并发模式中出现问题的代码。
总结
严格模式通过静态分析和开发时双调用机制,帮助开发者:
- 避免使用已弃用的 API
- 确保副作用安全(可重复执行和正确清理)
- 遵循不可变数据原则
- 为未来 React 特性(如并发模式)做好准备
启用方式:
<React.StrictMode>
<App />
</React.StrictMode>
注意:严格模式仅在开发环境生效,不会影响生产环境的性能和行为。