【发布时间】:2020-08-16 18:15:57
【问题描述】:
现在,如果我想更改商店中的值,我应该执行以下步骤:
- 转到constants/actionTypes文件,创建一个动作类型的行
- 转到操作并创建操作函数
- 在我使用它的每个组件中,我应该为 mapDispatchToProps 创建一个函数
- 在reducer中我应该写一个改变的逻辑
如此复杂的意义何在? 如果我只做一个文件的动作会改变状态,那会不会错?例如:
//actions.js
export const setCategories = (payload, setState, currentState) => setState({ categories: payload })
export const addCategory = (payload, setState, currentState) => setState({ categories: [...currentState.category, payload] })
为了让它工作,我可以为所有项目创建几个通用函数
1) getActions,它自动收集来自 actions.js 的所有导出并将它们提供给 mapDispatchToProps,因此我们可以在所有组件中编写
const mapDispatchToProps = getActions
它的代码可以是这样的
//actionDispatcher.js
import * as actions from 'actions'
const getActions = (dispatch, ownProps) => {
Object.keys(actions).forEach(actionName => {
const fn = actions[actionName]
actions[actionName] = payload => dispatch({ action: fn, payload, type: _.toSnakeCase(actionName) })
}
return actions
}
这意味着我们从actions.js中传递action的函数
2) setState 与 react 函数类似,但用于 redux 状态
那么在reducer函数中我们就对了
function rootReducer(state = initialState, action) {
if (action.action) {
action.action(action.payload, setState, state)
}
// here we make it extandable for ordinary way if required
if (action.type === '...') {
// ...
}
}
没有别的了……
所以问题是这种方法有什么问题,编码人员只需在一个文件“actions.js”中编写一个函数,然后从任何组件作为 props.someActionName(someParams) 调用它,而不是更改 4 个不同的文件?
谢谢
【问题讨论】:
-
想象一下,您必须运行诸如 api 调用、错误处理和许多其他功能才能更新状态的一部分。对于更大更复杂的应用程序,使用 Redux 提供的框架来管理和更新全局状态变得更加容易。
-
@SohanPatil,我真的很抱歉,是什么让你认为我没有读到它?
-
@Dmitry Reutov 请参考this previous question
-
@DmitryReutov 如果你真的想把它全部放在一个文件中,并且用例也可以,请参考Redux ducks
标签: reactjs react-redux