我有一个顶级组件,它使用一个库来确定用户的浏览器是处于亮模式还是暗模式。然后它被用来设置应用程序的主题,其中包括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>
)
}
2条答案
按热度按时间ulydmbyx1#
你是否考虑过使用一个空的依赖数组,以便useEffect钩子在组件被渲染后运行,然后根据灯光模式更新状态?
5lhxktic2#
在以下情况下,功能组件将重新渲染:
1.任何 prop 更改引用标识
注意:如果下一个状态与前一个状态相同(从引用的Angular 来说),setState将中止重新渲染。
当归约器的结果返回与先前相同的状态时,分派也具有该行为。
但是看看你的代码,我同意分派不应该中止重新呈现。使用React DevTools,您可以设置选项,使组件在重新渲染时 Flink 。当主题改变时,应用程序组件是否 Flink ?