一、Vuex-state定义公共数据并在组件中使用(核心管理模式)
state的作用
vuex用它来保存公共数据
在组件中,通过this.$store.state.属性名
来访问。
在模板中,则可以省略this
而直接写成: {
{$store.state.属性名}}
vue-devtool调试工具
state的作用是:保存公共数据(多组件中共用的数据)
state是响应式的: 如果修改了数据,相应的在视图上的值也会变化。
二、Vuex-用mutations修改公共数据
作用
通过调用mutations来修改定义在state中的公共数据。
每一项都是一个函数,可以声明两个形参:
- 第一个参数是必须的,表示当前的state。在使用时不需要传入
- 第二个参数是可选的,表示载荷,是可选的。在使用时要传入的数据
语法:
数据不应该在组件内部直接修改,必须在组件内调用mutations来修改。
mutations的中文含义是:变异。 它是Vuex中用来修改公共数据的唯一入口。
在定义时:它的第一个参数是state,第二个参数是载荷。
在调用时:用 this.$store.commit('mutation名', 载荷) 来调用。
1)Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数。
2)数据不可以该在组件内部直接修改。虽然语法上不报错,也有响应式的特点。但是不推荐。特别是在严格模式下会报错。若将vue创建 store 的时候传入 strict: true, 开启严格模式,那么任何修改state的操作,只要不经过 mutation的函数,vue就会报错。
3)常搭配组件created钩子函数中:
- 发ajax请求(用axios库),获取数据
- 调用mutations保存数据到vuex
- 在组件中使用数据
三、Vuex-用getters的派生状态
作用
在state中的数据的基础上,进一步对数据进行加工得到新数据。(与组件中computed一样)
语法格式:
vuex维护公共数据,主要有两个动作:
- 定义数据:
- 提供获取/修改数据的方法
四、Vuex-actions-发异步请求
- 组件内部发ajax
- ajax回来之后,去调用mutations来保存到vuex中
- actions返回的promise
这种方式有一个问题:代码不好重用
actions介绍
- actions是vuex的一个配置项
- 作用:发异步请求获取数据,调用mutations来保存数据,将整个ajax操作封装到Vuex的内部
- 要点:
- action 内部可以发异步请求操作
- action是间接修改state的:是通过调用 mutation来修改state
语法:
在组件中通过this.$store.dispatch('actions的名字', 参数)
来调用action
修改上面例子中的发请求图书的代码,将axios的部分写到action中
action一般用来发异步请求,数据回来之后,在去调用mutations来保存数据
将ajax请求放在actions中有两个好处:
- 代码得到了进一步封装。将发ajax和保存数据到vuex绑定在一起。
- 逻辑更通顺。如果数据需要保存在Vuex的state中,那从接口处获取数据的操作就定义在Vuex的actions中。
五、Vuex-用modules来拆分复杂业务
Vue使用单一状态树,那么也意味着很多状态都会交给Vuex来管理.当应用变得非常复杂时,store对象就有可能变得相当臃肿.为了解决这个问题, Vuex允许我们将store分割成模块(Module), 而每个模块拥有自己的state、mutation、action、getters等
目录拆分:
访问数据和修改数据的调整
- 访问模块中的mutations/actions:
- 如果namespaced为true,则需要额外去补充模块名
- 如果namespaced为false,则不需要额外补充模块名
vuex-用modules之后代码结构优化
modules模块化开发,减少store的臃肿