You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Action中调用Reducer存储变量及会话管理用户凭证

我来帮你一步步解决这两个问题哈~

问题1:如何在Action中调用Reducer中存储的变量?

在Redux的逻辑里,Action本身没法直接读取Reducer里维护的状态,但从你的代码来看,你已经在用Redux Thunk(返回了一个包含dispatch的函数),这种情况下,Thunk函数还能拿到第二个参数getState——它可以帮你获取当前整个Redux store的完整状态。

举个实际的例子,如果你想在某个Action里获取已存储的用户信息,写法大概是这样:

export function someAction() {
  return function (dispatch, getState) {
    // 获取整个store的状态
    const currentState = getState();
    // 假设你的用户状态存在名为`auth`的reducer下,取出对应变量
    const storedUserId = currentState.auth.user_id;
    const storedToken = currentState.auth.token;
    
    // 接下来就可以用这些变量做你需要的操作了
    console.log("当前存储的用户ID:", storedUserId);
  };
}

对你的loginUser函数来说,如果后续逻辑需要用到已有的状态,同样可以通过getState来获取。

问题2:存储user_id和token到会话,登出时移除

我们可以利用浏览器的localStorage(持久化存储,关闭浏览器后数据仍保留)或者sessionStorage(会话级存储,关闭浏览器就自动清除)来实现,下面以localStorage为例,结合你的代码修改:

首先修改你的loginUser函数,在分发authUser action后,把值存到本地存储:

export function loginUser(email, password) {
  return function (dispatch) {
    return axios.post(SIGNIN_URL, { email, password }).then((response) => {
      var { user_id, token } = response.data;
      dispatch(authUser(user_id, token)); 
      
      // 将用户信息存入localStorage
      localStorage.setItem('user_id', user_id);
      localStorage.setItem('token', token);
    });
  };
}

然后写一个登出的Action,在分发清除用户状态的action同时,移除本地存储的内容:

export function logoutUser() {
  return function (dispatch) {
    // 分发清除auth状态的action(需要你在对应的reducer里处理这个action)
    dispatch(unauthUser());
    
    // 移除localStorage里的用户信息
    localStorage.removeItem('user_id');
    localStorage.removeItem('token');
    // 如果你需要清空所有本地存储内容,也可以用:
    // localStorage.clear();
  };
}

另外,如果你希望页面刷新后,Redux store能自动从本地存储恢复用户状态,可以在应用初始化时(比如创建store的地方),从localStorage读取值并初始化reducer:

// 在store初始化的位置
const initialAuthState = {
  user_id: localStorage.getItem('user_id') || null,
  token: localStorage.getItem('token') || null
};
// 将这个initialAuthState传入你的auth reducer作为初始状态

这样一来,不管是在不同JS文件的Action里通过getState从store获取,还是直接通过localStorage.getItem('user_id')读取,都能复用这些变量啦。

内容的提问来源于stack exchange,提问作者Markus Hayner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:28:16