React渲染执行两次

在 React 18 中,严格模式(StrictMode)会导致组件在开发模式下执行两次。这是为了帮助开发者检测潜在的问题和副作用。

严格模式的作用
严格模式是一个用于突出显示应用程序中潜在问题的工具。它不会渲染任何可见的 UI,而是为其后代元素触发额外的检查和警告

严格模式的主要作用包括:
检测不安全的生命周期方法:例如,使用过时的字符串 ref API 和 findDOMNode 方法。
检测意外的副作用:例如,useEffect 的副作用。
检测过时的 context API。

为什么会执行两次
在严格模式下,React 会故意调用组件的函数两次,以帮助开发者发现副作用
例如,对于函数组件,React 会调用 useState、useMemo 或 useReducer 两次,以确保这些函数是纯函数

import React, { useState, useEffect } from 'react';

function Count() {
  const [counter, setCounter] = useState(0);

  useEffect(() => {
    console.log("effect");
    setTimeout(() => {
      setCounter(counter + 1);
    }, 3000);
  }, [counter]);

  console.log("before render");

  return (
    <div className="container">
    <div className="el">{counter}</div>
    </div>
  );
}

export default Count;

在上述代码中,before render 和 effect 会在初次渲染时打印两次,这是因为严格模式会多执行一次,以确保组件是纯函数。

如何解决
仅在开发者模式下运行,不影响生产构建
如果不希望组件在开发模式下执行两次,可以暂时关闭严格模式, 删除React.StrictMode。但这样做会失去一些重要的调试帮助

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
  <App />,
  document.getElementById('root')
);

总结来说,React 严格模式在开发模式下会重复调用组件,以帮助开发者检测潜在的问题和副作用。这虽然会导致组件执行两次,但有助于确保代码的纯度和安全性

posted @ 2025-03-29 22:26  奔付山河  阅读(181)  评论(0)    收藏  举报