Vuex详解回顾,一文彻底搞懂Vuex

一:安装

2022年2月7日,vue3就成为了默认版本。并且vue3成为默认版本的同时,vuex也更新到了4版本。也就是,现在如果执行npm i vuex,安装的就是vuex4了。安装vuex就需要指定版本,输入:npm i vuex@3,即可。

npm install vuex@3 -S

二:配置

// 导入vuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
 
// 创建store对象
export default new Vuex.Store({
  // 全局的数据,相当于data
  state: { },
  getters: { },
  //里面定义方法,操作state的方法
  mutations: { },
  // 异步操作mutation
  actions: { },
  modules: { },
})

// 在main.js中挂载到vue实例对象
import store from './store/store.js'
new Vue ({
el: '#app' ,
render: h => h(app),
router,
//将创建的共享数据对象,挂载到Vue实例中,所有的组件,就可以直接从store中获取全局的数据了
store
}) 

三:核心概念

vuex中一共有五个状态 State  Getter  Mutation   Action   Module  下面进行详细讲解

3.1:State 

提供唯一的公共数据源,所有共享的数据统一放到store的state进行储存。

import Vue from 'vue'
import Vuex from 'vuex'
 
Vue.use(Vuex)
 
export default new Vuex.Store({
  // 全局数据,相当于data
  state: {
    count:0
  },
})

组件使用 state 中数据的方法一:

       就是用 this.$store.state.全局数据名称 获取你在 store 中的 state 里面定义的数据,然后在组件中用 {{ }} 插值表达式的形式展示出来。

<div> {{$store.state.count}} </div>

组件使用 state 中数据的方法二:

        在需要使用共享数据的组件里,先导入 mapState 函数,然后再计算属性里获取定义的数据,直接使用即可。

<h3>当前最新的count值是:{{ count }}</h3>

//1.从 vuex中按需导入 mapState 函数
import { mapState } from 'vuex'

// 2.将全局数据,映射为当前组件的计算属性
computed: {
    ...mapState(['count'])
}

3.2:Mutation

实现的第一种方式:

       先在 Store.js 文件中创建的实例对象里使用 mutations,在里面创建一个方法供组件使用,方法里面的第一个参数一定是 state ,只要外界调用了这个函数,就可以执行方法里面的代码。

import Vue from 'vue'
import Vuex from 'vuex'
 
Vue.use(Vuex)
 
export default new Vuex.Store({
  // 全局数据,相当于data
  state: {
    count:0
  },
  mutations: {
    add(state) { state.count++ }
  }
})

       回到对应的组件里面,通过 this.$store.commit 方法调用我们之前在 Store.js中的 mutations 中创建的方法名称。

<button @click="addCount">点我count值+1</button>

methods: {
  addCount() { this.$store.commit('add') },
},

组件在调用在Store.js中的 mutations 里创建的方法也可以传递参数。

const store = new Vuex.Store({
  state: {count: 1},
  mutations: {
    add(state,step) { state.count += step }  // step就是组件传的参数3
  }
})
// 在组件中调用的方法里添加参数
 methods: {
    addBtn() { this.$store.commit('add', 3) },
  },

实现的第二种方式:

       同第一种方法一样,先在 Store.js 文件中创建的实例对象里使用 mutations,在里面创建一个方法供组件使用,然后在需要使用共享方法的组件里,先导入 mapMutations 函数,然后在组件中已经定义好的方法里面直接引用就好.

import { mapState, mapMutations } from 'vuex' 

   methods: {
    ...mapMutations(['add']),
    addCount() { this.add() }
  },

3.3:Action ——进行异步操作

        在 action 中不能直接修改 state 中的数据,只能通过 context.commit() 去触发某个 mutation 中的方法才行,commit 的作用就是调用某个 mutations 里面的函数。

actions: {
    addAsync(context) {
      setTimeout(() => {
        context.commit('add')
      }, 1000);
    }
  }

实现的第一种方式:

在组件中触发 Action ,这里的 dispatch 函数专门用来触发 Action

addCount() {
   this.$store.dispatch('addAsync')
 },

实现的第二种方式:

methods: {
    ...mapActions(['addAsync'])
    handleQuery () {
       this.addAsync()
    }
}

3.4:Getter

import Vue from 'vue'
import Vuex from 'vuex'
 
Vue.use(Vuex)
 
export default new Vuex.Store({
  // 全局数据,相当于data
  state: {
    count:0
  },
  mutations: {
    add(state) { state.count++ }
  },
  getters: {
    getNewCount (state) {
        return state.count + 2
      })
    }
  }
})

在组件中使用:

import { mapGetters } from 'vuex'
// mapGetters的作用:把getters映射为计算属性
computed: {
    ...mapGetters(['getNewCount'])
}

总结:

  1. getters相当于对state中的数据进行加工处理后再提供给组件;
  2. getters不要修改state中的数据;
  3. getters类似之前的计算属性(基于state中的数据进行计算)。

3.5:Modules

import Vue from 'vue';
import Vuex	from 'vuex';
// 模块
import user	from './modules/user';
import chat	from './modules/chat';

Vue.use(Vuex);

const store = new Vuex.Store({
	modules: {
		chat, // 即时通讯
		user, // 用户中心
	}
});

export default store;

如果模块采用的命名空间

const moduleB = {
    namespaced: true,
    state: () => ({
        b: '我是moduleB'
    }),
    mutations: {},
    actions: {},
    getters: {}
}

export default moduleB

组件在使用的时候则需要添加模块名

methods: { 
  ...mapActions('模块名', ['xxx']), 
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值