You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
聊聊我对 dva 的看法,官方说了,基于 redux + redux-saga 的方案,只是在你写的时候,都写在一个 model 文件,然后它帮你做一些处理;其次它是一个框架,而不是一个库,是否意味着: 我在项目开始之前,我就需要确定项目的架构是不是用 dva,如果开发一半,我想换成 dva 这种状态管理的写法,而去引入 dva ,是否不合理?
再或者,我只是做一些 demo、写点小型的个人项目,但我又想像写 dva 的数据状态管理 model 那种方式,引入 dva 是不是反而变得笨重呢?
如果很不幸,你项目中没安装 react-redux,那么你只能在每一个组件中,引入这个 store,然后通过 store.getState() 拿到 state 值了
但是这种方式的缺陷就是,你要确保你的 state 是最新的,也就是你改完 state 值之后,需要重新 store.getState() 拿一下最新的值,这是比较麻烦的
importstorefrom'@your_folder/store'// 这个store就是你使用 Redux.createStore API 生成的storeclassappComponentextendsReact.Component{constructor(){this.appState=store.getState()['appModel']}}
前言
今天给大家带来一款 redux 中间件 : 👏 rc-redux-model,为你们 ✍️ 提供一种较为舒适的数据状态管理书写方式,让你简洁优雅的去开发;内部自动生成 action, 只需记住一个 action,可以修改任意的 state 值,方便简洁,从而释放你的 ⌨️ CV 键~
源码仓库地址 : rc-redux-model ,如果你觉得不错,求个 ✨
背景
相信大家都了解
redux
,并且也认同这种数据流的方式(毕竟不认同,你也不会用嘛~),然,世间万物,皆有利弊。本身我使用 redux 并不会有什么所谓的“痛点”,因为 redux 默认只支持同步操作,让使用者自行选择处理异步,对于异步请求 redux 是无能为力的。可以这么说,它保证自己是纯粹的,脏活累活都丢给别人去干。
于是我的痛点在于 : 如何处理异步请求,为此我使用了 redux-saga 去解决异步的问题
但是在使用
redux + redux-saga
中,我发现,这会让我的 [重复性] 工作变多(逐步晋升 CV 工程师),因为它在我们项目中,会存在啰嗦的样板代码。举个 🌰 : 异步请求,获取用户信息,我需要创建
sagas/user.js
、reducers/user.js
、actions/user.js
,为了统一管理 const,我还会有一个const/user.js
,然后在这些文件之间来回切换。没错, 这种样板代码,简直就是 CV 操作,只需要 copy 一份,修改一下名称,对我个人而言,这会让我不够专注,分散管理 const、action、saga、reducer 一套流程,需要不断的跳跃思路。
而且文件数量会变多,我是真的不喜欢如此
繁琐
的流程,有没有好的框架能帮我把这些事都做完呢?dva
以下引用 dva 官网的介绍 :
聊聊我对 dva 的看法,官方说了,基于 redux + redux-saga 的方案,只是在你写的时候,都写在一个 model 文件,然后它帮你做一些处理;其次它是一个框架,而不是一个库,是否意味着: 我在项目开始之前,我就需要确定项目的架构是不是用 dva,如果开发一半,我想换成 dva 这种状态管理的写法,而去引入 dva ,是否不合理?
再或者,我只是做一些 demo、写点小型的个人项目,但我又想像写 dva 的数据状态管理 model 那种方式,引入 dva 是不是反而变得笨重呢?
回过头来看,我的出发点是 : 在于解决繁琐重复的工作,store 文件分散,state 类型和赋值错误的问题,为此,对于跟我一样的用户,提供了一个写状态管理较为[舒服]的书写方式,大部分情况下兼容原先项目,只需要安装这个包,就能引入一套数据管理方案,写起来又舒服简洁,开心开心的撸代码,不香吗?
于是
rc-redux-model
就这样出现了~rc-redux-model
需要明确的是 : rc-redux-model 是一个中间件,提供一种更为简洁和方便的数据状态管理[书写方式]。
特性
dva
一样舒服redux-thunk
,内部实现独立的中间件,所有的 action 都是异步 actionseamless-immutable
,只需开启配置,让你的数据不可变安装
相关说明
如何定义一个 model 并自动注册 action 及 reducers ?
每一个 model 必须带有 namespace、state,action 与 reducers 可不写,如需开启
immutable
,需配置openSeamlessImmutable = true
,一个完整的 model 结构如下rc-redux-model
会根据你的 state,每一个 state 的字段都会自动注册一个修改此 state 的 action,从而释放你键盘上的 ⌨️ CV 键, 例如 :那么会自动为你注册一个 action,action 名以
set${stateName}
格式,如你的 stateName 为 : userName,那么会自动注册的 action 为 :setuserName
你只要在组件中调用此 action 即可修改 state 值 (📢 不推荐使用这种 action 进行修改 state 值,推荐使用 setStore)
问题来了,当 state 中的值很多(比如有几十个),那么为用户自动注册几十个 action,用户在使用上是否需要记住每一个 state 对应的 action 呢?这肯定是极其不合理的,所以一开始是提供一个默认的 action ,用于修改所有的 state 值 ...
随之而来的问题是,如果只提供一个 action,那么所有修改 State 的值都走的这个 action.type,在 redux-devtools-extension 中,会看不到具体的相对信息记录(因为都是同一个 action),最终,还是提供一个默认的 action,此 action 会根据用户提供的
payload.key
,从而转发至对应的 action 中。🌟 所有修改 state 的 action,都通过 setStore 来发,不必担心在 redux devtools 中找不到,此 action 只是会根据你的 key,转发对应的 action 而已
如何发送一个 action ?
一个 action 由 type、payload 组成,type 的命名规则为 :
[model.namespace / actionName]
请注意,这里的每一个 action 都是 function, 也就是说,处理
同步action
的思路跟处理异步action
是一样的,如果你不明白,👉 请移步这里异步请求由谁处理 ?
在
model.action
中,每一个 action 都是 function,它的回调参数为 :dispatch
继续分发 actionthis.props.dispatch
的 action,你可以从这里拿到type
和payload
如何在组件中获取 state 值?
请注意,rc-redux-model 是一个中间件,并且大部分情况下,能够在你现有的项目中兼容,所以获取 state 的方式,还是跟你原来在组件中如何获取 state 一样
一般来讲,我们的项目都会安装
react-redux
库,然后通过connect
获取 state 上的值(没什么变化,你之前怎么写,现在就怎么写)如果很不幸,你项目中没安装
react-redux
,那么你只能在每一个组件中,引入这个 store,然后通过store.getState()
拿到 state 值了但是这种方式的缺陷就是,你要确保你的 state 是最新的,也就是你改完 state 值之后,需要重新
store.getState()
拿一下最新的值,这是比较麻烦的数据不可变的(Immutable) ?
在函数式编程语言中,数据是不可变的,所有的数据一旦产生,就不能改变其中的值,如果要改变,那就只能生成一个新的数据。如果有看过 redux 源码的小伙伴一定会知道,为什么每次都要返回一个新的 state,如果没听过,👉 可以看下这篇文章
目前 rc-redux-model 内部集成了
seamless-immutable
,提供一个 model 配置参数openSeamlessImmutable
,默认为 false,请注意,如果你的 state 是 Immutable,而在 model 中不设置此配置,那么会报错 !!!类型正确性 ?
不可避免,有时在
model.state
中定义好某个值的类型,但在改的时候却将其改为另一个类型,例如 :但在修改此 state value 时,传递的确是一个非 string 类型的值
这其实是不合理的,在 rc-redux-model 中,会判断
state[key]
中的类型与 payload 传入的类型进行比较,如果类型不相等,报错提示所有修改 state 的值,前提是 : 该值已经在 state 中定义,以下情况也会报错提示
此时想修改 state 中的另一属性值
极度不合理,因为你在 state 中并没有声明此属性, rc-redux-model 会默认帮你做检测
使用
如有疑问,看下边的相关说明~ 同时对于如何在项目中使用,👉 可以点这里
提供默认 action,无需额外多写 action/reducers
原先,我们想要修改 state 值,需要在 reducers 中定义好 action,但现在,
rc-redux-model
提供默认的 action 用于修改,所以在 model 中,只需要定义 state 值即可在页面中,只需要调用默认的
[model.namespace/setStore]
就可以修改 state 里的值了,美滋滋,不需要你自己在 action、reducers 去写很多重复的修改 state 代码复杂且真实的例子
hooks ?
hooks 的出现,让我们看到了处理复杂且重复逻辑的曙光,那么问题来了,在 hooks 中能不能用 rc-redux-model ,我想说 : “想啥呢,一个是 react 的特性,一个是 redux 的中间件, 冲突吗?”
API
每一个 model 接收 5 个属性,具体如下
提供的默认 Action
相关文章
The text was updated successfully, but these errors were encountered: