Вы правы, что передача пустого массива в useEffect
остановит его запуск при последующих рендерингах , но это не остановит его запуск, если компонент отключен, а затем снова подключен.
Я предполагаю, что, кликнув по ссылкам, вы фактически де-монтируете, а затем заново монтируете свой DefaultLanguage
компонент.
Вы можете проверить это, вернув функцию очистки из useEffect
hook.
Например,
useEffect(() => {
console.log('setting active language');
setActiveLanguage(props.match.params.lang);
return () => console.log('Unmounting');
}, []);
Если вы видите этот журнал, значит, вы нашли свою проблему.
Быстрое и грязное решение - проверитьи посмотрите, изменился ли язык, и если да, установите его.Это не решит проблему потенциально ненужного монтирования / размонтирования, но, по крайней мере, позволит избежать повторной установки языка.
useEffect(() => {
if (activeLanguage !== props.match.params.lang) {
console.log('setting active language');
setActiveLanguage(props.match.params.lang);
}
}, []);