能否在Redux Store actions中使用OOP类替代纯函数?
Redux Action中是否可以使用OOP类替代纯函数写法
首先纠正一个常见的认知偏差:Redux要求reducer必须是纯函数,对action creator(也就是你提到的actions函数)没有强制要求必须是纯函数,但业界实践通常推荐把action creator写为纯函数,保证相同输入永远返回相同的action对象,方便调试和保证状态可预测。
结论:语法上完全可以这么写,但是有明确的约束,且通常不推荐
可行的前提条件
你要保证你写的类满足以下要求,才不会导致Redux运行出现问题:
- 类中不要定义可变的实例属性,类方法的返回值完全由入参决定,不能依赖或修改实例内部的可变状态,否则会破坏action的可预测性,导致时间旅行、状态回溯等Redux调试能力失效
- 类的每个方法最终都需要返回Redux认可的合法action:要么是带有
type字段的普通纯对象,如果你用了redux-thunk等异步中间件,也可以返回thunk函数等中间件支持的类型,不能返回类实例或者其他非法格式 - 方法内部不要引入额外副作用(比如直接修改全局变量、发起异步请求等,异步逻辑建议放到中间件层处理)
符合要求的写法示例:
class ArticleActions { getArticles() { return { type: 'ARTICLES/GET_LIST' } } addArticle(data) { return { type: 'ARTICLES/ADD_ITEM', payload: data } } deleteArticle(id) { return { type: 'ARTICLES/DELETE_ITEM', payload: id } } } // 导出单例直接使用即可,不需要每次调用都实例化 export const articleActions = new ArticleActions() // 组件内调用和普通action creator用法完全一致 dispatch(articleActions.addArticle(formData))
不推荐这么写的原因
这种写法没有带来实质的收益,反而增加了不必要的复杂度和风险:
- 纯函数写法更简洁,不需要实例化,也完全不存在不小心引入可变实例状态的风险
- 无法和Redux官方生态工具无缝对接,比如Redux Toolkit的
createAction、createAsyncThunk等API都是基于函数设计的,用类写法反而要额外做适配 - 不符合Redux社区的常规实践,其他维护你的代码的开发者需要额外理解你的写法设计,增加协作成本
内容的提问来源于stack exchange,提问作者Amr Eraky
相关产品推荐
相关产品推荐

