Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.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还原程序--更改深度嵌套状态_Javascript_Reactjs_Redux - Fatal编程技术网

Javascript Redux还原程序--更改深度嵌套状态

Javascript Redux还原程序--更改深度嵌套状态,javascript,reactjs,redux,Javascript,Reactjs,Redux,我正试图了解如何改变redux中的深度嵌套状态。对我来说,组合减速器并更改这些片段的第一级状态属性是有意义的。我不太清楚的是如何更改深度嵌套属性的状态。 让我们假设我有一个购物车应用程序。以下是我的情况: { cart: { items: [] }, account: { amountLeft: 100, discounts: { redeemed: [], coupons: { bu

我正试图了解如何改变redux中的深度嵌套状态。对我来说,组合减速器并更改这些片段的第一级状态属性是有意义的。我不太清楚的是如何更改深度嵌套属性的状态。 让我们假设我有一个购物车应用程序。以下是我的情况:

{
    cart: {
      items: []
    },
    account: {
      amountLeft: 100,
      discounts: {
        redeemed: [],
        coupons: {
          buyOneGetOne: false
        }
      }
    }  
}
当用户输入代码时,假设他们可以兑换“buyOneGetOne”优惠券,该值应该为真。 我有一个大车减速器和一个帐户减速器。对于第一级属性(例如,如果我正在清除购物车的项目),我只需在我的reducer中执行以下操作:

case 'EMPTY_CART':
  return Object.assign({}, state, {items: []});
但是,要更改buyOneGetOne,我似乎首先需要在优惠券上执行Object.assign(因为buyOneGetOne已被修改),然后在折扣上执行Object.assign(因为我已修改优惠券),最后发出操作,以便减速机可以在帐户上执行Object.assign(因为折扣现在已更改)。这看起来很复杂,而且很容易出错,这让我相信一定有更好的方法

我这样做完全错了吗?似乎减缩器只用于修改状态的根级别属性(如cart和account),我不应该让减缩器触及帐户内的状态(如折扣减缩器),因为帐户已经有了减缩器。但是,当我只想更改状态树下的一个属性时,将从该更改到对象链上的每个对象合并到根的子对象会变得很复杂


你能/你应该在减速机里面装减速机吗,就像在这种情况下有折扣减速机一样?

你肯定可以在减速机里面装减速机;事实上,redux演示应用程序会执行以下操作:

例如,您可以制作一个名为“折扣”的嵌套减速器:

function discounts(state, action) {
    switch (action.type) {
        case ADD_DISCOUNT:
            return state.concat([action.payload]);

        // etc etc
    }
}
然后在您的帐户reducer中使用此reducer:

function account(state, action) {
    switch (action.type) {
        case ADD_DISCOUNT:
            return {
                ...state,
                discounts: discounts(state.discounts, action)
            };

         // etc etc
    }
}


要了解更多信息,请查看丹本人的视频,特别是视频

你应该为每层深嵌套
组合减速器

是的,分离这些减速器是正确的。实际上,如果您担心这些操作中的某些操作将需要更改其他减速器,那么您可以对其他常量作出反应,或者只发送另一个操作

为了解决这个问题——允许简单的合成,避免冗长的语法,以及合并结果。 因此,您的示例如下所示:

import { createTile, createSyncTile } from 'redux-tiles';

const cartItems = createSyncTile({
  type: ['account', 'cart'],
  fn: ({ params }) => ({ items: params.items })
});

const coupons = createSyncTile({
  type: ['account', 'coupons'],
  fn: ({ params }) => params,
});

const reedemedCoupons = createSyncTile({
  type: ['account', 'reedemedCoupons'],
  fn: ({ params }) => params.coupons
});

const account = createTile({
  type: ['account', 'info'],
  fn: ({ api }) => api.get('/client/info')
});

使用这种策略,每个组件都是原子的,您可以轻松地创建新组件并分派其他组件,而不会影响其他组件,这使得将来当您的“分片”遵循单一责任原则时,重构和删除某些功能变得更加容易。

这很酷,我没有意识到这一点。然而,我们的目标不是也要尽可能地建立一个扁平的状态树吗?嵌套减速器和扁平状态树之间的平衡在哪里?购物车示例的新链接看起来棒极了。2017年以来我没有看到任何更新,发生了什么?还有其他类似的东西吗?