redux

220 阅读5分钟

redux就是封装好的模块,插件,他来管理我们的数据。

redux是什么?

  • redux是一个专门用于做状态管理的js库(不是react插件库)。
  • 它可以用在react、angulat、vue、原生js等项目中,但基本与react配合使用。
  • 作用:它以集中式Store(仓库:就是你的值、数据放到这里面)(centralized stroe)的方式对整个应用中使用的状态进行集中管理,其规则确保状态只能以可预测的方式更新。
  • store相当于是一个全局对象,谁想用,谁就可以用。

什么情况下需要redux?

  • 某个组件的状态,需要让其他组件可以随时拿到,需要共享自己的状态(一般在大型应用中使用。)
  • 它主要由Action Creators、 Store、 Reducers。
  • store里面放的是当前项目里的多个组件中所有需要操作的数据,是利用共享的方式来传递数据的。
  • 它的原理是把这些数据进行提升,相当于提升全局的。
  • store是只读的,不能修改。但它只能通过Action Creators可以修改这个数据
  • action里由两个属性:type规定你这个属性叫什么名,data:里面放的是你的数据,它也不能直接修改store,敲门说我拿着action来了,store会派个人去该数据,就是派reducres(它是纯函数)去修改。所以真正执行修改操作的是reducers方法。
  • store会把它里面原来的数据以及action里面新的数据一起发给reducers。

store三大原则

1. 单一数据源

  • 整个应用的state被储存在一棵object tree中,并且这个object tree只存在于唯一一个store中。
  • 使开发变得非常容易。来自服务端的state可以在无需编写更多代码的情况下被序列化并注入到客户端中。由于是单一的state tree,调试也变得非常容易。在开发中,你可以把应用的state保存在本地。
  • 从而加快开发速度。此外,受益于单一的state tree,!
  • 以前难以实现的如撤销/重做”这类功能也变得轻而易举。

2. State是只读的

  • 唯一改变state的方法就是触发action,action是一个用于描述己发生事件的普通对象。
  • 这样确保了视图和网络请求都不能直接修改state,相反它们只能表达想要修改的意图。因为所有的修改都被集中化处理,且严格按照一个接一个的顺序执行,因此不用担心race condition的出现。
  • Action就是普通对象而已,因此它们可以被日志打印、序列化、储存、后期调试或测试时回放出来。

3. 使用纯函数来执行修改

  • 为了描述action如何改变state tree,你需要编写reducers

  • Reducer只是一些纯函数,它接收先前的state和action,变更返回新的state,刚开始你可以只有一个redcuer,随着应用变大,你可以把它拆分成多个小的redcuers,分别独立地操作state tree的不同部分,因为reducer只是函数,你可以控制它们被调用的顺序,传入附加数据,甚至编写哪些可复用的reducer来处理一些通用任务,如分页器。

  • Store,是用来维持应用所有state树的一个对象。改变state的唯一方法是store dispatch一个action。

  • Store不是类,而只是一个有几个方法的对象,可以采用createStorei进行创建。

  • createStore(reducer,[initState,enhancer])

  • 作用:创建一个Redux store来存放应用中所有的state,一个应用只能有个store。函数返回store对象

参数:

  • 第一个参数reducer:有两个参数:stateaction,必须有个返回值,返回的是初始状态,即是return state,不要直接对store进行修改,因为store是只读的。

  • 第二个参数InitState:初始state,如果不为空,需要和reducer中处理的state结构一致

  • 第三个参数enhancer:一个中间件,如logger等。如果里面进行异步处理,就写该中间件。

  • 通过createStore方法创建store,该方法是redux里的。把它放在一个单独的js模块当中创建,谁用谁引入。把reducer作为参数放到createStore里

用store对象里的getData方法读取,读取出来之后,可以直接读取进行遍历,或者把它放到该组件的状态里

store.getState()

返回应用当前的state树,他与store的最后一个reducer返回值相同。

store. dispatch(action)

用来分发action,这是改变state的唯一方法。

store.subscribe(function(){})

  • 监听store中值的变化。只要值变了,就会重新把store的值读出来,渲染出来。
  • 添加一个变化的监听器,每当dispatch action的时候就会执行,state树种的一部分可能已经变化,你可以在回调函数里第哦啊用getState()来拿到当前的state,函数返回一个解绑的函数。

action

  • action是一个具有type字段的普通js对象。你可以将action视为描述应用程序中发生了什么事件。
  • payload里放的是添加的数据
  • type是一个字符串,给这个action一个描述性的名字,,用于描述法神大哥具体事情。
  • action对象可以有其他字段,其中包含有关发生的事情的附加信息,按照管理,我们将该信息放在payload的字段中。

调用store.dispatvh(addTodo('睡觉'))

整个redux的程序执行:

先把组件状态的初始值,设置为store.getState()。该方法得到的返回值就是store里存储的数据。

  1. 当组件里发生某些事件(例如点击事件),就会触发事件函数,事件函数有个返回值,是个函数,返回值函数里面调用store.dispatch()方法,分发actionaction会跟store说他有修改数据的想法。
  2. store就接收action里的action.payload里存储的数据。
  3. 接着store会触发reducer函数,该函数有两个参数(原始的state数据,和action),在该函数里用switch语句做数据处理,并把相应的结果返回到store里。
  4. store里的数据一变化,就会被store.subscribe(function(){})监听到,可以在store.subscribe( ()=>{} )的回调函数里做修改组件状态操作,组件状态一发生改变,就会更新渲染。

App.js文件

1.png

2.png

sotre.js文件

3.png

action.js文件

4.png

reducer.js文件

5.png