VUEX

118 阅读2分钟

一、vuex介绍

是一个专为vue.js应用程序开发的状态管理模式,采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化

 

是采用集中式管理组件依赖的共享数据工具,可以解决不同组件数据共享问题

image.png  

 

注:

1. 修改state状态必须通过mutations

2. mutations只能执行同步代码,类似ajax,定时器之类的代码不能再mutations中执行

3. 执行异步代码,要通过actions,然后将数据提交给mutations才可以完成

4. state的状态即共享数据可以在组件中引用

5. 组件中可以调用actions

 

1.1项目初始化

创建一个新的脚手架项目

vue create 项目名(项目名不能有中文,不要有大写字母)

 

安装vuex,并安装到运行时依赖(即项目上线后还要用)

npm i vuex --save

 

在项目的main.js中引入vuex

import Vuex from ‘ vuex ’

 

在vue中注册vuex

Vue.use(Vuex)

 

创建store实例对象

const store = new Vuex.Store({ ...配置项 })

 

在根实例配置中(main.js)的store选项指向创建的store实例对象

image.png

 

1.2  state

是放置所有公共状态的属性,如果有一个公共的状态数据,只需要定义在state对象中

 

定义state

image.png

 

1.2.1插值表达式

在vue组件中,可以使用this.$store获取到vuex中的store对象实例,可以通过state属性获取到里面的状态数据

  image.png

 

1.2.2计算属性

在vue组件中,可以将state属性定义到计算属性中

image.png

  image.png

 

1.2.3辅助函数 mapState

可以把store中的数据映射到组件的计算属性中

 

用法:

1. 导入mapState

Import { mapSate } from ‘ vuex ’

 

2. 采用数组的形式引入state属性

mapState([ ‘ count ’ ])

 

以上用法得到的类似于:

image.png

3. 利用延展运算符将导出的状态映射给计算属性

image.png

image.png  

1.3  mutations

state里的状态数据如果要修改,必须通过mutations,并且mutations必须是同步的操作,目的是形成数据快照

 

数据快照:一次mutation的执行,立即得到一种视图状态,因为是立即,所以必须是同步

 

定义mutations

image.png

 

mutations是一个对象,里面存放修改state的方法

image.png

 

在组件中调用mutations

如:

image.png

 

mutations里的方法中,第一个参数是state,第二个参数可以设置需要传的参数

image.png

 

辅助函数 mapMutations

和mapState类似,把位于mutations中的方法提取出来

image.png

作用类似于:

image.png

 

之后就可以直接使用里面的方法

image.png

 

注:Vuex中的mutations不能写异步,例如ajax请求

 

1.4  actions

负责进行异步操作

 

定义actions

image.png

 

1.4.1调用

在vue组件中,在方法里通过this.$store.dispatch(‘ actions里的方法名 ’)调用actions里的方法

image.png

 

传参调用

image.png

 

1.4.2辅助函数  mapActions

可以将action导入到组件中

image.png

image.png

 

1.5  getters

类似于vue的计算属性,从state中派生出的状态,依赖于state

 

例:

state:{

a :10,

b :20

}

 

getters:{

getSum:function( state ){

sum = state.a + state.b

return sum

}

}

\

image.png

image.png

 

1.5.1调用

image.png

1.5.2辅助函数mapGetters

image.png

image.png

 

1.6  module

使用单一状态树,所有的状态数据会集中到一个比较大的对象中,当项目变得越来越大的时候,Vuex会变得越来越难维护,所以有了Vuex的模块化

image.png

 

应用:

定义2个模块user和setting

user中管理用户的状态token

setting中管理应用的名称name

image.png

在vue组件中,可以分别显示这2个状态数据

image.png

注:分块后,获取子模块的状态数据,需要通过$store.state.模块名称.属性名来获取

 

 

也可以通过根级别的getters来调用

image.png

  image.png

 

1.6.1命名空间

namespaced

默认情况下,模块内部的action,mutation,和getter是注册在全局命名空间中的,这样使得多个模块能够对同一个mutation或action做出响应(即不能有同名的方法)

image.png

 

为了保证内部模块的高封闭性,使用namespaced来设置

image.png

1.6.2使用带有命名空间的模块

①直接调用,方法名称里带上模块的属性名路径

image.png

 

②辅助函数  带上模块名

image.png