#javascript #reactjs #i18next
Вопрос:
function App(){
const [selectedLang, setSelectedLang] = useState(0);
const [langList, setLangList] = useState([]);
useEffect(()=>{
const list = [];
/* i18n.options.supportedLngs is ['en', 'ko'] */
i18n.options.supportedLngs.map((item, i)=>{
list.push(item);
/* Set selectedLang to i18n's default language.(Default is 'ko')*/
if(item === i18n.language){
setSelectedLang(i);
}
})
setLangList(list);
}, [])
useEffect(()=>{
console.debug("langList :", langList, ",", selectedLang); // <- It print correctly ['en', 'ko'], 1
}, [langList, selectedLang])
return(
<Child defaultIndex={selectedLang} childList={langList}/>
)
}
function Child(props){
const {defaultIndex, childList} = props;
const [selected, setSelected] = useState(0);
useState(()=>{
setSelected(defaultIndex);
},[])
return(
<div>
{childList[selected]} //<- But it print 'en'.
</div>
)
}
Приведенный выше код является упрощенной версией моего кода.
В настоящее время i18n по умолчанию имеет значение «ko». Я хочу отобразить » ko «в дочернем файле , установив значение selectedLang
» индекс ko App
«и указав индекс» ko » и весь массив языков в качестве реквизитов Child
.
Тем не менее, Child
» s selected
и defaultIndex
, похоже, не меняется с состояния useState(0)
, инициализированного с.
Кто-нибудь может мне помочь?
Ответ №1:
setSelected
необходимо вызвать после изменения defaultIndex
в Child
компоненте.
И ты не воспользовался подходящим крючком.
useEffect(()=>{
setSelected(defaultIndex);
},[defaultIndex])
Комментарии:
1. Может быть, это должно быть полезным эффектом?
Ответ №2:
Вы можете использовать контекст react для достижения этой цели: сначала создайте поставщика Lang в app.js
const LangContext = React.createContext('ko');
function App() {
const [lang, setLang] = useState("ko");
return (
<LangContext.Provider value={[lang, setLang]}>
<Toolbar />
</LangContext.Provider>
);
}
Затем в любом дочернем компоненте вы можете использовать :
function Button() {
const [lang, setLang]= useContext(LangContext);
return (
<button onClick={()=>{setLang('en')}}>
{lang}
</button>
);
}
Любое изменение контекста будет распространяться во всех компонентах с использованием useContext.
Подробнее читайте здесь : https://reactjs.org/docs/hooks-reference.html#usecontext