Vuex的基本使用

119 阅读3分钟

Vuex的基本概念与使用

Vuex的基本概念

概念

Vuex是一个Vue全家桶中的一员,是频繁且大型的数据共享的解决方案

优点

1.存储一步到位,不需要层层传递

2.数据流向清晰

3.响应式数据存储

Vuex的基本使用

1.下包

yarn add vuex

2.导包

import Vuex from 'vuex'
import Vue from 'vue'

3.挂包

Vue.use(Vuex)

4.实例化

const store = new Vuex.Store()

5.暴露对象

export default store

6.导入挂载

main.js 

import store from 'Vuex模块路径'

new Vue({
    store
})

Vuex的成员

State

State 是 Vuex 中的核心,用于存储数据,本质是一个对象

基本使用

声明

store/index.js

export default new Vuex.Store({
    State:{
        存储属性名:属性值
    }
})

实例:

export default new Vuex.Store({
    State:{
        count:1
    }
})

调用

this.$store.state.属性名

实例:

this.$store.state.count //1

辅助函数

辅助函数能够更方便更快捷的帮助开发者访问到 Vuex 中存储的数据,是一种映射结构,能够把 Store 中的数据映射到对应的 Vue 成员中

1.按需导入辅助函数

import { mapState } from 'vuex'

2.定义使用辅助函数

App.vue

export default {
    computed:{
        ...mapState(['被映射的属性名'])
    }
}

3.使用映射属性

this.属性名

或者

{{属性名}}

mapState 辅助函数能够将 State 中的数据映射到计算属性中,可直接通过 this.属性名 或者 属性名 访问到

Mutations

在 Vue 中,禁止直接通过 this.$store.state.属性名 修改属性值,因为 Devtools 无法捕捉到修改操作,也就是修改操作无法溯源,所以需要通过使用 Vuex 的 Mutations 来修改 State 中的数据

基本使用

声明

store/index.js

export default new Vuex.Store({
    mutataions:{
        方法名(state) {
            state 操作表达式
        }
    }
})

实例:

export default new Vuex.Store({
    mutations:{
        addCount(state) {
            state.count++
        }
    }
})

注意:mutations 中的方法第一个参数永远都是 state ,因为这个形参实际上就是 $store.state 对象,开发者需要通过 这个对象来对 state 中的数据进行修改

调用

this.$store.commit('mutations方法名')

实例:

this.$store.commit('addCount')

载荷

载荷(payload)实际上就是 mutation 在调用过程中传递的参数,payload 只能存在一个,如果需要传入多个值,可以选择对象或者数组

传入载荷

this.$store.commit('mutation方法名',{ payload 参数 })

接收载荷

mutations:{
    mutations方法名(state,payload) {
        payload 就是传递过来的载荷
    }
}

辅助函数

mutations 的辅助函数 mapMutations 能够将方法映射到 methods 中,让开发者更快的调用到 mutations 中的方法

1.按需导入

import { mapMutations } from 'vuex'

2.定义使用辅助函数

App.vue

export default {
    methods:{
        ...mapMutations(['mutations方法名'])
    }
}

3.使用映射方法

this.mutations方法名({ payload参数 })

或者

<tamplate @click="mutations方法名"><tamplate>

mapMutations 方法调用传入参数为 mutations 方法的方法名,返回值是一个对象,直接使用 ... 展开运算符即可

Actions

由于 Mutations 中的方法对 State 中的数据进行修改必须是同步操作(异步 devTools 监听不到),所以需要使用 Actions 来异步的获取或者调用 Mutations 来修改数据

基本使用

声明

store/index.js

export default new Vuex.Store({
    actions:{
        actions方法名(context) {
            异步代码块
        }
    }
})

实例:

export default new Vuex.Store({
    actions:{
        asyncAdd(context) {
            setTime(()=>{
                context.commit('mutation方法名')
            },3000)
        }
    }
})

注意:context 是 actions 方法的形参,存储的就是 $store 这个对象,所以可以通过 context 调用 commit 函数来使用 mutations 方法修改 state

使用

this.$store.dispatch('action方法名')

