Vuex是专门为vue应用程序开发的状态管理模式,将组件的共享状态抽取出来,以一个全局单例模式进行管理,组件树构成一个巨大的视图,不管组件在树的何种位置,任何组件都能获取到状态和触发行为。可以将其想象为一个“前端数据库”(数据仓库),让其在各个页面上实现数据的共享包括状态,并且可操作。(核心就是 解决组件间的通讯问题)
使用Vuex可以带来以下好处:
注意: 运行环境
1、node.js版本10输入下指令进行安装
npm install vuex -S
2、node.js版本18请执行下指令
npm i -S vuex@3.6.2
创建store目录及需要的文件:

1、src/store/index.js
- import Vue from 'vue'
- import Vuex from 'vuex'
- import state from './state'
- import getters from './getters'
- import actions from './actions'
- import mutations from './mutations'
- Vue.use(Vuex)
- const store = new Vuex.Store({
- state,
- getters,
- actions,
- mutations
- })
-
- export default store
2、src/main.js

通过在根实例中注册store选项,该store实例会注入到根组件下的所有子组件中,且子组件可以通过this.$store访问到。
src/views/vuex

src/router/index.js

-
- <el-submenu key="key_999" index="index_999">
- <template slot="title">
- <span slot="title">Vuex管理span>
- template>
- <el-menu-item key="key_99901" index="/vuex/page1">
- <span>page1span>
- el-menu-item>
- <el-menu-item key="key_99902" index="/vuex/page2">
- <span>page2span>
- el-menu-item>
- el-submenu>
- el-menu>
1、在state.js中定义全局参数
- export default {
- Name: '文昊'
- }
2、在mutations.js中改变值
- export default {
- /* 1.state指state.js文件导入的对象
- 2.payload指vue文件传递过来的界面
- */
- setName: (state, payload) => {
- state.Name = payload.Name
- }
- }
3、在getters.js中获取参数值
- export default {
- getName: (state) => {
- return state.Name;
- }
- }
这一些列操作相当于java分装实体类,把它一一才拆分,这样可以更好地组织代码,提高代码的可维护性和可扩展性。
1、page1.vue组件编写:
- <div>
- <h1>page1h1>
- <p>请输入您要修改的值p>
- <input type="text" v-model="msg">
- <button @click="changed">修改参数值button>
- <button @click="getData">获取参数值button>
-
-
- div>
- template>
-
- <script>
- export default {
-
- data () {
- return {
- msg: 'page1'
- }
-
- },
- methods:{
- changed(){
- this.$store.commit('setName',{Name:this.msg})
- },
- getData(){
- let name = this.$store.getters.getName;
- alert(name);
- }
-
-
-
-
- }
- }
- script>
-
- <style>
- style>
注意:
- setName是mutations.js导出的属性名
- getName是getters.js导出的属性名
2、page2.vue组件编写:
-
- <div>
- <h1>page2h1>
- {{change}}
- div>
-
-
- <script>
- export default {
-
- data () {
- return {
- msg: 'page2'
- }
- },
- computed:{
- change(){
- return this.$store.getters.getName;
- }
- }
- }
-
-
- script>
-
- <style>
- style>
效果展示

1、src/store/actions.js
- export default {
- setNameSync: (context, payload) => {
- //context指的是vuex的上下文
- setTimeout(function() {
- context.commit('setName', payload)
- }, 3500)
- }
- };
2、在page1.vue组件添加异步事件
-
- Asynchronization() {
- this.$store.dispatch('setNameSync', {
- name: this.msg
- })
- }

1、后端请求代码编写:
- package com.zking.ssm.controller;
-
- import com.zking.ssm.util.JsonResponseBody;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- import javax.servlet.http.HttpServletRequest;
- import java.text.SimpleDateFormat;
- import java.util.Date;
-
- @RestController
- @RequestMapping("/vuex")
- public class VuexController {
-
- @RequestMapping("/queryVuex")
- public JsonResponseBody> queryVuex(HttpServletRequest request) {
- String resturantName = request.getParameter("resturantName");
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String date = sdf.format(new Date());
- try {
- System.out.println("模拟异步情况,睡眠6秒,不能超过10秒,axios超时时间设置的是10秒!");
- Thread.sleep(6000);
- System.out.println("睡醒了,继续...");
- } catch (Exception e) {
- e.printStackTrace();
- }
- return new JsonResponseBody<>(resturantName + "-" + date,true,0,null);
- }
- }
2、src/api/action.js 封装请求的地址
'VUEX': '/vuex/queryVuex'
3、src/store/actions.js 异步发送ajax到后端
- setNameAjax: (context, payload) => {
- let _this = payload._this;
- let url = _this.axios.urls.VUEX;
- let params = {
- resturantName: payload.Name
- };
- _this.axios.post(url, params).then(r => {
- console.log(r)
- }).catch(r => {
- //异常代码
- console.log(r);
- });
- }
4、在paget1.vue组件添加Ajax异步事件
-
- Ajax() {
- this.$store.dispatch('setNameAjax', {
- Name: this.msg,
- _this: this
- })
- }
9.5秒异步处理演示:

Tips❕
Action类似于 mutation,不同在于:
1. Action提交的是mutation,而不是直接变更状态
2. Action可以包含任意异步操作
3. Action的回调函数接收一个 context 上下文参数,注意,这个参数可不一般,它与 store 实例有着相同的方法和属性
注1: VUEX 的 actions 中无法获取到 this 对象
如果要在actions 或者 mutations 中使用this对象,可以在调用的时候把this对象传过去。