# Vuex

Vuex 用于管理各个组件之间的共享变量、事件等

# 安装

npm install vuex --save

# 目录结构

├─ store
│  ├─ actions.js
│  ├─ getters.js
│  └─ index.js
│  └─ mutations.js
├── modules
│  └─ moduleA.js

main.js

import mutations from "./mutations";
import getters from "./getters";
import actions from "./actions";
import moduleA from "./modules/moduleA";

const state = {
  counter: 0,
};

export default new Vuex.Store({
  state: state,
  mutations: mutations,
  getters: getters,
  actions: actions,
  modules: {
    a: moduleA,
  },
});

getters.js、actions.js、moduleA.js

export default {};

# 设置共享变量

\store\index.js

export default new Vuex.Store({
  state: {
    变量名:,
  },
});

# 使用共享变量

$store.state.变量名

# mutations 方法(修改共享变量)

\store\index.js

export default new Vuex.Store({
  mutations: {
    方法名(state) {
      state.变量名 = 0;
    },
    方法名(state, 参数名) {
      state.变量名 = 0;
    },
  },
});

使用 mutations 方法:

this.$store.commit("方法名");
this.$store.commit("方法名", 参数名);
//传递多个参数
const test = { id: 01, name: "a", age: 18 };
this.$store.commit("方法名", test);

提示

不推荐使用 $store.state.变量名 = XXX 修改变量,跳过了很多流程

# actions 方法(类似 mutations 方法)

export default new Vuex.Store({
  actions: {},
});

使用 actions 方法:

this.$store.dispatch("方法名");

提示

  • Action 提交的是 Mutation,不能够直接修改 state 中的状态,而 Mutations 是可以直接修改 state 中状态的
  • Action 是支持异步操作的,而 Mutations 只能是同步操作

# mapGetters 辅助函数

将 store 中的 actions 方法 映射到局部方法

import { mapActions } from "vuex";

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

使用:

this.actions方法名()
this.actions方法名(参数1,参数2)

# getter 方法(类似计算属性)

\store\index.js

export default new Vuex.Store({
  getters: {
      计算属性名(state){
          return state.变量名
      },
      计算属性名(state){
          return function(参数1[,参数2]){
              return state.变量名 + 参数1
        }
      },
  }
})

使用 getter 方法:

{
  {
    $store.getters.计算属性名;
  }
}
{
  {
    $store.getters.计算属性名(1);
  }
}

# mapGetters 辅助函数

将 store 中的 getter 映射到局部计算属性

import { mapGetters } from "vuex";

export default {
  computed: {
    ...mapGetters(["计算属性名", "计算属性名"]),
  },
};

使用:

this.计算属性名

# Vue-modueles

\store\index.js

//创建对象
const 模块对象名称 = {
  state: {},
  mutations: {},
  getters: {},
  actions: {},
};
//声明模块
export default new Vuex.Store({
  modules: {
    模块名称: 模块对象名称,
  },
});

使用 modules:

{
  {
    $store.state.模块名称.name;
  }
}

提示

mutations、getters 可以常规使用

# 事件总线

事件总线用来共享事件(如子组件向祖父组件发送事件)

main.js

Vue.prototype.$bus = new Vue();

# 发射事件

this.$bus.$emit("事件名称");

# 接收事件

this.$bus.$on("事件名称", 回调函数([参数]));
最后更新: 2022/9/12 16:01:28