Flux 动作创建者应该分派细化动作还是全面动作?
Should a Flux action creator dispatch granular actions or sweeping ones?
前提
我正在重构一些 Flux stores/actions/action 创作者以使其更加 Fluxy(PUBLISH
、PUBLISH_SUCCESS
、PUBLISH_FAILURE
而不是奇怪的 IS_LOADING
动作) ,并且想知道如何构建我的动作:我的动作创建者应该调用单个动作(PUBLISH_SUCCESS
)还是多个动作(ADD_AUTHOR
、ADD_BOOK
等)?
例子
这是一个更具体的例子:
我有一个 TasksStore
用于保存我创新的新任务管理应用程序的待办事项,我有一个名字不太好的动作创建器 TaskActions
让我从服务器获取我的品种并添加新的 API。有点像这样:
const TasksStore = { ... };
const TaskActions = {
fetchTasks(),
addTask()
};
我应该调度什么操作来与 TasksStore 通信?
我看到两个选项:action-creator-api-specific actions (FETCH_TASKS
, FETCH_TASKS_SUCCESS
, FETCH_TASKS_FAILURE
, ADD_TASK
, ADD_TASK_SUCCESS
, & ADD_TASK_FAILURE
) 或可重复使用的操作(ADD_TASK
一遍又一遍地调用获取并调用一次 addTask()
)。
基本上,我的 API 应该是这样的(对于每个 action-creator-action,冗长的,可能是多余的,可分派的操作):
const TasksStore = {
on('FETCH_SUCCESS', (tasks) => { // add tasks });
on('ADD_SUCCESS', (task) => { // add task });
};
const TaskActions = {
fetchTasks() {
dispatch('FETCH');
myApi.fetchTasks(
(success_payload) => { dispatch('FETCH_SUCCESS', success_payload) },
(failure_payload) => { dispatch('FETCH_FAILURE', failure_payload) }
);
},
addTask() {
dispatch('ADD');
myApi.addTask(
(success_payload) => { dispatch('ADD_SUCCESS', success_payload) },
(failure_payload) => { dispatch('ADD_FAILURE', failure_payload) }
);
}
};
或像这样(简洁、可重复使用的可调度操作):
const TasksStore = {
on('ADD', (task) => { // add task });
};
const TaskActions = {
fetchTasks() {
dispatch('FETCH');
myApi.fetchTasks(
(success_payload) => {
success_payload.forEach((task) => { dispatch('ADD', task); })
},
(failure_payload) => { dispatch('FETCH_FAILURE', failure_payload)
);
},
addTask() {
dispatch('ADD');
myApi.addTask(
(success_payload) => { dispatch('ADD', success_payload),
(failure_payload) => { dispatch('ADD_FAILURE', failure_payload)
);
}
};
或介于两者之间?
谢谢!
我们决定采用更详细的路线:
对于 AJAX 操作(如示例中所示),我们调度特定的 "started" 操作,然后是 "success" 或 "failure" 操作:
dispatch('RETICULATE_SPLINES');
app.reticulateSpinesAndReturnPromise().then(
(success) => { dispatch('RETICULATE_SPLINES_SUCCESS'); },
(failure) => { dispatch('RETICULATE_SPLINES_FAILURE'); }
);
为什么?
- 这将动作创建者与动作分离了一点——动作创建者以调度动作的形式公开了一个统一的、可理解的 API:
ActionCreator.fetchMessages
将调度一个 FETCH_MESSAGES
动作,而不是ADD
或 FETCH_OR_ADD
或其他奇怪的东西。当没有意外调度时,理解像动作和存储这样的解耦系统(解耦是因为所有动作都通过调度程序)会容易得多。
- 它使多个商店更容易监听 action-creator-actions。当我们
.fetchMessages()
而不是 .postMessage()
时, MessageThreadsStore
是否需要更新?收听 FETCH_MESSAGES_SUCCESS
,而不是 ADD
,否则两者都可能被调用。
无论如何,希望对您有所帮助。
前提
我正在重构一些 Flux stores/actions/action 创作者以使其更加 Fluxy(PUBLISH
、PUBLISH_SUCCESS
、PUBLISH_FAILURE
而不是奇怪的 IS_LOADING
动作) ,并且想知道如何构建我的动作:我的动作创建者应该调用单个动作(PUBLISH_SUCCESS
)还是多个动作(ADD_AUTHOR
、ADD_BOOK
等)?
例子
这是一个更具体的例子:
我有一个 TasksStore
用于保存我创新的新任务管理应用程序的待办事项,我有一个名字不太好的动作创建器 TaskActions
让我从服务器获取我的品种并添加新的 API。有点像这样:
const TasksStore = { ... };
const TaskActions = {
fetchTasks(),
addTask()
};
我应该调度什么操作来与 TasksStore 通信?
我看到两个选项:action-creator-api-specific actions (FETCH_TASKS
, FETCH_TASKS_SUCCESS
, FETCH_TASKS_FAILURE
, ADD_TASK
, ADD_TASK_SUCCESS
, & ADD_TASK_FAILURE
) 或可重复使用的操作(ADD_TASK
一遍又一遍地调用获取并调用一次 addTask()
)。
基本上,我的 API 应该是这样的(对于每个 action-creator-action,冗长的,可能是多余的,可分派的操作):
const TasksStore = {
on('FETCH_SUCCESS', (tasks) => { // add tasks });
on('ADD_SUCCESS', (task) => { // add task });
};
const TaskActions = {
fetchTasks() {
dispatch('FETCH');
myApi.fetchTasks(
(success_payload) => { dispatch('FETCH_SUCCESS', success_payload) },
(failure_payload) => { dispatch('FETCH_FAILURE', failure_payload) }
);
},
addTask() {
dispatch('ADD');
myApi.addTask(
(success_payload) => { dispatch('ADD_SUCCESS', success_payload) },
(failure_payload) => { dispatch('ADD_FAILURE', failure_payload) }
);
}
};
或像这样(简洁、可重复使用的可调度操作):
const TasksStore = {
on('ADD', (task) => { // add task });
};
const TaskActions = {
fetchTasks() {
dispatch('FETCH');
myApi.fetchTasks(
(success_payload) => {
success_payload.forEach((task) => { dispatch('ADD', task); })
},
(failure_payload) => { dispatch('FETCH_FAILURE', failure_payload)
);
},
addTask() {
dispatch('ADD');
myApi.addTask(
(success_payload) => { dispatch('ADD', success_payload),
(failure_payload) => { dispatch('ADD_FAILURE', failure_payload)
);
}
};
或介于两者之间?
谢谢!
我们决定采用更详细的路线:
对于 AJAX 操作(如示例中所示),我们调度特定的 "started" 操作,然后是 "success" 或 "failure" 操作:
dispatch('RETICULATE_SPLINES');
app.reticulateSpinesAndReturnPromise().then(
(success) => { dispatch('RETICULATE_SPLINES_SUCCESS'); },
(failure) => { dispatch('RETICULATE_SPLINES_FAILURE'); }
);
为什么?
- 这将动作创建者与动作分离了一点——动作创建者以调度动作的形式公开了一个统一的、可理解的 API:
ActionCreator.fetchMessages
将调度一个FETCH_MESSAGES
动作,而不是ADD
或FETCH_OR_ADD
或其他奇怪的东西。当没有意外调度时,理解像动作和存储这样的解耦系统(解耦是因为所有动作都通过调度程序)会容易得多。 - 它使多个商店更容易监听 action-creator-actions。当我们
.fetchMessages()
而不是.postMessage()
时,MessageThreadsStore
是否需要更新?收听FETCH_MESSAGES_SUCCESS
,而不是ADD
,否则两者都可能被调用。
无论如何,希望对您有所帮助。