javascript - 多个组件状态的反应钩子没有更新
问题描述
我有一个钩子和 2 个组件。组件App.js有一个函数可以改变hook中的状态,但是在组件New.js中值没有更新,为什么?我想我错过了一些东西,但无法弄清楚。
应用程序.js
export const useToggle = () => {
const [onOff, setOnOff] = useState(false);
return [onOff, () => setOnOff((prev) => !prev)];
};
export default function App() {
const [onOff, setOnOff] = useToggle();
return (
<div className="App">
<h1>{onOff.toString()}</h1>
<button onClick={setOnOff}>toggle</button>
</div>
);
}
新的.js
import { useToggle } from "./App.js";
export default function New() {
const [onOff] = useToggle();
return (
<div className="App">
<hr />
<h1>NEW:</h1>
<pre>{onOff.toString()}</pre>
</div>
);
}
解决方案
每个useToggle
钩子都是它自己的实体,有自己的状态。useToggle
您正在切换的App
与useToggle
在 中呈现/使用的不同New
。
这意味着它们的切换独立于任何其他钩子和状态。他们不共享“状态”。
如果你想创建一个useToggle
具有共享状态的钩子,那么我建议通过 React 上下文和useContext
钩子来实现它,这样每个useToggle
钩子都可以切换上下文中保持的相同共享状态。
更新
全局useToggle
挂钩。
切换上下文.js
import { createContext, useContext, useState } from 'react';
export const ToggleContext = createContext([false, () => {}]);
const ToggleProvider = ({ children }) => {
const [onOff, setOnOff] = useState(false);
const toggle = () => setOnOff(t => !t);
return (
<ToggleContext.Provider value={[onOff, toggle]}>
{children}
</ToggleContext.Provider>
);
}
export const useToggle = () => useContext(ToggleContext);
export default ToggleProvider;
index - 提供上下文
...
import ToggleProvider from "./toggle.context";
const rootElement = document.getElementById("root");
ReactDOM.render(
<StrictMode>
<ToggleProvider>
<App />
<New />
</ToggleProvider>
</StrictMode>,
rootElement
);
应用程序
import "./styles.css";
import { useToggle } from "./toggle.context";
export default function App() {
const [onOff, setOnOff] = useToggle();
return (
<div className="App">
<h1>{onOff.toString()}</h1>
<button onClick={setOnOff}>toggle</button>
</div>
);
}
新的
import { useToggle } from "./toggle.context";
export default function New() {
const [onOff] = useToggle();
return (
<div className="App">
<hr />
<h1>NEW:</h1>
<pre>{onOff.toString()}</pre>
</div>
);
}
App
请注意, and组件中唯一改变的New
是导入,其中useToggle
定义了钩子。
推荐阅读
- xamarin - 具有混合形式/本机视图的 MVVMCross 侧边菜单
- c# - 如何在文本框中显示 2 个值?
- javascript - 如何计算网格上所有可能的路径
- javascript - 是否存在允许用户像 chrome 标签一样打开和管理多个浏览器的应用程序?
- svg - SVG 模式缩放模式不被切断的方式
- ios - 如何将字符串中的标准颜色名称转换为 UIColor 值
- python - 定义 2 列 x 1 行子图的问题
- python - 我的 Scrapy 蜘蛛无法从下一页提取数据
- java - ImageViews 代表喜欢和不喜欢不改变颜色,也不是在 Firebase 中创建的新节点
- javascript - 我的节点包的质量分数在更新时从 99% 变为 65%