【问题标题】:How to add a new property to Redux state when dispatching an action调度操作时如何向 Redux 状态添加新属性
【发布时间】:2020-06-17 14:57:34
【问题描述】:

我的reducer 中有一个initialState,它有点嵌套。我试图在调度动作/状态更改时向我的状态添加一个新属性“isTouched”。

    const initialState = {
     isLoading: false,
     events: [
      { year:2021 , place: [{id:1,name:"BD"}] },
      { year: 2020, place: [{id:2,name:"AMS"}] },
    ],
  };

在我的减速器中:

case types.TOGGLE_PLACE_INFO:
  return {
    ...state,
     here need to write the logic if events.place.id === action.payload then add a new property to 
   "place" like this: place: [id:1,name:"BD",isTouched:true]
   }

所以在那之后我的状态将如下所示:

   const initialState = {
     isLoading: false,
     events: [
      { year:2021 , place: [{id:1,name:"BD", isTouched:true}] },
      { year: 2020, place: [{id:2,name:"AMS"}] },
    ],
  };

沙盒链接:https://codesandbox.io/s/holy-tdd-v3gbd?file=/src/reducers/commonReducer.js 因此,当单击 setTouched 按钮时,它应该更新位置并添加 isTouched: true

有没有人知道如何实现这个逻辑。任何帮助将不胜感激。在此先感谢。

【问题讨论】:

  • 这不是一个有效的JS语法[id:1,name:"BD", isTouched:true],请修复它。此外,您是否需要将 isTouched 添加到具有有效负载 ID 的所有个位置?
  • 当某些项目与基本上是 Id 的 action.payload 匹配时,我需要 isTouched,所以,在这种情况下: events.place.id === action.payload when action.payload = == 1 然后 isTouched 将被添加到第一个项目
  • @DennisVash,你试过了吗?

标签: reactjs redux react-redux


【解决方案1】:

正如丹尼斯所说,您的代码不是有效的 javascript。你想把它存储在一个对象而不是一个数组中

试试这样的:

const initialState = {
     isLoading: false,
     events: [
      { year: 2021, place: [ {id:1, name:"BD"} ]},
      { year: 2020, place: [ {id:2, name:"AMS"} ]},
    ],
};

case types.TOGGLE_PLACE_INFO:
  return {
    ...state,
    events: state.events.map((event) =>
              event.id === action.payload.id
                 ? {...event, place: [{...event.place, isTouched:true}]}
                 : event
              )
          }

我已更改您的 initialState,因此 place 现在有效。然后我映射所有值,如果它们匹配,我会返回当前的值,就像{...event},然后像这样添加新的isTouched 键:{...event, isTouched: true}。然后其次,如果他们不匹配我只是返回event

让我知道是否有意义。如果没有可以澄清!

【讨论】:

  • 我已经编辑了我的问题,它实际上是数组中的对象
  • event.id === action.payload.id 会从 place 或 events 数组中检查 id 吗?如果从 evens 数组中检查则没有 id,它应该检查 id 是否与 place.id 匹配跨度>
  • 很确定这行不通:应该是event.place[0].id === action.payload.id[{...event.place[0], isTouched: true}]。当然,实际上并不清楚为什么它必须嵌套在数组中......
  • 是的,它现在不起作用。让我尝试更新它。为什么要放置一个数组?
  • 好吧,不幸的是,这是 JSON 响应,我现在必须处理这让事情变得复杂
猜你喜欢
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 2019-12-22
  • 1970-01-01
相关资源
最近更新 更多