首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在操作和属性中传递对象

在操作和属性中传递对象
EN

Stack Overflow用户
提问于 2015-12-28 21:29:33
回答 2查看 2.1K关注 0票数 1

在我在redux中看到的示例中,动作对象似乎总是包含我们正在创建/编辑的状态的属性,而不是直接传入对象。例如

代码语言:javascript
复制
/* In the action creator */
export function addTodo(text) {
  return { type: types.ADD_TODO, text }
}

/* In the reducer */
....
case ADD_TODO:
  return [
    {
      id: state.reduce((maxId, todo) => Math.max(todo.id, maxId), -1) + 1,
      completed: false,
      text: action.text
    }, 
    ...state
  ]

这样做有什么特别的好处吗,而不是直接在操作中传递“todo”对象,并在还原器中添加缺少的元素?

我正在开发一个应用程序,在这个应用程序中,被传递的对象有很多属性,我发现我必须重复从每个还原器函数中的动作中提取这些属性。例如,在前面的示例中,是否更容易将action.todo设置为相关对象,并且还原器只添加缺少的任何属性(例如id)?

这是我未能掌握的某种惯例/模式吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-28 22:04:11

一般来说,我认为你的行为应该尽可能简单,只传达他们所需要的最少数量的信息。但是,您当然可以将操作的结构更改为更便于处理的格式。一个常见的模式是使用payload键指向所有数据。例如:

代码语言:javascript
复制
    /* In the action creator */
    export function addTodo(text, date, priority) {
      return {
        type: types.ADD_TODO,
        payload: {
          text,
          date,
          priority
        }
      };
    }

    /* In the reducer */
    case ADD_TODO:
      return [
        Object.assign({}, action.payload, {
          id: newId()
        }, 
        ...state
      ];

您的有效载荷构成了todo对象的基础。不是提取几个属性,而是只提取一个属性。

票数 1
EN

Stack Overflow用户

发布于 2020-09-28 11:59:13

这是一个旧的职位,但仍然值得额外的答案。我也是来自OO编程的世界,我也偶然发现了这一点:

通常建议您将json传递给redux操作,而不是由它生成的对象,因为它允许具有更舒适的调试和测试功能。对于这两种情况,您都需要序列化您的“数据”,如果该数据是对象/实例等,则不能完全序列化。这与传递的对象的属性或配置是相反的。这是一种不同的看法,如何完成的事情,真的很好的好处。

注意仔细的措辞--我不能说你不应该传递一个实例,也不能说不传递一个实例更好。但这是今天的常识,首选的方式。

这里还有几句话:https://redux.js.org/faq/design-decisions#why-doesnt-redux-support-using-classes-for-actions-and-reducers

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34501035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档