当前位置: 首页 > 工具软件 > store.js > 使用案例 >

vuex中的this.$store.commit和dispatch()使用

徐安康
2023-12-01

一、为什么要用vuex?

在vue的项目里常常会遇到父子组件间需要进行数据传递的情况,我们可以用熟悉的props 或者 $emit 等方式进行父子组件通信,但是,在项目稍微大一点的情况中,面对众多的不相关的平行组件,并且很多数据需要多个组件循环使用,这个时候在这些组件间传递数据,使用上述方法会比较麻烦,项目代码变得冗长,并且不利于组件的复用,提高了耦合度。

为了解决这一问题,我们需要使用Vue 的状态管理工具 Vuex

Vuex好处:

  • 既使非父子组件间的数据共享也能变得简单明了
  • 让程序变得更加可维护(将数据抽离了出来)
  • 只要仓库里面的数据发生了变化,在其他组件里面数据被引用的地方也会自动更新

二、使用场景

平行组件之间传递数据,很多数据需要多个组件循环使用;如:用户的登录,注册;

有的时候我们只是需要动态的从一个组件中获取数据(官网称为“组件层级”:是个独立的控件,作用范围只在组件之内)然后想放到一个被官网称作“应用层级”(在项目的任意地方都可以随时获取和动态的修改,在修改之后,vue会为你的整个项目做更新)的地方。

三、环境配置与使用

1.安装vuex 

npm install vuex --save

2.新建文件夹store,在文件夹内新建index.js文件,用来组装模块并导出 store 的文件

index.js文件:

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

// 告诉 vue “使用” vuex
Vue.use(Vuex)

// 创建一个对象来保存应用启动时的初始状态

// 需要维护的状态

const store = new Vuex.Store({
    
  state: {
    // 放置初始状态 app启动的时候的全局的初始值
   login: false,//用户登录状态
  }
    
})

// 整合初始状态和变更函数,我们就得到了我们所需的 store
// 至此,这个 store 就可以连接到我们的应用中
export default store

 然后在main.js/main.ts 中注册store

import Vue from 'vue'
import App from './App'
import router from './router'
import store from './../store/index'

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  template: '<App/>',
  components: { App }
})

这一步完成后,我们可以再任意组件中使用store中的数据,使用方法也很简单,就是使用计算属性返回store中的数据到一个属性上,然后在你模板中就可以使用这个属性值了:

接下来在任意组件中使用

export default {
  ...
  data(){
	  value : "这又是修改后的value",
	},
  computed: {
    getTxt() {
      return this.$store.state.testTxt.tips;
    }
  },
   methods: {
    modifyTxt: function() {
      this.$store.commit('modifyTips', this.value)
    }
  }
  ...
}

然后在index.js文件里可以修改

	const store = new Vuex.Store({
		  state: {
		   	   // 初始化全局的一个变量
		   	   testTxt: {"tips":"这是一条vuex的数据","id":1}
		  },
		   mutations: {
			    modifyTips(state,msg) {
			      state.testTxt.tips= msg;
			    }
		  }
})
export default store

3. 上面是一个简单的示例,稍微扩展一下:

初始化store.js

一般放到src/store/store.js下面

import Vue from "vue";
import Vuex from "vuex";
 
Vue.use(Vuex)
 
const store = new Vuex.Store({
 state: {
    test:'x'
  },
  mutations: {
    changetest(state, xxx) {
      state.test= xxx
    }
  },
  actions:{
     changetest(context, xxx) {
      context.commit('changetest',xxx)
    }
  },
  getters: {
    test2: state => state.test
  }
})
export default store;

state:相当于Vue的data

mutations:类似于事件,每个 mutation 都有一个字符串的事件类型 (type)和 一个回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数

actions: Action 类似于 mutation,不同在于Action 提交的是 mutation,而不是直接变更状态,Action 可以包含任意异步操作

getters:可以认为是 store 的计算属性,就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,接受 state 作为其第一个参数

接下来可以用了。

使用Vuex

打开main.js,导入

import Vue from "vue";
import App from "./App.vue";
import store from "./store";
 
new Vue({
  store,
  render: h => h(App)
}).$mount("#app");

 现在可以在所有App所有子组件里面使用Vuex了

如何使用 state

子组件能通过 this.$store 访问到

this.$store.state.test
// x

 如何使用 mutations

子组件能通过 this.$store.commit 访问到

this.$store.commit('changetest',xxx)

 它会去把 changetest 提交到 mutation 执行 ,第二个是载荷(可以理解为参数),大多数载荷应该是一个对象,这样可以包含多个字段并且记录的 mutation 会更易读

如何使用 actions

子组件能通过 this.$store.dispatch 访问到

this.$store.dispatch('changetest'xxx)

它会去把 changetest 分发到 actions 在通过 actions 提交到 mutation 执行

如何使用 getters

子组件能通过 this.$store.getters 访问到

this.$store.getters.test2
//x

四、与dispatch比较

1. dispatch: 含有异步操作
例如向后台提交数据,this.$store.dispatch('action方法名',值)

存储:

this.$store.dispatch('initUserInfo',friend);

取值:

this.$store.getters.userInfo;

2. commit:同步操作
this.$store.commit('mutations方法名',值)

存储:

this.$store.commit('initUserInfo',friend);

取值:

this.$store.state.userInfo;

  参考:vuex中的this.$store.commit - 木昜 - 博客园​​​​​小白VUE学习笔记3:Vuex的this.$store.commit和在Vue项目中引用公共方法_Funfction_Zero的博客-CSDN博客

 vue store 存储 dispatch 和 commit的区别_前端打工人的博客-CSDN博客

 类似资料: