Redux-Toolkit的学习
写在前面:
很多是我的一点读完toolkit的个人理解,也有一定困惑,非官方。
toolkit的文档是纯英文的,读起来比中文自然是费力许多的,有一定缺漏。
redux的末尾:https://cn.redux.js.org/redux-toolkit/overview/
Redux-toolkit文档:https://redux-toolkit.js.org/tutorials/typescript#define-slice-state-and-action-types
RTK是什么?
# NPM
npm add @reduxjs/toolkit
npm add react-redux
# Yarn
yarn add @reduxjs/toolkit
react tookit主要解决了Redux的几个问题
- “配置 Redux store 过于复杂”
- “我必须添加很多中间件才能开始使用 Redux”
- “Redux 有太多样板代码”
说白了,这个工具库是为了简化Redux的使用而生的,官方文档也说明了强烈推荐使用Redux-Toolkit
原始人进化成三体人了!!!
使用方法
configureStore
api的作用
理解为用来简化createStore和combineReducer的一个api,用来生成一个全局的状态存储仓库store,然后从其他包里导入定义的reducer配置进reducer对象即可。
标准的Redux store的配置
1.把所有的切片的reducercombine成一个总reducer
2.配置一些中间件middleware
3?.添加 Redux DevTools 增强器,并将增强器组合在一起
4.
挂载到总provider
然后挂载到整个文件的
示例如下:
引入configureStore生成的store仓库,随后挂载到总App.tsx文件的App组件里,写一个render函数,如下:
createSlice
createSlice是一个函数,接受一个对象作为参数,对象中传一个name字符串,传一个InitialState,以及reducers对象【该对象里是一个个小型的reducer】,记得reducer是传state和action的吧?这里reducers里的reducer也遵守这个规定,不过相比于redux里的reducer,toolkit里的reducer更强了~
官方:createSlice 为我们做了几件重要的事情:
- 可以将 case reducer 编写为对象内部的函数,而不必编写 switch/case 语句
- reducer 将能够编写更短的不可变更新逻辑
- 所有 action creators 将根据我们提供的 reducer 函数自动生成
话不多说,看用例
1.官网示例
reducers里的函数其实是自动返回了state
2.小程序节选一个reducer很多的reducers的slice
详细分析三个参数
1.name
没什么好说的,但是值得一提的是小程序统一用了大写加下划线,这是为什么捏
2.initialstate
设置了reducers里面的reducer的初始状态,需要注意,既然把reducer都集成在了同一个reducers里面,当然是有原因的,那就是所有的reducer,其实处理的都是同一批状态,
3.reducers对象
reducers里面包含了reducer,等效于传统redux写法的switch case链?(存疑)这里虽然形式上更像reducer(符合state+action=>new state的思想),但是起名上更偏向于action的定义(即用户的操作去影响state)】、
官方说法:
- reducers:一个对象,其中键是字符串,值是处理特定 actions 的 “case reducer” 函数
记得Reducers里的reducer要在该文件(小程序统一是store.ts)底部统一导出,然后导入到被注入了XXXSilce的组件里的方法里被执行this.store.dispatch(action),去切实的更改了store里的状态,进一步影响了ui的渲染。
小程序是用了一个es6的装饰器写的class module,module继承xxxxx父类,(父类里做了很多初始化工作,数据初始化函数auto(),模块初始化函数init(),然后在子类模块内部重写,实现功能)
挂在了slice,module里实现逻辑处理,再把某某自定义module导入ui的最外层组件,让ui层与数据层完全实现解耦合🤙🏻
看导出的示例
###关于reducer里的第二个参数,action详解
我观察到小程序的reducers里的reducer一般传的是两个参数,第一个是state,这没什么奇怪的,第二个action似乎也很符合常理,但是传action的时候,往往下面会用到payload???这有点神奇
于是我找来了文档,原文怎么说?
划重点,All generated actions should be defined using the PayloadAction
所有的生成的action应该用toolkit提供的
PayLoadAction
至于这个action的payload是哪来的????????
正常情况下,dispatch(action(…arg))接受一个参数,回到createSlice里的reducers里通过action.payload调用
Useselector
从redux库里挑选数据,前往具体组件页去处理数据
UseDispatch
为什么在toolkit里可以不用像之前那样,先展开state然后覆盖,而是可以直接改动了呢
事实上就是toolkit官方在createslice里封装了immer库,方便开发者使用去写immutable updates