reactjs - 当调度到另一个在 redux 中减少时状态值不会改变

标签 reactjs redux state redux-toolkit useselector

我正在构建登录系统。当我使用选择器函数时,我在存储状态值时遇到问题。在我的系统中,我想从存储状态值获取 isSuccess、error、userInfo

/login/index.js

const userLogin = useSelector((state) => state.userLogin);
console.log(userLogin);
const { isSuccess, error, userInfo } = userLogin;

如果出现错误,则会在 UI 上显示错误消息,否则如果 isSuccess,则会显示成功消息。 isSuccess 当发布到 api 成功时出现(这意味着用户登录成功)并且用户数据被分派(dispatch)到 loginSuccess 减少,否则分派(dispatch)到 loginFail 的错误值减少

/action/userAction.js

import {
loginSuccess,
loginFail,
} from "\~/redux/user/userLoginSlice";

export const login = (inputs) =\> async (dispatch) =\> {
try {
const {data} = await request.post("/auth/login", inputs);
dispatch(loginSuccess(data));
localStorage.setItem("userInfo", JSON.stringify(data));
} catch (error) {
console.log(error.response.data)
dispatch(loginFail(error.response.data))
}

。然而,当上一次登录为loginFail时,它不仅会在loginSucces减少中获取isSuccess,还会收到错误 console.log(userLogin) 。它应该只显示 userInfo 和 isSuccess。任何人都可以帮我解决这个问题。这减少了

userLoginSlice.js



import { createSlice } from '@reduxjs/toolkit';


const userLoginSlice = createSlice({
    name: 'userInfo',
    initialState: {},
    reducers: {
        loginSuccess: (state, action) => {
            state.isSuccess = true;
            state.userInfo = action.payload;
        },
        loginFail: (state, action) => {
            state.error = action.payload
        },
    },
});

export const { loginSuccess, loginFail } = userLoginSlice.actions;

export default userLoginSlice.reducer;

和我的reduce商店

store.js

import { configureStore } from '@reduxjs/toolkit';

import productModalReducer from './product-modal/productModalSlice';
import cartItemsSlice from './cart/cartSlide';
import userLoginSlice from './user/userLoginSlice.js';
import userRegisterSlice from './user/userRegisterSlice.js';
import userUpdateSlice from './user/userUpdateSlice.js';

const userInfoFromStorage = localStorage.getItem('userInfo') ? JSON.parse(localStorage.getItem('userInfo')) : null;

const initialState = {
    userLogin: { userInfo: userInfoFromStorage },
};

export const store = configureStore({
    reducer: {
        productModal: productModalReducer,
        cartItems: cartItemsSlice,
        userLogin: userLoginSlice,
        userRegister: userRegisterSlice,
        userUpdate: userUpdateSlice,
    },
    preloadedState: initialState,
});

当调度到另一个在 redux 中减少时,状态值不会改变

最佳答案

这似乎可能是因为 loginSuccess 仅将 userInfoisSuccess 添加到状态,但没有忽略之前的 error.

也许尝试重置状态值以排除 reducer 中的错误:

const userLoginSlice = createSlice({
  name: "userInfo",
  initialState: {},
  reducers: {
    loginSuccess: (state, action) => {
      // 👇 Reset state to omit error message in loginSuccess
      state = { isSuccess: true, userInfo: action.payload };
    },
    loginFail: (state, action) => {
      // 👇 Could add "isSuccess: false, userInfo: null" if needed
      state = { error: action.payload };
    },
  },
});

或者返回一个状态值而不是使用 Immer 代理状态:

const userLoginSlice = createSlice({
  name: "userInfo",
  initialState: {},
  reducers: {
    loginSuccess: (state, action) => {
      // 👇 Reset state to omit error message in loginSuccess
      return { isSuccess: true, userInfo: action.payload };
    },
    loginFail: (state, action) => {
      // 👇 Could add "isSuccess: false, userInfo: null" if needed
      return { error: action.payload };
    },
  },
});

关于reactjs - 当调度到另一个在 redux 中减少时状态值不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74906115/

相关文章:

jquery - 使用react ref作为jquery的选择器

ruby-on-rails - 如何在rails api中使用devise-jwt和devise进行登录、注册和注销

javascript - 如何在axios中获取onUploadProgress?

javascript - 不可变对象(immutable对象)的扩展运算符与 JSON.parse(JSON.stringify(...))

android - 从功能 react native 导航到屏幕

reactjs - MenuItem 组件的 Material-ui悬停颜色?

user-interface - 任何复杂对象状态管理的数学方法?

button - SwiftUI:如何从 View 模型更新按钮状态

javascript - 如何从 redux-saga 函数中的状态/存储中获取某些东西?

ios - 如何以编程方式获取 UIBarButtonItem 的状态?