【发布时间】:2020-04-21 13:07:17
【问题描述】:
我有一个自定义钩子,它可以获取 许多 组件使用的本地 JSON 文件。
hooks.js
export function useContent(lang) {
const [content, setContent] = useState(null);
useEffect(() => {
const abortController = new AbortController();
const signal = abortController.signal;
fetch(`/locale/${lang}.json`, { signal: signal })
.then((res) => {
return res.json();
})
.then((json) => {
setContent(json);
})
.catch((error) => {
console.log(error);
});
return () => {
abortController.abort();
};
}, [lang]);
return { content };
}
/components/MyComponent/MyComponent.js
import { useContent } from '../../hooks.js';
function MyComponent(props) {
const { content } = useContent('en');
}
/components/MyOtherComponent/MyOtherComponent.js
import { useContent } from '../../hooks.js';
function MyOtherComponent(props) {
const { content } = useContent('en');
}
我的组件行为相同,因为我在两者中都将相同的en 字符串发送到我的useContent() 挂钩。 useEffect() 应该仅在 lang 参数更改时运行,因此看到两个组件使用相同的 en 字符串,useEffect() 应该只运行一次 ,但它没有 - 它运行多次。这是为什么?如何更新我的钩子,使其仅在 lang 参数更改时获取?
【问题讨论】:
-
鉴于这似乎是一个共享状态,你为什么不使用上下文?
标签: reactjs react-hooks fetch-api use-effect