con*_*pan 4 rerender reactjs redux
我目前将用户名存储在 redux 存储中,并在用户登录后将其显示在顶部栏中。(如屏幕截图所示)。但是,当 redux 状态更新时,它不会自动重新渲染。我仍然需要在顶部栏中执行一些操作,然后用户名就会出现。否则,它不会出现。所以问题是,如何强制从我的登录组件重新渲染顶栏组件。还有一个问题:刷新页面时用户名会消失。那么有没有什么选项可以用 redux 状态来保存数据呢?或者说这是不可能的。
const Login = () => {
...
const handleLogin = async googleData => {
...
//store user name value als application state into redux store
store.dispatch(nameActionCreator(googleData.profileObj.name));
...
}
}Run Code Online (Sandbox Code Playgroud)
const TopBar = () => {
...
return(
...
<h5>store.getState().userNameRecuder.name</h5>
...
)
}Run Code Online (Sandbox Code Playgroud)
您必须使用钩子调用选择器函数useSelector。您直接在元素中调用它<h5>。所以它不起作用。
const TopBar = () => {
const username = useSelector(() => store.getState().userNameRecuder.name)
return(
<h5>{username}</h5>
)
}
Run Code Online (Sandbox Code Playgroud)
您需要创建一个选择器并在组件中使用它,以便在状态更改后重新渲染组件。
在selector.js中
const selectUsername = (state) => state.userNameRecuder.name
export selectUsername;
Run Code Online (Sandbox Code Playgroud)
现在,在您的Topbar组件中,您需要实现该useSelector钩子:
import {useSelector} from 'react-redux';
import {selectUsername} from 'store/selectors';
function TopBar () {
const username = useSelector(selectUsername)
return (
<p>username</p>
)
}
Run Code Online (Sandbox Code Playgroud)
使用正确的操作更新状态(更新用户名)将导致Topbar组件重新渲染,以从商店获取新用户名。
有很多很好的方法来保存数据,例如将它们存储在 上cookies,或者使用像redux-persistlocalStorage这样的第三方库等等......看看这篇文章。