如何在 redux 状态更新时自动刷新组件

Posted

技术标签:

【中文标题】如何在 redux 状态更新时自动刷新组件【英文标题】:how to auto refresh component when redux state get updated 【发布时间】:2021-11-27 12:33:36 【问题描述】:

我目前将用户名存储在 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));
    ...
  

const TopBar = () => 
  ...
  return(
    ...
    <h5>store.getState().userNameRecuder.name</h5>
    ...
  )

登录前

登录后

【问题讨论】:

【参考方案1】:

第一个问题

简答:

您必须使用useSelector 挂钩调用选择器函数。您直接在 &lt;h5&gt; 元素中调用它。所以它不起作用。

const TopBar = () => 
  const username = useSelector(() => store.getState().userNameRecuder.name)

  return(
    <h5>username</h5>
  )

最佳实践的长答案:

您需要创建一个selector 并在您的组件中使用它来在状态更改后重新渲染您的组件。

在 selector.js 中

const selectUsername = (state) => state.userNameRecuder.name

export selectUsername;

现在,在您的 Topbar 组件中,您需要实现 useSelector 挂钩:

import useSelector from 'react-redux';
import selectUsername from 'store/selectors';

function TopBar () 
  
  const username = useSelector(selectUsername)

  return (
    <p>username</p>
  )


使用适当的操作更新状态(更新用户名)将导致 Topbar 组件重新渲染以从商店获取新用户名。

第二个问题

有很多很好的方法可以持久化数据,例如将它们存储在cookieslocalStorage 或使用第三方库(如redux-persist)等等... 看看this post。

【讨论】:

【参考方案2】:

它基于@novonimo 的回答工作。即使没有分开 selector.js。只需使用useSelector钩子将redux状态与组件的状态连接起来,当redux状态发生变化时,组件会自动重新渲染。

const TopBar = () => 
      const userName = useSelector(() => store.getState().userNameRecuder.name);
      
      return(
        ...
        <h5>userName</h5>
        ...
      )
    

【讨论】:

感谢您的好回答,实际上“() => store.getState().userNameRecuder.name”是选择器,但在您的 useSelector 挂钩中隐含定义。分离选择器将有助于更改存储对象或进行调试

以上是关于如何在 redux 状态更新时自动刷新组件的主要内容,如果未能解决你的问题,请参考以下文章

Next js 应用刷新时,useEffect 不调度 redux saga 动作并更新状态

从api更新数据时如何自动刷新组件,无需页面刷新

React Redux 状态在页面刷新时丢失

在 React 中无效时自动刷新令牌

在 Redux 状态下更新单个值

C#当用户控件变为活动状态时,如何自动刷新文本文件中的数据?