如何在初始页面加载时使用 React-Redux 将变量设置为值?
How do I set a variable to value using React-Redux on the initial page load?
我正在为我的应用程序创建一个语言切换器。到目前为止,我可以支持 4 种语言(英语 [en]、西班牙语 [sp]、法语 [fr] 和阿拉伯语 [ar])。我已经将所有语言属性文件转换为 JSON,我可以将这些文件导入到我的 .jsx 文件中。但是,在设置语言方面,我 运行 遇到了问题。
例如:
我有这行代码:<h1>{messages.en["user.userprofile"]}</h1>
这翻译成英文 User Profile。如果我将语言切换为法语 <h1>{messages.fr["user.userprofile"]}</h1>
,我将得到:Profil d'utilisateur.
我没有对语言进行硬编码,而是试图让它动态变化。我正在使用 Redux 加载用户配置文件。
const defaultLanguage = useSelector(
(state) => state.profileReducer.profile.language || []
);
...
<h1>{messages[defaultLanguage]["user.userprofile"]}</h1>
我想在页面加载时获得 defaultLanguage
。例如,如果用户的语言是英语,defaultLanguage
将被设置为 en
。但是,当我这样做时,出现白屏和此错误:
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'user.userprofile')
at UserProfileNew (UserProfileNew.jsx?e01f:146)
at renderWithHooks (react-dom.development.js?61bb:14985)
at mountIndeterminateComponent (react-dom.development.js?61bb:17811)
at beginWork (react-dom.development.js?61bb:19049)
at HTMLUnknownElement.callCallback (react-dom.development.js?61bb:3945)
at Object.invokeGuardedCallbackDev (react-dom.development.js?61bb:3994)
at invokeGuardedCallback (react-dom.development.js?61bb:4056)
at beginWork (react-dom.development.js?61bb:23964)
at performUnitOfWork (react-dom.development.js?61bb:22776)
at workLoopSync (react-dom.development.js?61bb:22707)
但是,如果我注释掉 h1
标记并为 defaultLanguage
放置 console.log
,我注意到它打印了 5 次。在前 2 次,defaultLanguage
设置为 []
。然后在最后 3 次,defaultLangauge
被设置为从 Redux 加载的用户语言值。我怎样才能在页面加载时初始化它,这样它就不会未定义?我是不是遗漏了什么,或者我是否需要更改 h1
标签中 defaultLanguage
的书写方式?
其实你的问题不在 Redux 中。
当你试图从 messages.en["user.userprofile"]
获取价值时,你假设你从 messages.en.user.userprofile
获取价值,但不,它不是这样工作的 - JS 认为它是从对象获取价值通过键 user.userprofile
和 JS 的对象结构是
{
'messages': {
'en': {
'user.userprofile': {
}
}
}
}
对您的问题最简单且成本最低的解决方案是使用 lodash 中的方法 get
或任何其他类似的实用程序库。这样你就可以写
get(messages.en, 'user.userprofile', [])
并确保通过组合键获取值。
我正在为我的应用程序创建一个语言切换器。到目前为止,我可以支持 4 种语言(英语 [en]、西班牙语 [sp]、法语 [fr] 和阿拉伯语 [ar])。我已经将所有语言属性文件转换为 JSON,我可以将这些文件导入到我的 .jsx 文件中。但是,在设置语言方面,我 运行 遇到了问题。
例如:
我有这行代码:<h1>{messages.en["user.userprofile"]}</h1>
这翻译成英文 User Profile。如果我将语言切换为法语 <h1>{messages.fr["user.userprofile"]}</h1>
,我将得到:Profil d'utilisateur.
我没有对语言进行硬编码,而是试图让它动态变化。我正在使用 Redux 加载用户配置文件。
const defaultLanguage = useSelector(
(state) => state.profileReducer.profile.language || []
);
...
<h1>{messages[defaultLanguage]["user.userprofile"]}</h1>
我想在页面加载时获得 defaultLanguage
。例如,如果用户的语言是英语,defaultLanguage
将被设置为 en
。但是,当我这样做时,出现白屏和此错误:
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'user.userprofile')
at UserProfileNew (UserProfileNew.jsx?e01f:146)
at renderWithHooks (react-dom.development.js?61bb:14985)
at mountIndeterminateComponent (react-dom.development.js?61bb:17811)
at beginWork (react-dom.development.js?61bb:19049)
at HTMLUnknownElement.callCallback (react-dom.development.js?61bb:3945)
at Object.invokeGuardedCallbackDev (react-dom.development.js?61bb:3994)
at invokeGuardedCallback (react-dom.development.js?61bb:4056)
at beginWork (react-dom.development.js?61bb:23964)
at performUnitOfWork (react-dom.development.js?61bb:22776)
at workLoopSync (react-dom.development.js?61bb:22707)
但是,如果我注释掉 h1
标记并为 defaultLanguage
放置 console.log
,我注意到它打印了 5 次。在前 2 次,defaultLanguage
设置为 []
。然后在最后 3 次,defaultLangauge
被设置为从 Redux 加载的用户语言值。我怎样才能在页面加载时初始化它,这样它就不会未定义?我是不是遗漏了什么,或者我是否需要更改 h1
标签中 defaultLanguage
的书写方式?
其实你的问题不在 Redux 中。
当你试图从 messages.en["user.userprofile"]
获取价值时,你假设你从 messages.en.user.userprofile
获取价值,但不,它不是这样工作的 - JS 认为它是从对象获取价值通过键 user.userprofile
和 JS 的对象结构是
{
'messages': {
'en': {
'user.userprofile': {
}
}
}
}
对您的问题最简单且成本最低的解决方案是使用 lodash 中的方法 get
或任何其他类似的实用程序库。这样你就可以写
get(messages.en, 'user.userprofile', [])
并确保通过组合键获取值。