Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Redux:Reducer在新添加时覆盖以前的状态_Javascript_Redux - Fatal编程技术网

Javascript Redux:Reducer在新添加时覆盖以前的状态

Javascript Redux:Reducer在新添加时覆盖以前的状态,javascript,redux,Javascript,Redux,我正在尝试使用Redux和纯Javascript实现一个简单的购物车功能。我已经将我的还原程序分为两部分,一部分用于UI,另一部分用于购物车功能 我的问题是,当向购物车添加一个项目时,它在状态中显示良好,但当我添加另一个项目时,它会覆盖状态中的前一个项目。我已经为此挣扎了一段时间,并尝试了多种解决方案 const initialState = { visibilityFilter: VisibilityFilters.SHOW_ALL, shop: { purchasedItem

我正在尝试使用Redux和纯Javascript实现一个简单的购物车功能。我已经将我的还原程序分为两部分,一部分用于UI,另一部分用于购物车功能

我的问题是,当向购物车添加一个项目时,它在状态中显示良好,但当我添加另一个项目时,它会覆盖状态中的前一个项目。我已经为此挣扎了一段时间,并尝试了多种解决方案

const initialState = {
  visibilityFilter: VisibilityFilters.SHOW_ALL,
  shop: {
    purchasedItems: [],
    shopItems: [...shop.items]
  }
}

function shopReducer(state = initialState, action) {

  switch (action.type) {
      case BUY_ITEM:
      const clickedItem = state.shopItems.filter( item => item.id == action.id);
      return {...state, purchasedItems: [...state.purchasedItems, clickedItem ] }

function buyItemShop(id) {
  return {
    type: BUY_ITEM,
    id
  }
}
对象分解不会执行深度合并

无论如何,您还有一些其他问题,因为您没有使用来自状态的正确密钥

应改为:

  return {
    ...state,
    shop: {
      purchasedItems: [...state.shop.purchasedItems, clickedItem],
      shopItems: state.shop.shopItems,
    },
  }

这很有效-只需在return语句中传播clickedItem对象

function shopReducer(state = initialState.shop, action) {

  switch (action.type) {
    case BUY_ITEM:
      let clickedItem = state.shopItems.filter( item => item.id == action.id);
      return {...state, cartItems: [...state.cartItems, ...clickedItem ] }

由于我的shopReducer只处理初始状态的shop部分,因此将在与PurchasedItems和shopItems相同的级别上设置一个新的shop密钥。此reducers范围中的状态仅为PurchasedItems和shopItems,因此一个浅显的值就足够了,正如我所说的,第一个加法在PurchasedItems数组中显示得很好,问题是第二个加法覆盖了第一个加法。我不理解您的意思,从reducer中tbh.console.logstate{purchasedItems:Array0,shopItems:Array4}purchasedItems:[]shopItems:4[{…},{…},{…},{…},{…},{…}]始终记住不可变这个词。