【Vue】如何在 Vue 3 中使用组合式 API 与 Vuex 进行状态管理的详细教程

发布于:2025-02-11 ⋅ 阅读:(35) ⋅ 点赞:(0)

如何在 Vue 3 中使用组合式 API 与 Vuex 进行状态管理的详细教程。

安装 Vuex

首先,在你的 Vue 3 项目中安装 Vuex。可以使用 npm 或 yarn:

npm install vuex@next --save
# or
yarn add vuex@next

创建 Store

在 Vue 3 中,你可以使用 createStore 函数来创建 Vuex Store。通常我们会在项目的 src 目录下创建一个 store 文件夹,并在其中创建一个 index.js 文件:

// src/store/index.js

import { createStore } from 'vuex';

const store = createStore({
  state() {
    return {
      count: 0
    };
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  },
  actions: {
    increment({ commit }) {
      commit('increment');
    }
  },
  getters: {
    doubleCount(state) {
      return state.count * 2;
    }
  }
});

export default store;

在 Vue 应用中使用 Store

在你的 Vue 应用中,你需要将创建的 Store 实例传递给 Vue 应用。通常在 main.js 文件中进行:

// src/main.js

import { createApp } from 'vue';
import App from './App.vue';
import store from './store';

const app = createApp(App);

app.use(store);

app.mount('#app');

使用 State

你可以在组合式 API 中通过 useStore 函数来访问 Vuex Store:

<template>
  <div>
    <p>{{ count }}</p>
  </div>
</template>

<script>
import { computed } from 'vue';
import { useStore } from 'vuex';

export default {
  setup() {
    const store = useStore();

    const count = computed(() => store.state.count);

    return {
      count
    };
  }
};
</script>

使用 Getters

同样,你可以在组合式 API 中使用 useStore 函数来访问 Vuex Getters:

<template>
  <div>
    <p>{{ doubleCount }}</p>
  </div>
</template>

<script>
import { computed } from 'vue';
import { useStore } from 'vuex';

export default {
  setup() {
    const store = useStore();

    const doubleCount = computed(() => store.getters.doubleCount);

    return {
      doubleCount
    };
  }
};
</script>

提交 Mutations

你可以在组合式 API 中通过 useStore 函数来提交 Vuex Mutations:

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
import { computed } from 'vue';
import { useStore } from 'vuex';

export default {
  setup() {
    const store = useStore();

    const count = computed(() => store.state.count);

    const increment = () => {
      store.commit('increment');
    };

    return {
      count,
      increment
    };
  }
};
</script>

分发 Actions

你可以在组合式 API 中通过 useStore 函数来分发 Vuex Actions:

<template>
  <div>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
import { computed } from 'vue';
import { useStore } from 'vuex';

export default {
  setup() {
    const store = useStore();

    const count = computed(() => store.state.count);

    const increment = () => {
      store.dispatch('increment');
    };

    return {
      count,
      increment
    };
  }
};
</script>

模块化 Store

当应用变得非常复杂时,可以将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action 和 getter,甚至可以嵌套子模块:

// src/store/index.js

import { createStore } from 'vuex';

const moduleA = {
  state() {
    return {
      count: 0
    };
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  },
  actions: {
    increment({ commit }) {
      commit('increment');
    }
  },
  getters: {
    doubleCount(state) {
      return state.count * 2;
    }
  }
};

const store = createStore({
  modules: {
    a: moduleA
  }
});

export default store;

访问模块中的 State

在组合式 API 中,你可以通过模块名来访问模块中的 state 和其他属性:

<template>
  <div>
    <p>{{ count }}</p>
  </div>
</template>

<script>
import { computed } from 'vue';
import { useStore } from 'vuex';

export default {
  setup() {
    const store = useStore();

    const count = computed(() => store.state.a.count);

    return {
      count
    };
  }
};
</script>

网站公告

今日签到

点亮在社区的每一天
去签到