React Hooks:切换模式下的重新渲染次数过多

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React Hooks:切换模式下的重新渲染次数过多相关的知识,希望对你有一定的参考价值。

您好,我正在尝试改善我的切换主题代码,但出现以下错误:

错误:重新渲染过多。 React将渲染数量限制为防止无限循环。

我的代码:

export default function App() 
  const theme = useTheme();

  return (
    <ThemeProvider theme=theme>
      <GlobalStyle />
      <div className="App">
        <button
          css=css`
            background: red;
            width: 100px;
            height: 50px;
            border-radius: 10px;
          `
          onClick=theme.setTheme(
            theme.type === 'dark' ?  type: 'light'  :  type: 'dark' ,
          )
        >
          a
        </button>
      </div>
    </ThemeProvider>
  );

我的钩子:

import  darkTheme, lightTheme  from '../themes/index';

export default function useTheme(defaultTheme = lightTheme) 
  const [theme, _setTheme] = useState(getInitialTheme);

  function getInitialTheme() 
    const savedTheme = localStorage.getItem('theme');
    return savedTheme === 'dark' ? darkTheme : defaultTheme;
  

  useEffect(() => 
    localStorage.setItem('theme', JSON.stringify(theme.type));
  , [theme]);

  return 
    ...theme,
    setTheme: ( setTheme, ...theme ) => _setTheme(theme),
  ;

而且我也想知道我如何获得在setTheme上发送的内容

答案

更改

onClick=theme.setTheme(
        theme.type === 'dark' ?  type: 'light'  :  type: 'dark' ,
      )

收件人

onClick=() => theme.setTheme(theme.type === 'dark' ?  type: 'light'  :  type: 'dark' )

在您的代码中,您将在渲染过程中立即执行setTheme,这将导致另一个渲染和递归的无休止渲染,并由react停止。 onClick属性需要一个函数作为值,该函数将在单击期间执行。

以上是关于React Hooks:切换模式下的重新渲染次数过多的主要内容,如果未能解决你的问题,请参考以下文章

React Hooks:跳过多个连续 setState 调用的重新渲染

“错误:重新渲染过多。React 限制了渲染次数以防止无限循环。”

React hooks 功能组件防止在状态更新时重新渲染

如何使用 react-hooks (useEffect) 缓冲流数据以便能够一次更新另一个组件以避免多次重新渲染?

如何比较 React Hooks useEffect 上的 oldValues 和 newValues?多次重新渲染

React hooks:为啥异步函数中的多个 useState 设置器会导致多次重新渲染?