【发布时间】:2022-10-04 22:02:04
【问题描述】:
我将react-localization 用于i18n,它使用带有setLanguage 方法的对象。我正在尝试为它构建一个语言切换器,但是当我更改语言时,组件不会使用更新的对象重新渲染。
我试过useEffect、useCallback、useRef。唯一可行的是useCallback,并从我的自定义钩子中导出回调,然后在组件呈现时调用它,我认为这非常丑陋和不正确。
从钩子中改变对象并重新渲染使用它的组件的正确方法是什么?
这是我创建的用于测试的 CodeSandbox:https://codesandbox.io/s/react-localization-context-wfo2p2
翻译.js
import {
createContext,
useCallback,
useContext,
useEffect,
useRef,
useState
} from "react";
const TranslationContext = createContext({
language: "fr",
setLanguage: () => null
});
const TranslationProvider = ({ children }) => {
const [language, setLanguage] = useState("fr");
return (
<TranslationContext.Provider value={{ language, setLanguage }}>
{children}
</TranslationContext.Provider>
);
};
const useTranslation = (_strings, key) => {
const { language, setLanguage } = useContext(TranslationContext);
const ref = useRef(_strings);
const cb = useCallback(() => _strings.setLanguage(language), [
language,
_strings
]);
useEffect(() => {
ref?.current?.setLanguage(language);
}, [language]);
return { language, cb, setLanguage };
};
export { useTranslation, TranslationProvider, TranslationContext };
【问题讨论】:
标签: javascript reactjs react-hooks internationalization react-localization