javascript 如何在useEffect中重新渲染React函数组件?

nfg76nw0  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(185)

我有一个顶级组件,它使用一个库来确定用户的浏览器是处于亮模式还是暗模式。然后它被用来设置应用程序的主题,其中包括HTML Canvas组件(这很重要,因为这些组件不像普通的React组件)。目前,画布组件在没有重新呈现(页面重新加载或开发模式下的热重新加载)的情况下不会显示正确的主题。
如何让App组件在不重新加载的情况下重新呈现?例如,在本地开发模式下,当我点击保存时,只有组件重新呈现,这正是我想在应用程序中复制的行为。
根据SO上的其他答案,useReducer是在功能组件中强制重新渲染的正确方法,但以下方法对我不起作用:

function App(props) {
  // this is not working 
  const [, forceUpdate] = useReducer((x: number) => x + 1, 0);

  useEffect(() => {
    setDarkMode(getColorTheme() === "dark");
    // this is not working 
    forceUpdate();
  }, [getColorTheme()]);
}
  return (
    <div
      className={(darkMode ? "dark-mode-theme" : "")}
    >
      ...
    </div>
  )
}
ulydmbyx

ulydmbyx1#

你是否考虑过使用一个空的依赖数组,以便useEffect钩子在组件被渲染后运行,然后根据灯光模式更新状态?

5lhxktic

5lhxktic2#

在以下情况下,功能组件将重新渲染:
1.任何 prop 更改引用标识

  1. useState的setState / useReducer的调度被调用
  2. useContext值更改引用标识
    注意:如果下一个状态与前一个状态相同(从引用的Angular 来说),setState将中止重新渲染。
    当归约器的结果返回与先前相同的状态时,分派也具有该行为。
    但是看看你的代码,我同意分派不应该中止重新呈现。使用React DevTools,您可以设置选项,使组件在重新渲染时 Flink 。当主题改变时,应用程序组件是否 Flink ?

相关问题