vuex的基本用法

98 阅读1分钟

一.搭建vuex的环境

1.安装vuex

npm i vuex@3.6.2  // 用的vue2,不支持vuex最新4.x.x版本

2.在src文件夹下创建如下目录

  • store:存放vuex相关文件的根目录
  • modules:vuex模块化相关文件
  • index.js:vuex的入口文件
  • type.js:储存代替Mutation事件类型的常量
  • user.js:自定义的vuex模块化文件

3.初始化index.js

在index.js中导入自定义模块user.js并导出

import Vue from 'vue'
import Vuex from 'vuex'
 
// 引入模块文件
import user from './modules/user'

Vue.use(Vuex)

// 导出模块 
export default new Vuex.Store({
  modules: {
   user
  }
})

4.初始化自定义模块user.js

/* 
	用户模块
 */

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

命名空间:namesapced:true,当模块被注册后,它的所有getter、action及mutation都会自动根据模块注册的路径调整命名,比如我要访问这个文件中的state里边的某个属性:this.$store.state.user。后边这个user就是user.js模块名,我们要加上命名空间,相当于独立的区块去使用,模块和模块之间互不干扰。

5.在main.js中导入并注册store

import store from './store'

new Vue({
	store,
	render: h => h(App),
}).$mount('#app')

6.测试

在user.js中的state中添加数据

const state = {
	name: 'songdijie'
}

在页面中读取一下

<h1>{{$store.state.user.name}}</h1>

在页面中显示出name的值,这样一个简单的vuex结构就初始化完成了

二.知识点

1.vuex是什么?

同一状态(全局状态)管理,简单的理解,在SPA单页面组件的开发中,在state中定义了一个数据之后,你可以在所在项目中的任何一个组件里进行获取、修改,并且你的修改可以同步全局。

2.state, getters, mutation, actions

  • state: 用于存储数据,相当于data
  • getters:相当于computed计算属性
  • mutation:用于修改state中的数据,相当于methods(不能进行异步操作)
  • actions:相当于异步methods(可以进行异步操作)

3.state数据:

方法1

this.$store.state.user.name

方法2

<h1>{{name}}</h1>

import {mapState} from  'vuex'

computed: {
    ...mapState({
	name: state => state.user.name
    })
}

4.mutation方法

方法1

this.$store.commit('user/add', 'w')

方法2

import {mapState, mapMutations} from 'vuex'

methods: {
    ...mapMutations({
        add: 'user/add'
    })
}

this.add('w') // 调用

5.actions

方法1

this.$store.dispatch('user/delayAdd', {str: 'w', time:1000})

方法2

import {mapState, mapMutations, mapActions} from 'vuex'

methods: {
    ...mapActions({
        delayAdd: 'user/delayAdd'
    })
}

this.delayAdd({str: 'w', time:1000}) // 调用

6.getters

方法1

this.$store.getters['user/myName']

方法2

<h1>{{myName}}</h1>

import {mapState, mapMutations, mapActions, mapGetters} from  'vuex'
computed: {
    ...mapGetters({
        myName: 'user/myName'
    })
}

7.type.js代码

/* 
    定义类型常量,默认全部大写 
*/
const ADD = 'ADD'

export default {
    ADD
}

8.user.js代码

/* 
    用户模块
*/

// 导入 types.js 文件
import type from '../type.js'

const state = {
    name: 'songdijie'
}
 
const getters = {
    myName (state) {
	return state.name + 'SM'
    }
}
 
const mutations = {
    [type.ADD] (state, str) {
        state.name += str
    }
}
 
const actions = {
    delayAdd ({commit, state}, data) {
        // 异步操作
	setTimeout(function() {
	    commit(type.ADD, data.str)
	}, data.time)
    }
	
}
 
export default {
    namespaced: true,
    state,
    getters,
    mutations,
    actions
}