【问题标题】:How to split Redux actions into multiple files如何将 Redux 操作拆分为多个文件
【发布时间】:2017-06-17 14:54:15
【问题描述】:

我有一个操作文件夹,其中包含用于操作类型常量的常用 types.js 文件,以及执行以下操作的 index.js 文件

import axios from 'axios';
import { browserHistory } from 'react-router';
import {
  AUTH_USER,
  UNAUTH_USER,
  AUTH_ERROR,
  FETCH_MESSAGE
} from './types';

并且还为我的所有操作导出函数。我想知道,有没有一种方法可以创建多个文件来定义我的操作,这样 index.js 不会变得太长,然后将它们导入到我的 index.js 中,所以在我的组件中我仍然可以这样做,例如 @987654322 @ 并且不必担心操作来自哪个文件?

【问题讨论】:

  • 确定为什么不呢?创建多个文件,然后在这个文件中导入这些文件的内容,然后导出。你怎么了?

标签: redux


【解决方案1】:

假设您具有以下目录结构

actions/
  index.js
  types.js
  ProductActions.js

在你的 actions/index.js 中,写:

export * from './ProductActions';

然后将 ProductActions.js 定义为:

import axios from 'axios';
import { ... } from './types';

export const fetchProducts = () => { ... };
export const deleteProduct = () => { ... };

记得用新的动作类型文件更新你的 reducer:

import { ... } from '../actions/types'

【讨论】:

  • 好奇export const fetchProducts = () => { ... }; vs export function fetchProducts() { ... } 除了感觉自己像个 es6 潮人之外是否还有优势?
  • @ChrisTsongas,您可以使用其中任何一个。我个人决定坚持使用 ES6 语法,所以我几乎不再写 function 关键字了。但请注意,使用函数与箭头函数语法在范围上存在差异。本质上,关键字 this 将具有不同的含义。见jsrocks.org/2014/10/arrow-functions-and-their-scope之类的文章
【解决方案2】:

比如说我们有两个动作文件;行动A 和行动B。 假设在 actionsA 中我们有以下动作函数。

//actionsA

//You can import your actionTypes here
export function functionActionsA1(){ /* action body ActionsA1 */}

export function functionActionsA2(){ /* action body ActionsA2 */}

在actionB中我们有以下代码:

//actionsB

//You can import your actionTypes here

export function functionActionsB1(){ /* action body ActionsB1 */}

export function functionActionsB2(){ /* action body ActionsB2 */}

假设我们有一个包含两个文件的文件夹操作; actionsA 和 actionsB,以及一个 index.js 文件。

actions/ 
   index.js
   actionsA.js
   actionsB.js

在 index.js 文件中,我们从 actionsA 和 actionsB 中导入不同的动作,然后导出导入的函数。

//index.js
import {functionActionsA1, functionActionsA2 } from './actionsA'
import {functionActionsB1, functionActionsB2} from './actionsB'

export functionActionsA1
export functionActionsA2
export functionActionsB1
export functionActionsB2

现在您只需导入索引文件并获取您想要使用的操作,如下所示:

import {functionActionsA1,functionActionsB2} from '../../actions/index'

【讨论】:

  • 在尝试这样的解决方案时,我遇到了一个解析错误,说我需要将我正在导出的内容(例如,functionActionsA1)包装在{} 中。因此,index.js 文件底部的每个导出行应该更像export { functionActionsA1 }
  • 在这个例子中我使用了ES6 synthax of exporting。我猜您使用的是 ES5,这就是您遇到此问题的原因。见here
  • 也有这个问题(动作文件变得太“大”);质疑自己这是否不是不良模式的标志。个人意见,但是这里描述的导入再导出看起来很糟糕,将它与根据定义“可拆分”的 combineReducers 进行比较。我仍然不确定大部分逻辑应该在哪里完成(动作或减速器)
  • @Ben 我认为这真的归结为您的偏好。我非常喜欢在我的 Redux 操作中使用 Thunks,这导致我将大部分逻辑都包含在操作中。我与之交互的每个 Redux 用户似乎都遵循相同的心态(将大部分逻辑保留在操作中,并拥有更小、更简洁的 reducer)。查看 Redux GitHub 中的 discussion 了解更多信息
  • 感谢链接!完全一样,达到了Object.assign({}, state, action.payload) 是我的减速器中唯一使用的东西。关于那些相关的东西。你仍然在行动中得到很多东西,正在寻找一种干净的方式来拆分它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 2016-10-26
相关资源
最近更新 更多