说说你对Redux的理解?其工作原理?

àì夳堔傛蜴生んèń 2022-08-29 14:55 202阅读 0赞

eb17e861cdac1a1f2f0f52b68ce78626.png

一、是什么

React是用于构建用户界面的,帮助我们解决渲染DOM的过程

而在整个应用中会存在很多个组件,每个组件的state是由自身进行管理,包括组件定义自身的state、组件之间的通信通过props传递、使用Context实现数据共享

如果让每个组件都存储自身相关的状态,理论上来讲不会影响应用的运行,但在开发及后续维护阶段,我们将花费大量精力去查询状态的变化过程

这种情况下,如果将所有的状态进行集中管理,当需要更新状态的时候,仅需要对这个管理集中处理,而不用去关心状态是如何分发到每一个组件内部的

redux就是一个实现上述集中管理的容器,遵循三大基本原则:

  • 单一数据源
  • state 是只读的
  • 使用纯函数来执行修改

注意的是,redux并不是只应用在react中,还与其他界面库一起使用,如Vue

二、工作原理

redux要求我们把数据都放在 store公共存储空间

一个组件改变了 store 里的数据内容,其他组件就能感知到 store的变化,再来取数据,从而间接的实现了这些数据传递的功能

工作流程图如下所示:

682cddab5f613c0bc258581433c2a42b.png

根据流程图,可以想象,React Components 是借书的用户, Action Creactor 是借书时说的话(借什么书), Store 是图书馆管理员,Reducer 是记录本(借什么书,还什么书,在哪儿,需要查一下), state 是书籍信息

整个流程就是借书的用户需要先存在,然后需要借书,需要一句话来描述借什么书,图书馆管理员听到后需要查一下记录本,了解图书的位置,最后图书馆管理员会把这本书给到这个借书人

转换为代码是,React Components 需要获取一些数据, 然后它就告知 Store 需要获取数据,这就是就是 Action Creactor , Store 接收到之后去 Reducer 查一下, Reducer 会告诉 Store 应该给这个组件什么数据

三、如何使用

创建一个store的公共数据区域

  1. import { createStore } from 'redux' // 引入一个第三方的方法
  2. const store = createStore() // 创建数据的公共存储区域(管理员)

还需要创建一个记录本去辅助管理数据,也就是reduecer,本质就是一个函数,接收两个参数stateaction,返回state

  1. // 设置默认值
  2. const initialState = {
  3. counter: 0
  4. }
  5. const reducer = (state = initialState, action) => {
  6. }

然后就可以将记录本传递给store,两者建立连接。如下:

  1. const store = createStore(reducer)

如果想要获取store里面的数据,则通过store.getState()来获取当前state

  1. console.log(store.getState());

下面再看看如何更改store里面数据,是通过dispatch来派发action,通常action中都会有type属性,也可以携带其他的数据

  1. store.dispatch({
  2. type: "INCREMENT"
  3. })
  4. store.dispath({
  5. type: "DECREMENT"
  6. })
  7. store.dispatch({
  8. type: "ADD_NUMBER",
  9. number: 5
  10. })

下面再来看看修改reducer中的处理逻辑:

  1. const reducer = (state = initialState, action) => {
  2. switch (action.type) {
  3. case "INCREMENT":
  4. return {...state, counter: state.counter + 1};
  5. case "DECREMENT":
  6. return {...state, counter: state.counter - 1};
  7. case "ADD_NUMBER":
  8. return {...state, counter: state.counter + action.number}
  9. default:
  10. return state;
  11. }
  12. }

注意,reducer是一个纯函数,不需要直接修改state

这样派发action之后,既可以通过store.subscribe监听store的变化,如下:

  1. store.subscribe(() => {
  2. console.log(store.getState());
  3. })

React项目中,会搭配react-redux进行使用

完整代码如下:

  1. const redux = require('redux');
  2. const initialState = {
  3. counter: 0
  4. }
  5. // 创建reducer
  6. const reducer = (state = initialState, action) => {
  7. switch (action.type) {
  8. case "INCREMENT":
  9. return {...state, counter: state.counter + 1};
  10. case "DECREMENT":
  11. return {...state, counter: state.counter - 1};
  12. case "ADD_NUMBER":
  13. return {...state, counter: state.counter + action.number}
  14. default:
  15. return state;
  16. }
  17. }
  18. // 根据reducer创建store
  19. const store = redux.createStore(reducer);
  20. store.subscribe(() => {
  21. console.log(store.getState());
  22. })
  23. // 修改store中的state
  24. store.dispatch({
  25. type: "INCREMENT"
  26. })
  27. // console.log(store.getState());
  28. store.dispatch({
  29. type: "DECREMENT"
  30. })
  31. // console.log(store.getState());
  32. store.dispatch({
  33. type: "ADD_NUMBER",
  34. number: 5
  35. })
  36. // console.log(store.getState());

小结

  • createStore可以帮助创建 store
  • store.dispatch 帮助派发 action , action 会传递给 store
  • store.getState 这个方法可以帮助获取 store 里边所有的数据内容
  • store.subscrible 方法订阅 store 的改变,只要 store 发生改变, store.subscrible 这个函数接收的这个回调函数就会被执行

参考文献

  • https://cn.redux.js.org/docs/introduction/
  • https://www.redux.org.cn/docs/basics/Actions.html
  • https://lulujianglab.com/posts/大白话解析 Redux 、 redux-thunk 、redux-saga 和 react-redux

--The End—

系列正在更新:19/33

点击下方卡片解锁更多

a5407cb416c0daef007e0f659375c9ed.png

创作不易,星标、点赞、在看 三连支持

发表评论

表情:
评论列表 (有 0 条评论,202人围观)

还没有评论,来说两句吧...

相关阅读

    相关 说说语义化理解

    1、去掉或者丢失样式的时候能够让页面呈现出清晰的结构; 2、有利于SEO:和搜索引擎建立良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来确定上下文和各个关键

    相关 说说功能性需求理解

    是从某一类用户的视角看他使用这个软件的需求。比如,作为用户你用淘宝,找东西,拍货,付款,你有怎样的需求。作为卖家,你用淘宝怎么收款,发货,管理订单。这就是一个个的 `u...

    相关 说说设计原则理解

    为了便于记忆,我们可以使用一个口诀来记忆面向对象设计原则:**开口合里最单依** - 开:开闭原则 - 口:接口隔离原则 - 合:组合/聚合原则 - 里:里式替换原则 ...