此链接中的 ThemeContext示例有效,但它仅提供一个字段。我尝试将此示例用于复杂类型的 UserContext。状态已设置,但未呈现。
我发布了codeandbox示例。
第一个按钮切换状态主题。
第二个按钮更改 User.auth 状态,但不呈现页面。
当您单击第一个按钮时,您可以看到状态已正确设置。
有谁知道我做错了什么?
问题在这里:
if (aUser.authorized) {
aUser.authorized = false;
setUser(aUser);
} else {
aUser.authorized = true;
setUser(aUser);
}
你正在改变你所在州的一个对象。你不应该那样做。React 通过查看 state 是否具有相同的对象来测试它是否应该重新渲染。由于你没有传入一个新对象,React 不知道它应该重新渲染。
你可能想要这个:
function toggleAuth() {
setUser({ ...user, authorized: !user.authorized })
}
通过这种方式,您创建了一个新对象以传递给setState
,React 会看到它是一个新对象,然后会按照您的预期重新渲染。
主题切换起作用的原因是它使用了这个功能:
function togleTheme() {
theme === Theme.Dark ? setTheme(Theme.Light) : setTheme(Theme.Dark);
}
每次切换时都会传入一个完全不同的值,而不会对现有对象进行任何更改。所以 React 可以注意到它们不同并重新渲染。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句