【问题标题】:state is getting changed to unexpected value, todos.map is not a function,状态正在更改为意外值,todos.map 不是函数,
【发布时间】:2021-01-09 11:05:38
【问题描述】:

我在我的应用程序中使用 redux 反应,我将状态作为对象数组,在 reducer 中用于在数组中添加新元素,整个状态被更改为 4,而不是与旧元素一起显示新元素并给出我的错误“todos.map 不是函数”。

我的状态

export const todos = [
  {
    id: "1",
    item: "Buy Milk"
  },
];

减速器

export const reducer = (state = todos, action) => {
  let newTodos;
  switch (action.type) {
    case ADD_TODO:
      newTodos = state;
      newTodos = newTodos.push(action.payload);
      return newTodos;

    case DELETE_TODO:
      break;

    case UPDATE_TODO:
      break;

    default:
      return state;
  }
};

redux 开发工具中的 action.payload(ADD_TODO)

type(pin): "ADD_TODO"
payload(pin)
   id(pin): "870f7b60-5267-11eb-85d2-cbd5e33df548"
   item(pin): "ghgh"

调度操作后出现错误“todos.map 不是函数”并且状态正在更改为

(pin): 4

【问题讨论】:

  • 那是因为你不是 gettig 数组作为响应,所以 .map 并不意味着 .. 你可以记录你的 newTodos 和 action.payload 以及之后的新 todos
  • 这里去掉赋值newTodos = newTodos.push(action.payload);,因为push会返回数组的长度,所以你把数组改成数字
  • 感谢 ArazShamsaddinlouy 和 @Naren,我会记下来的。

标签: javascript reactjs redux


【解决方案1】:

push 返回the length of the new array,而不是数组本身。相反,您需要创建一个新数组而不改变原始数组:

case ADD_TODO:
      return [...state, action.payload];

【讨论】:

    【解决方案2】:

    您改变状态,然后在 add todoe 中将状态分配给错误的值:

    [].push({}) === 1;
    

    试试这个:

    return [...state, action.payload]
    

    【讨论】:

      猜你喜欢
      • 2020-08-30
      • 1970-01-01
      • 2022-01-04
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多