design-patterns - 使用 redux 和类对象时如何修复重复的数据位置
问题描述
我正在尝试重构我redux
的 reducer 函数,我的目的是将数据操作函数移动到一个单独的类中。这应该是这样的:
减速器.js
const initialState = {
notes: []
}
function reducer(state = initialState, action) {
switch (action.type) {
case 'ADD_NOTES':
let newState = Note.addNew(action.note);
return newState;
...
}
}
note.js
class Note {
notes = [];
function addNew(note) {
return [...this.notes, note];
}
}
我的问题notes
是存储在多个位置:state
reducer 函数的参数和notes
Note 类内部。解决此问题的一种方法是notes
从类中删除并将 addNew 函数修改为,addNew(notes, newNote)
但这样我必须将数据传递给每个操作函数。
有没有更好的解决方案?
解决方案
您在这里非常正确,但只有一个问题。让我简要介绍一下 redux 的工作原理。
在 redux 语言中,您的 addNew 函数称为 Action。您不需要将状态(即所有注释)传递给减速器。reducer 会自动获取它。以下是您发送操作的方式。
这就是 redux 的工作原理。
- 您将操作(更新事件)从您正在使用的组件中分派到状态。
请参阅此处的第 9 行 您可以将任何您想要的内容传递给该特定操作。假设您将注释传递给操作 addNew。代码将是
const sendNote = note => {
store.dispatch(addNew(note);
};
现在,一旦您发送了动作。您的操作将捕获该特定操作并将其转发给减速器。现在行动应该总是形式
{ type : 'ADD_NOTE', payload : note } 注意类型和有效负载。现在这是添加注释的操作。现在这个动作将被发送到所有的reducer。作为参考,请在此处查看第 15 行。
最后,reducer 捕捉到你的动作并自动获取状态。请记住,您只需要传递 initialState 作为默认值。它总是获得完整的状态。
现在你的减速器将改变如下:
function reducer(state = initialState, action) {
switch (action.type) {
case 'ADD_NOTES':
return state.notes.push(action.payload);
}
}
这将更新形状为的状态:
状态 {注释:[]}
我强烈建议您阅读这篇长而深入的文章,其中 Ohans 帮助您使用 Redux 开发真实世界的应用程序。
推荐阅读
- fluentvalidation - FluentValidations:WithMessage 包含父数据?
- flutter - 应该如何在 Flutter 应用程序中实现范围为单个路由的提供程序?
- python - 如何在条形图上应用自定义渐变颜色图?
- python - 如何在 Python 中创建 BACnet 模拟值和 BAC0?
- java - 在 javafx 的另一个线程中更改标签文本的问题
- c# - EF 6 是否要求外键具有反映外表名称的名称?
- ios - 无法在 Swift 5 中解码 base64 字符串
- node.js - Firestore Admin SDK FieldValue.increment 返回错误值
- python - 如何防止图例在散景中被截断?
- apache-kafka - 为什么 Schema Registry 发送不需要的 POST 请求来创建 topicName-key 和 topicName-value 架构