【问题标题】:Updating child array in reducer using React Context使用 React Context 更新 reducer 中的子数组
【发布时间】:2020-04-15 20:01:02
【问题描述】:

我正在使用React上下文进行一些过滤,并且在选择过滤器时很难更新孩子的数组值。

我希望能够按用户在下拉列表中选择的最低价格进行过滤,然后我发送一个操作以将其存储在减速器状态,但是,当我尝试更新内部数组(homes : []) 存在于开发数组中(填充了加载数据),我似乎清除了内部数组之外的现有数据?

简而言之,我需要能够维护现有的开发数组,并在家庭数组中按价格过滤掉,我之前提供了我的示例代码的副本,如果我解释得很好,请告诉我够了!

export const initialState = {
  priceRange: {
    min: null
  },
  developments: []
};


// Once populated on load, the developments array (in the initialState object) 
// will have a structure like this, 
// I want to be able to filter the developments by price which is found below

developments: [
  name: 'Foo',
  location: 'Bar',
  distance: 'xxx miles',
  homes: [
    {
      name: 'Foo',
      price: 100000
    },
    {
      name: 'Bar',
      price: 200000
    }
  ]
]

case 'MIN_PRICE':
  return {
    ...state,
    priceRange: {
      ...state.priceRange,
      min: action.payload
    },
    developments: [
      ...state.developments.map(development => {
      // Something here is causing it to break I believe?
        development.homes.filter(house => house.price < action.payload);
      })
    ]
  };
<Select onChange={event=>
  dropdownContext.dispatch({ type: 'MIN_PRICE' payload: event.value }) } />

【问题讨论】:

  • 从 API 获取数据后,它会返回一个对象数组,这就是我将其保留为数组的原因

标签: javascript reactjs reducers


【解决方案1】:

您必须将房屋与其他属性分开,然后您可以应用过滤器并重建开发对象:

return = {
    ...state,
    priceRange: {
        ...state.priceRange,
        min: action.payload
    },
    developments: state.developments.map(({homes, ...other}) => {
        return {
            ...other, 
            homes: homes.filter(house => house.price < action.payload)
        }
    })
}

【讨论】:

  • 感谢您的上述回答@HermitCrab,如果我要添加一个 maxPrice 范围,并在上面复制您的答案,但更改 house.price &gt; action.payload... 过滤器是这里最好的方法吗?好像结果是0一样,我相信它被过滤后不会再显示任何东西了?
  • 如果没有房屋符合您的过滤条件,则房屋将是一个空数组 [ ]
  • 是否可以将值重置回初始状态?如果它在它为0之后会匹配过滤器?抱歉,我是新手,非常感谢您的帮助!
  • 这一定是可能的,但这并不容易,并且生成的代码可能很丑陋并且很难调试。问题:为什么需要改变这个复杂的对象?你不能在渲染时过滤它吗
  • 那么有没有更简单的方法呢?我是使用 Context/Reducers 的新手,这种方法是否比它需要的更复杂?如果是这样,请您解释一下为什么以及如何处理它?
猜你喜欢
  • 2021-07-06
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 2020-06-06
  • 2022-07-22
  • 2020-06-01
  • 1970-01-01
  • 2020-08-23
相关资源
最近更新 更多