首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用redux工具箱修改状态

如何使用redux工具箱修改状态
EN

Stack Overflow用户
提问于 2022-06-09 08:23:34
回答 1查看 329关注 0票数 0

数据是动态提供的,我不知道它在initialState中分配的价值。这使我出了一个我无法应付的错误。

如何在initialState?中没有对象时更新状态的对象

错误

代码语言:javascript
复制
filteringSlice.ts:12 

Uncaught TypeError: Cannot read properties of undefined (reading 'products')
    at addFilter (filteringSlice.ts:12:1)
    at createReducer.ts:280:1
    at produce (immerClass.ts:94:1)
    at createReducer.ts:279:1
    at Array.reduce (<anonymous>)
    at reducer (createReducer.ts:246:1)
    at reducer (createSlice.ts:325:1)
    at combination (redux.js:560:1)
    at k (<anonymous>:2235:16)
    at D (<anonymous>:2251:13)

呼叫动作

代码语言:javascript
复制
onChange={(selectedValue) => {
  dispatch(
    addFilter({
      products: { category__name: { filter: selectedValue } },
    })
  );
}}

切片

代码语言:javascript
复制
import { createSlice } from "@reduxjs/toolkit";
const initialState = {} as any;
const filteringSlice = createSlice({
  name: "filtering",
  initialState,
  reducers: {
    addFilter: (state, action) => {
      const key = Object.keys(action.payload)[0];
      const key2 = Object.keys(action.payload[key])[0];
      const values = Object.values(action.payload[key])[0];
      //@ts-ignore
      state.filters[key][key2] = { ...state.filters[key][key2], ...values };
    },
  },
});
const { reducer, actions } = filteringSlice;
export const { addFilter } = actions;
export default reducer;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-09 10:50:48

因此,您的状态首先是一个空对象:

代码语言:javascript
复制
const initialState = {} as any;

但是,您的访问方式就好像它有一个更深层次的嵌套结构一样:

代码语言:javascript
复制
state.filters[key][key2] = ...

这不起作用,因为没有state['filters'],也没有state['filters']['products']等等。

您需要手动创建该嵌套的每个级别(或者为您的状态考虑一个更好、更平坦的结构):

代码语言:javascript
复制
/*
action.payload = {
  products: {
    category__name: {
      filter: selectedValue
    }
  }
}
*/
const key = Object.keys(action.payload)[0]; // 'products'
const key2 = Object.keys(action.payload[key])[0]; // 'category__name'
const values = Object.values(action.payload[key])[0]; // selectedValue

if (!state.filters) {
  state.filters = {};
}
if (!state.filters[key]) {
  state.filters[key] = {}; 
}
if (!state.filters[key][key2]) {
    state.filters[key][key2] = {};
}

state.filters[key][key2] = { ...state.filters[key][key2], ...values };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72556978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档