现在,如果我想更改商店中的value,我应该执行以下步骤:
- 转到constants/actionTypes 文件,创建一个带有动作类型的行
- 转到动作并创建动作功能
- 在我使用它的每个组件中,我应该为 mapDispatchToProps 创建一个函数
- 在reducer中,我应该写一个改变的逻辑
如此复杂的意义何在?如果我只做一个包含改变状态的动作的文件,会不会是错误的?例如:
// 动作.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
它的代码可以是这样的
// actionsDispatcher.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 传递给 dispatch 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 个不同的文件?
谢谢