实例:

this.$store.dispatch('asyncAdd')

载荷

同 mutations 中的载荷,actions 中的载荷也同样是传参的作用

传入载荷

this.$store.dispatch('actions方法名',{ payload 载荷 })

接收载荷

actions:{
    actions方法名(context,payload) {
        payload 就是载荷参数
    }
}

辅助函数

和 mutations 成员类似,mapActions 方法也同样可以映射到 methods 中

1.按需导入

import { mapActions } from 'vuex'

2.声明使用

App.vue

export default{
    methods:{
        ...mapActions(['actions 方法名'])
    }
}

3.调用

this.actions方法名({ payload 载荷 })

或者

<tamplate @click="actions方法名"><tamplate>

Getters

getters 类似 state ,但是如果说 state 是 Vue 中的 data ,那么 getters 就是 computed 计算属性

只不过 getters 没有 setter ,只有 getter ,也就是只读,无法对其修改

基本使用

声明

store/index.js

export default {
    getters:{
        计算属性名(state) {
            第一个形参永远是 state 对象
            return 固有值
        }
    }
}

实例:

export default {
    getters:{
        total(state) {
            return state.count *= 10
        }
    }
}

调用

this.$store.getters.属性名

辅助函数

mapGetters 辅助函数能够将 getters 属性映射成为 计算属性

1.按需导入

import { mapGetters } from 'vuex'

2.声明使用

export default {
    computed:{
        ...mapGetters(['getters属性名'])
    }
}

3.调用

this.getters 属性名

或者

{{ getters 属性名 }}

modules

modules 是 Vuex 中的模块化成员,能够通过 modules 成员将 Vuex 中的数据分割成为一个一个的数据模块。能够更好的管理数据,为大型项目必备操作

定义模块

store/模块名.js

export default {
    state:{},
    mutations:{},
    actions:{},
    getters:{}
}

定义模块直接向外暴露一个 Vuex 配置对象

注册模块

store/index.js

1.导入模块

import 模块对象 from '模块路径'

2.注册模块

export default new Vuex.Store({
    modules:{
        模块名 : 模块对象
    }
}) 

注意:模块名不可以和模块中的方法和属性同名,会提示警告,并且注册的模块默认为全局模块

全局模块如果调用重名的方法和属性,会依次触发对应的属性和方法

调用全局模块方法

this.$store.commit('模块方法')

命名空间

命名空间 namespaced 能够将每个数据模块相互独立,分割开来,使其不再收到模块间重名的方法和属性的影响

开启命名空间

export default {
    namespaced:true
    state:{},
    mutations:{},
    actions:{},
    getters:{}
}

只需在暴露对象的时候添加 namespaced:true 即可

命名空间的访问

state的访问
通过辅助函数访问

App.vue

按需导入辅助函数 mapState

import { mapState } from 'vuex'

使用辅助函数映射

export default {
    computed:{
        ...mapState('模块名称',['State数据'])
    }
}

调用

this.State属性名
mutations 的访问
直接访问

App.vue

this.$store.commit('模块名/mutations 方法名')

通过辅助函数访问

按需导入辅助函数

import { mapMutations } from 'vuex'

使用辅助函数映射

export default {
    methods:{
        ...mapMutations('模块名称',['mutations方法名'])
    }
}

调用

this.mutations方法名

或者 

@click="mutations方法名"
actions的访问
直接访问

App.vue

this.$store.dispatch('模块名/actions方法名')

通过辅助函数访问

按需导入辅助函数

import { mapActions } from 'vuex'

使用辅助函数映射

export default {
    methods:{
        ...mapActions('模块名',['actions方法名'])
    }
}

调用

this.actions方法名

或者

@click="actions方法名"
getter 访问
通过辅助函数访问

按需导入

import { mapGetters } from 'vuex'

使用辅助函数映射

export default {
    computed:{
        ...mapGetters('模块名',['计算属性名'])
    }
}

调用

this.getters 计算属性名

或者

{{getters计算属性名}}

如果不知道如果访问 命名空间 下的数据模块,就请直接使用辅助函数吧(笑)