【问题标题】:Update a single object property in an array of objects based on the current value with redux使用 redux 根据当前值更新对象数组中的单个对象属性
【发布时间】:2017-12-13 01:05:22
【问题描述】:

在我的状态下,我有一个对象数组,这些对象具有一些描述性属性、数量和唯一 ID。此对象中的数据来自 API 响应,在我的动作创建器中,我检查状态以查看它是否已经存在,如果存在,则为我的减速器调度增量动作。这是我的动作创建者的样子:

export const getProductDetails = upc => (dispatch, getState) => {
const state = getState();
const products = state.table.products;
if (_find(products, upc) !== undefined) {
  dispatch({ type: INCREMENT_QUANTITY, payload: upc });
} else {
axios
  .post(<--POST TO ENDPOINT-->) }
  })
  .then(res => {
    dispatch({ type: POST_UPC, payload: res.data });
  })
  .catch(err => {
    errorHandler(dispatch, err.response, AUTH_ERROR);
  });
 }
};

我在这个案例中的 reducer 的结构如下:

case INCREMENT_QUANTITY:
  return {
    ...state,
    products: state.products.map(product => {
      action.payload === product.upc
        ? { ...product, quantity: product.quantity + 1 }
        : product;
    })
  };

我基于这个 reducer 逻辑 this excellent response,但由于某种原因,在调度操作时,重复的产品被覆盖为 null,而不是按预期增加数量。我现在还在努力学习redux,所以请原谅我的无知。理想情况下,我想避免仅仅为了增加值而引入库或包。我的减速器中到底缺少什么?

【问题讨论】:

    标签: javascript redux immutability


    【解决方案1】:

    您在 map 回调中没有返回任何内容,您正在创建一个块,因此您没有得到预期的结果。相反,省略括号{ … }:

    products: state.products.map(product => 
      action.payload === product.upc
        ? { ...product, quantity: product.quantity + 1 }
        : product;
    );
    

    这将使用箭头函数语法隐式返回三元运算符的结果。

    【讨论】:

    • 完美!我知道我在该地图功能中遗漏了一些小东西。所以现在数组中的对象不会变成null,但是数量字段在多个调度调用中保持静态以增加该字段。那里还有我想念的东西吗?
    • @ChristianTodd 也许你的意思是action.payload.upc?你能提供调度的动作吗?
    • 我更新了我的原始问题以包含我的整个动作创建者。希望这会更清楚。
    • @ChristianTodd 这可能超出了最初问题的范围。也许问一个新的详细信息会得到新鲜的眼睛和准确的答案。
    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    相关资源
    最近更新 更多