#reactjs #typescript
Вопрос:
В приложении, над которым я работаю, я должен изменить язык приложения в зависимости от того, что выбрал пользователь. У меня есть один выбор языка для незарегистрированных пользователей и еще один для зарегистрированных пользователей.
Код селектора выглядит следующим образом
const LanguageSelect: React.FunctionComponent<Props> = (props: Props) => { const language = useLanguage(); const currentUser = useCurrentUser(); const { updateUser } = props; const updateLanguage = useCallback((currentUser, language) => { updateUser(currentUser.set('language', language)); }, [currentUser, language]); useEffect(() => { if (currentUser != null) { try { updateLanguage(currentUser, language); } catch (error) { console.log(error.message); } } }, [language, currentUser, updateLanguage]); return ( <Select background={Color.minimalWhite} useBorderRadius={true} onValueChange={props.setLocalizationFunction} items={languageDictionary} value={languageDictionary.find((lan) => lan.value === language).label} /> ); }
Проблема в том, что когда пользователь выбирает язык, когда он не вошел в систему, а затем выбирает другой язык при входе в систему (например, сначала он выбирает английский, когда он не вошел в систему, затем французский, когда он вошел в систему), когда отображается начальный экран для вошедшего в систему пользователя, он почти сразу отображается повторно. Я не знаю, что происходит, я даже перепробовал всевозможные способы useEffect
, чтобы селектор языков запускался только один раз, однако экран все время перерисовывается. Как я могу сделать useEffect
запускать только один раз, когда пользователь входит в систему, или они сами меняют язык, чтобы предотвратить автоматическую повторную визуализацию?
Комментарии:
1. Можете ли вы поделиться кодовым кодом?
2. Да, я не думаю, что у нас здесь достаточно, чтобы продолжать. Не зная, что
useLanguage
,useCurrentUser
,updateUser
, и что этоset
за объект текущего пользователя? Делая удар, я собираюсь предположить, что, когда кто-то входит в систему, эффект запускается и устанавливает язык для пользователя, что каждый раз вызывает новую запись текущего пользователя. Хотя, похоже, это был бы бесконечный цикл. Просто не устанавливая язык текущего пользователя, если он уже соответствует языку, возможно, это решает эту проблему?3. Правильный способ сделать это-использовать такой магазин, как react-redux. Таким образом, у вас есть один «выбранный язык», и к нему можно получить доступ во всем приложении.