在多组件共享状态的时候,我们想保持数据的响应式,这时候我们就想到了我们的全局状态管理。这里是对我学习redux和vuex时候的一些记载。
redux
整体的一个流程是怎么样子的?
由api--createStore来创建一个store,传入参数reducers,reducers就是放置状态和状态处理的关键,对不同的action对状态进行不同的处理。而后将store作为要共享状态的组件的props参数传入,这样就可以在这些组件中共享操作这些状态了。但是为了框架的独立性(redux不是由react开发维护的),防止代码的耦合,通常在使用的时候,我们会引入react-redux,来进行解耦操作,通过connect方法将redux的代码和react组件的代码进行隔离,组件中则是有以props的形式操作redux,接下来以一个简单的基数例子来记录这整一个过程。
例子实现的基本功能
第一步
创建reducer---其实就是给redux的回调函数,其中接受两个参数,参数一是初始状态,二是action,鉴于标准其一般为{type:"xxx",data:"xxx"}的格式。
第二步
创建store--其实就是调用api来创建,毕竟这是最关键的东西,要是你能随随便便给写了,那也不用引用别人的库了。。。
这里就是通过createStore来创建,第一个参数就是刚才我们写的reducer,第二个参数是个可选参数,使用它的前提是我们对共享状态的操作有异步操作,这个时候要使得我们的store可以接受函数式(我们一般的都是对象形式哦{type:"xxx",data:"xxx"})的action就要传第二个参数,其还依赖另一个库,这里看图就很清楚了。这里如果有多个reducer需要我们处理我们就要用combineReducers(来源于redux,接受一个对象,属性当然就是各个reducer啦)进行合并再作为第一个参数传入createStore
第三步
把store传递给需要使用的组件,这里我们一般就是直接传递给根组件,这样我们所有的组件都可以用了。
注意这里如果我们没有使用react-redux我们其实还要手动的render数据才会更新,引入后react-redux自动帮我们处理了,是不是特别好,没引入的话要加下面这个
第四步
这就是要来写我们的组件了,这里官方的叫法分为两步,一是我们的自己的组件称之为UI组件,后就是react-redux的容器组件,最终实现的目的就是所有的UI组件和redux的沟通都要通过这称容器组件,那么就实现了分离。
到目前为止所有的操作就已经结束了。。。
这里的connect就是沟通容器组件和UI组件的关键,他是一个柯里化函数,在第一次调用的函数返回函数传入我们的UI组件,而第一次调用传入的参数一共有两个,第一个是共享的数据,第二个就是对共享数据的操作方法,这两个都会作为props传递给我们的组件,在这个过程中dispatch就会传递一个action给我们的reducer,如果是同步的像图中的addOne就会自动帮我们把其返回值dispatch。
vuex
整体流程是怎么个样子?
我们通过createStore来创建我们的核心store,其包含5个部分state--我们说的共享状态,getters----用来便捷获取我们的状态,actions----对state进行异步操作,mutations---对state进行同步操作,modules---当有多个状态需要共享的时候,我们用moducer来进行划分,抽离出来。
例子实现的基本功能
第一步
创建我们的数字共享数据和名字共享数据
这里要开启命名空间,提高封装度,防止不同模块出现相同的getter出现错误
第二步
创建我们的store
注意这里的strict模式是为了防止你以其他方式(除了mutation)修改我们的状态,开启后你非法修改就会报错,为啥只能mutation来修改呢?因为只有mutation的才能被开发工具检测到。
第三步
安装store
通过vue()安装这个store插件,这样我们就可以在vue实例身上使用它了。
第四步
在组件中使用
这里的mapXxx都是为了批量的获取状态和操作状态的方法,你也可以老老实实的用点语法点出来。到这里一个简单的vuex就实现了。