# Vuex 3.x

前言

补充一些官方文档中没有的,但是实际开发中最好需要了解的内容

# 1.安装配置

  • 安装依赖
npm install vuex
1
  • store/index.js
import vuex from 'vuex'
const store = {
  //状态用来存储数据
  state: {
    data: 1,
  },
  //用来获取数据
  getters: {
    count(state) {
      state.data + 1
    },
  },
  //可以放置同步方法
  mutations: {
    setCount(state) {
      state.data + 2
    },
  },
  //可以放置异步方法
  actions: {
    change() {
      setTimeout(() => {
        this.state.data + 3
      }, 1000)
    },
  },
}
export default new vuex.Store(store)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  • main.js
import store from "./store/index"
new Vue({
  router,
  store,
  render: (h) => h(App),
}).$mount("#app")
1
2
3
4
5
6
  • 使用
<template>
  <div id="app">
    {{data}}
    <button @click="change">修改状态</button>
  </div>
</template>

<script>
import { mapState, mapGetters,mapMutations, mapActions } from "vuex";
export default {
  name: "app",
  methods: {
    ...mapMutations( ["setCount"]),
    ...mapActions( ["change"]),
    change() {
      this.setCount();
      this.change();
    }
  },
  computed: {
    ...mapState(["data"]),
    ...mapGetters(["count"]),
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 2.命名空间

  • modules:可以划分模块存储数据

  • commit 用于调用mutation,当前模块和其他模块;

  • dispatch 用于调用action,当前模块和其他模块;

  • getters 用于获取当前模块getter;

  • state 用于获取当前模块state;

  • rootState 用于获取其它模块state;

  • rootGetters 用于获取其他模块getter;

  • store/index.js

import vuex from 'vuex'
const store = {
...
}
//可以划分模块存储数据
store.modules={
  namespaced: true,
  user: {
    state: {
      b: 1,
    },
    getters: {
      count(state) {
        state.b + 1
      },
    },
    mutations: {
      change(state) {
        state.b + 2
      },
    },
    actions: {
      change() {
        setTimeout(() => {
          this.state.b + 3
        }, 1000)
      },
    },
  },
}
export default new vuex.Store(store)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

modules/user.js:user 组件模块文件,里面有独立的 state、getters、mutations、actions

export default {
  namespaced: true,
  state: {
    userName: "我",
  },
  getters: {
    getNewUserName(state) {
      return "是" + state.userName
    },
  },
  mutations: {
    chage_user(state, payload) {
      state.userName = payload
    },
  },
  actions: {
    change_user({ commit }, payload) {
      setTimeout(() => {
        commit("change_user", payload)
        //在action中可以多次触发mutation
      }, 1000)
      setTimeout(() => {
        commit("change_user", "hello")
        //在action中可以多次触发mutation
      }, 2000)
    },
  },
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 3.工程项目

  • vuex 实际使用时一般按下面的方式将各个功能进行拆解

index.js

import Vue from "vue"
import vuex from "vuex"
import actions from "./actions"
import mutations from "./mutations"
import state from "./state"
import getters from "./getters"
import user from "./modules/user"

Vue.use(vuex)

export default new vuex.Store({
  modules: {
    user,
  },
  // strict:process.env.NODE_ENV !=='production',
  actions,
  mutations,
  state,
  getters,
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

state.js

export default {
  lesson: "vuex学习",
}
1
2
3

mutations.js

export default {}
1

getters.js

export default {
  getNewName(state) {
    return "高级" + state.lesson
  },
}
1
2
3
4
5

actions.js

export default {}
1
  • 使用
<template>
  <div id="app">
    {{lesson}}
    {{className}}
    {{u}}
    {{getNewName}}
    {{getNewUserName}}
    <button @click="change">修改状态</button>
  </div>
</template>

<script>
import { mapState, mapGetters, mapActions } from "vuex";
export default {
  name: "app",
  methods: {
    ...mapActions("user", ["change_user"]),
    change() {
      this.$store.state.user.userName = "hello world";
      this["change_user"]("jw");
      this.$store.commit("user/change_user", "jw");
      this.$store.dispatch("user/change_user", "jw");
    }
  },
  computed: {
    ...mapState(["lesson", "className"]),
    ...mapState("user", { u: s => s.userName }),
    ...mapGetters(["getNewName"]),
    ...mapGetters("user", ["getNewUserName"])
  }
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 4.持久化插件

npm install vuex-persistedstate --save
1
  • 配置
import { createStore } from 'vuex'
// 引入vuex持久化方法createPersistedState
import createPersistedState from 'vuex-persistedstate'
import md from './modules/md

export default createStore({
  state: {},
  mutations: {},
  actions: {},
  getters: {},
  modules: {
    // 模块化数据
    md
  },
  plugins: [
    // veux持久化配置
    createPersistedstate({
      key: 'rabbitstore-client',
      paths: ['md']
    })
  ]
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 5.模板

import { getListApi } from "@/apis/list-api";
import { getDataApi } from "@/apis/data-api";
const ENUM = {
    LIST: "list",
    DATA_LIST: "dataList",
};
const HANDLE = {
    GET: "Get",
    SET: "Set",
    REQUEST: "Request",
};
const state = {
    [ENUM.LIST]: [],
    [ENUM.DATA_LIST]: { },
};

const getters = {
    [ENUM.LIST + HANDLE.GET]: (state) => () => {
        return state[ENUM.LIST];
    },
    [ENUM.DATA_LIST + HANDLE.GET]: (state) => () => {
        return state[ENUM.DATA_LIST];
    },
};

const actions = {
    [ENUM.LIST + HANDLE.REQUEST]: async ({ commit, rootState }) => {
        const res = await getListApi({ listId: rootState.listId });
        const {
            result: { code, msg },
            data,
        } = res;
        if (code === 0) {
            commit(ENUM.LIST + HANDLE.SET, data.list);
        } else {
            console.log(msg);
        }
    },
    [ENUM.DATA_LIST + HANDLE.REQUEST]: async ({ commit, state }) => {
        const res = await getDataApi();
        const {
            result: { code, msg },
            data,
        } = res;
        if (code === 0) {
            commit(ENUM.DATA_LIST + HANDLE.SET, data);
        } else {
            console.log(msg);
        }
    },
};

const mutations = {
    [ENUM.LIST + HANDLE.SET]: (state, payload) => {
        state[ENUM.LIST] = payload;
    },
    [ENUM.DATA_LIST + HANDLE.SET]: (state, payload) => {
        state[ENUM.DATA_LIST] = payload;
    },
};

export default {
    namespaced: true,
    state,
    getters,
    actions,
    mutations,
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68