【问题标题】:updating a state in a reducer after put method在 put 方法之后更新减速器中的状态
【发布时间】:2018-01-26 18:51:08
【问题描述】:

我正在尝试创建一个 mern crud 应用程序,现在我正在尝试编辑项目的值。我正在努力将数据库的当前值更新为状态。

当我调度编辑操作时,redux 记录器中的next state 返回值 在编辑之前,我希望它返回带有编辑值的状态值。

如何将更新后的值返回到 reducer 中的状态?

这是我的减速器

case projectActions.UPDATE_PROJECT:
{

    return {...state, 
           project:state.project.map(item=> 
           (item._id===action.payload._id) ? action.payload.data:item )
           , ?                       
           }        

}

据我了解,

  • ...state是更新前的状态
  • project:state.project.map(item=> (item._id===action.payload._id) ? action.payload.data:item) 是更新后的值

  • ?这是具有更新值的状态。

我不确定如何退货?任何意见将不胜感激

redux logger的图片

值已在数据库中更新,但尚未更新道具,您可以在下一个状态值中看到。

【问题讨论】:

    标签: reactjs redux


    【解决方案1】:

    传播道具和对象定义的简要介绍;

    state 将是您之前的状态对象。 ...state 表示“提取此对象上的所有变量”。

    所以如果state{test: 'foo', test2: 'bar'},那么...statetest: 'foo', test2: 'bar'。注意缺少的对象括号。

    这在基于预先存在的对象创建新对象时很有用。 {...state} 正在将 state 中的所有属性应用到一个新对象上。

    {...state, test2: 'foobar'} 将根据最右边的值覆盖test2 的值。所以生成的对象将是{test: 'foo', test2: 'foobar'}

    这就是您为新状态定义的前两行所做的。您首先使用...state 应用previos 状态属性。然后,您将使用

    定义的新值覆盖 project 的先前值

    state.project.map(item=> (item._id===action.payload._id) ? action.payload.data:item )

    , ?的最后一行是废话。它应该被删除。

    如果这没有导致您期望的新状态,我会尝试在您返回之前记录有效负载的值。一个简单的console.log(action.payload) 应该会为您提供大量信息。

    【讨论】:

    • 感谢您的回答!这帮助我理解了 redux 状态数据的操作。看来减速机工作正常。但是,我确实控制台记录了更新案例的操作有效负载,我得到的只是编辑的值,然后在 redux 记录器中,next state 我在编辑之前拥有状态值。我不确定是什么问题。
    • 您的代码暗示有效负载应该是具有_id 属性的对象,以及(理论上)其他一些更新的属性。如果您从有效负载响应中获取一个值,而不是一个对象,那么您的 API 很可能没有返回您的 reducer 所期望的完整信息。
    • 我应该澄清一下,我得到的对象还包括 action.payload 控制台上已编辑项目的数据。我添加了一张 redux 记录器的图片来演示。
    • 您没有正确调用_id 值; action.payload._id 应该是 action.payload.data._id
    • 那行得通。我应该更多地关注这些事情。谢谢!
    猜你喜欢
    • 2021-07-18
    • 1970-01-01
    • 2018-08-08
    • 2019-12-12
    • 2019-07-05
    • 2018-06-06
    • 2017-11-10
    • 1970-01-01
    相关资源
    最近更新 更多