首页 > 解决方案 > 错误 - TypeError:无法读取未定义的属性“值”

问题描述

我正在使用 React-Redux,这是我的切片 -

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

export const balanceSlice = createSlice({
  name: "balance",
  initialState: {
    value: 0,
  },
  reducers: {
    increment: (state) => {
      state.value += 10000;
    },
    decrement: (state) => {
      state.value -= 10000;
    },
  },
});

export const { increment, decrement } = balanceSlice.actions;

export const selectCount = (state) => state.balance.value;

export default balanceSlice.reducer;

在浏览器中,我收到此错误 - TypeError: Cannot read property 'value' of undefined 此错误指向倒数第二行。我看到的balance是定义的,那为什么会抛出错误呢?

需要注意的是,在 Chrome Redux Devtools 中有一个状态counter不是balance我定义的。

标签: javascriptreactjsredux

解决方案


balanceSlice您唯一的减速器,还是您正在使用combineReducers它与其他减速器结合使用?

此错误表明您的州没有名为 的顶级属性balance。所以有这些可能性:

1)你有一堆减速器嵌套在balance不在顶层的地方

counter2 ) 您在组合 ( ?)时将此减速器分配给不同的键名

3)这个reducer是你的整个状态,在这种情况下没有balance属性,因为整个状态是平衡。

如果它是#1,你需要找出你所在州的这个切片的路径。

如果是 #2,请修复您的combineReducers.

如果是 #3,请将选择器更改为(state) => state.value.

需要注意的是,在 Chrome Redux Devtools 中,正如我所定义的那样,有一个 counter not balance 的状态。

我很确定它是#2。我认为您从文档中复制了 acombineReducers却不了解它在做什么。

你的减速机是这样的吗?

import balanceReducer from "./reducer"
// ^ or whatever you called it

const reducer = combineReducers({
  counter: balanceReducer,
})

combine reducers 函数采用 reducers 的键值对对象。键(即counter)成为 中的属性名称,state值是该属性的化简器。您希望调用您的属性balance,因此我们需要将其分配给balance键。重要的是这个键,而不是切片名称,尽管它们通常是相同的。

import balanceReducer from "./reducer"

const reducer = combineReducers({
  balance: balanceReducer,
})

推荐阅读