- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用相同的 reducer 来更新状态的不同部分是反模式吗?
就像我的数据缩减器有一个 GET_DATA_DONE
操作,更新 state.data,然后在另一个实例中,您使用获取其他内容并调用 GET_DATA_DONE
来更新 state。其他东西
?
或者你会做类似GET_SOMETHING_DATA_DONE
之类的事情......多个差异操作做同样的事情吗? (几乎干
)
reducer .js
export const reducer = (state, action) => {
switch (action.type) {
case actions.GET_DATA_REQUESTED:
return { ...state, isLoading: true };
case actions.GET_DATA_DONE:
return { ...state, isLoading: false, data: action.payload };
case actions.GET_DATA_FAILED:
return { ...state, isLoading: false, isError: true }
default:
return state;
}
};
actions.js
export function getDataRequested() {
return {
type: 'GET_DATA_REQUESTED'
};
}
export function getDataDone(data) {
return {
type: 'GET_DATA_DONE',
payload: data
};
}
export function getDataFailed(error) {
return {
type: 'GET_DATA_FAILED',
payload: error
};
};
export function getDataEpic(action$) {
return action$.ofType(GET_DATA_REQUESTED)
.mergeMap(action =>
ajax.getJSON(action.url)
.map(response => getDataDone(response))
.catch(error => getDataFailed(error))
);
}
构建应用程序的最佳方式是什么,让 getDataEpic
充当 API 工厂,并且从 getDataDone(response)
返回的数据可以传递给另一个应用程序 reducer 根据操作更新状态的一部分,例如使用 getDataDone
的城市操作 reducer 调度另一个使用响应更新 state.cities 的操作?
编辑:我已经制作了一个带有 rx-observable 和 redux 的应用程序,调用 3 个不同的 api,但我最终得到了很多重复的代码,并且对解决方案不满意,所以我想构建一个正确架构的应用程序
希望我说得足够清楚。
非常感谢!
最佳答案
如果处理它自己的 child 的状态,我不认为这是一种反模式,但如果使用太多,它肯定会给你带来麻烦。让它修改完全不相关的状态是一种明确的反模式。 According to the docs第一行就一语中的。
For any meaningful application, putting all your update logic into a single reducer function is quickly going to become unmaintainable.
我们不是在谈论“所有数据”,而是在谈论来自单个 API 调用的所有数据。
设置加载标志并不太复杂,但在现实世界的应用程序中,对于同时设置加载标志、错误标志和“数据”的 reducer 来说,会变得更加复杂。这是假设我们甚至知道所请求的数据是什么。
在您的示例中,如果目的是通过化简器创建 API 工厂,我们必须假设 API 可以返回任意数量的不同数据结构,现在它可以是 string
或int
但如果它是一个深层嵌套的 Object
呢?您将如何访问此数据并将其与另一条数据区分开来?
假设我们有一个应用程序,其数据结构仅用于处理错误:
{
"errors": {
"byId": {
"1": {
"code": 500,
"message": "There was an internal server error"
},
"2": {
"code": 400,
"message": "There was another error."
},
"3": {
"code": 999,
"message": "Wow! weird error."
},
},
"all": ["1", "2", "3"]
}
}
我可能有一个 byId reducer ,它返回一个计算出的键,并使用另一个 reducer 作为值。
byId = (state={}, action) => {
if (action.type === 'ADD_ERROR') {
...state,
[action.id]:error_reducer(state[action.id], action)
} else {
return state
}
}
error_reducer 可能看起来像
errorReducer = (state={}, action) => {
if (action.type === 'ADD_ERROR') {
code: action.code,
message: action.message
} else {
return state
}
}
我认为让 errorReducer 处理代码和消息更有意义,因为我们知道它们都是相互包含的数据片段,其中每个错误都是互斥的(不同的 id),因此需要它们自己的 reducer 。
在处理实际应用程序时,这样做的另一个主要优点是,当数据分离时,一个操作可以更新应用程序的许多不同区域的状态。当 reducer 处理多个状态时,这些绑定(bind)状态会变得更难更新。
<小时/>您可以在 reducer 中使用许多不同的模式,它们都没有错,但是我发现这种模式非常适合我,并且我已经在一个相当复杂的生产应用程序中成功地使用了它。
话虽如此,AJAX 函数的一种可能方法是编写一个通用操作来接受包含您的调度的对象。
通过使用像 redux-thunk 这样的库您可以执行多个调度,以使用不同的数据更新状态的不同部分。我不会在这里解释 redux-thunk 因为我认为它超出了问题的范围。
示例对象可能如下所示:
{
getDataRequested: function () {
return {
type: 'GET_DATA_REQUESTED'
};
},
getDataFailed: function (error) {
return {
type: 'GET_DATA_FAILED',
payload: error
};
},
getDataDone: function (data) {
return {
type: 'GET_DATA_DONE',
payload: data
};
}
}
然后您可以将此回调对象以及 API 端点、REST 请求类型等传递给您的主 AJAX 函数。
我希望这会有所帮助。
关于javascript - 像 api 工厂一样对多个 Ajax 调用重用相同的 reducer 和史诗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47250757/
我应该执行以下操作: 可能通过服务/工厂,使用 $q(异步)查询 API 以获取大型名称数据集 有另一个服务(也是异步的),它应该只返回上述工厂的元素,如果它们与某个字符串(搜索字段)匹配。目的是缩小
我有一个通用的基类。我有一个实现基类的具体类。 我将如何创建工厂类/方法来交付不同类型的具体类? 举个例子: public class ReceiverBase where T : IInte
我正在查看以下链接中的 Ninject Factory 扩展: http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-intro
工厂、提供商和服务这三个术语之间有什么区别? 刚刚了解 NHibernate 及其存储库模式(POCO 类等)。 最佳答案 工厂:通过将一堆位组合在一起或基于某种上下文选择类型来组装类 Provide
使用CGLIB我可以做到 final var enhancer = new Enhancer(); enhancer.setUseCache(false); enhancer.setSuperclas
我试图在 Kotlin 中使用伴随对象工厂方法(相当于 Java 中的静态工厂方法)创建一个嵌套内部类。这是我的代码的简化版本。 class OuterClass { var myData:L
我正在为我的大学做一个项目,但遇到了问题。 基本上,该项目由一个客户端-服务器应用程序组成,我想创建一个用于通信的 Packet 类。数据包由 header 和主体组成。现在问题来了。我可以有一些不同
这个问题在这里已经有了答案: Why doesn't polymorphism work without pointers/references? (6 个答案) What is object sl
我正在制作一个套接字工厂。我希望每个外部应用程序都使用 Socket 类的接口(interface),它是几个类(ServerSocketTCP、ClientSocketTCP、ServerSocke
我是 angularjs 的新手,我正在尝试创建一个小型电影数据库。这是我第一次使用工厂,我想确保这是正确的方法,以及如何在另一个功能中使用这个工厂,如下所示? 我希望这个工厂只运行一次,这样我就可以
这个问题在这里已经有了答案: Java inner class and static nested class (28 个答案) 关闭 5 年前。 public class DataFactory
我看过很多关于 C++ 工厂的帖子,但到目前为止我还没有看到解决我的问题的解决方案。 (虽然我可能遗漏了一些东西。) 示例控制台应用程序: #include #include #include
这是一个简单的 C++ 项目,有 2 种设计模式:单例和工厂,sigleton 也是一个模板化类,一个接口(interface) (IHash) 和一个类 (Hash1)。一个简单的工厂类 (Hash
这个问题类似于Factory and generics ,并且可能有相同的答案,但它是不同的。我有一个通用基类,它将由完全独立的 JAR 中的类进行扩展。所述 JAR 应该能够在不更改任何其他代码的情
问题是我需要为传递的类创建一个新实例 有没有办法重写这个函数,让它可以接受任意数量的参数? function createInstance(ofClass, arg1, arg2, arg3, ...
我想用简单的 C++ 语法创建一个简单的工厂方法: void *createObject(const char *str,...) { if(!strcmp("X",str)) retu
经过大约 10 个月的程序化 PHP 学习后,我现在正尝试着手研究基本的 OOP 原则和设计模式。这是一个爱好,我没有那么多时间去追求它,所以请原谅这个问题的水平很低。 我的网站(目前 100% 程序
我有一个简单的问题。 我如何编写一个工厂来定义使用 make() 或 create() 的关系,具体取决于原始调用 make() 还是 create()? 这是我的用例: 我有一个简单的工厂 /**
我正在尝试在延迟加载模块中提供 APP_BASE_HREF 注入(inject) token ,然而,工厂方法根本没有被调用。 在这里https://github.com/MaurizioCascia
我有以下 ast: import { factory as f } from 'typescript' const typeDeclaration = f.createTypeAliasDeclara
我是一名优秀的程序员,十分优秀!