当前位置: 首页 > news >正文

在Vue3中使用Vuex

1. 什么是 Vuex 以及为啥要用它

想象一下你正在开发一个大型的 Vue 3 应用,就好比你在建造一座超级大的商场。商场里有很多店铺,每个店铺都有自己的商品信息、库存数量等。在 Vue 应用里,不同的组件就像是这些店铺,它们可能都需要共享一些数据,比如用户的登录状态、购物车的商品列表。

如果没有一个统一的地方来管理这些数据,就会出现混乱。比如一个组件修改了用户的登录状态,但是其他组件并不知道,还以为用户没登录呢。Vuex 就像是商场的管理中心,它把这些需要共享的数据集中管理起来,这样各个组件都能从这里获取和修改数据,保证数据的一致性。

2. 安装 Vuex

首先,你得把 Vuex 这个“管理中心”安装到你的项目里。打开你的项目终端,输入下面的命令:

npm install vuex@4

这里的 @4 是因为 Vuex 4 版本是专门适配 Vue 3 的。安装完成后,Vuex 就被添加到你的项目依赖里了。

3. 创建 Vuex 的“管理中心”(store)

在你的项目 src 目录下,创建一个 store 文件夹,然后在这个文件夹里创建一个 index.js 文件,这个文件就是 Vuex 的核心配置文件,相当于商场管理中心的办公室。

// src/store/index.js
import { createStore } from 'vuex';

// 创建一个 store 实例
const store = createStore({
    // state 就像是管理中心的仓库,用来存放共享的数据
    state() {
        return {
            count: 0,  // 比如这里有一个计数器,初始值是 0
            user: {
                name: '',
                isLoggedIn: false
            }
        };
    },
    // mutations 就像是仓库的管理员,专门负责修改 state 里的数据
    mutations: {
        increment(state) {
            state.count++;  // 让计数器的值加 1
        },
        login(state, userData) {
            state.user.name = userData.name;
            state.user.isLoggedIn = true;
        }
    },
    // actions 就像是商场的调度员,它可以处理一些异步操作,然后再调用 mutations 来修改数据
    actions: {
        incrementAsync(context) {
            setTimeout(() => {
                context.commit('increment');  // 过 1 秒后调用 increment 这个 mutation
            }, 1000);
        },
        async loginAsync(context, userData) {
            // 模拟一个异步的登录请求
            const response = await fetch('/api/login', {
                method: 'POST',
                body: JSON.stringify(userData)
            });
            if (response.ok) {
                context.commit('login', userData);
            }
        }
    },
    // getters 就像是商场的查询台,组件可以通过它来获取 state 里的数据
    getters: {
        doubleCount(state) {
            return state.count * 2;  // 返回计数器值的两倍
        },
        isUserLoggedIn(state) {
            return state.user.isLoggedIn;  // 返回用户是否登录的状态
        }
    }
});

export default store;

4. 在主应用里启用 Vuex 的“管理中心”

打开项目的 main.js 文件,就像是给商场所有店铺通知管理中心的存在。

// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';  // 引入刚才创建的 store

const app = createApp(App);
app.use(store);  // 让应用使用这个 store
app.mount('#app');

5. 在组件里使用 Vuex 的数据和方法

现在,各个“店铺”(组件)就可以从管理中心获取数据和修改数据了。

<template>
    <div>
        <!-- 显示计数器的值 -->
        <p>计数器的值: {{ count }}</p>
        <!-- 显示计数器值的两倍 -->
        <p>计数器值的两倍: {{ doubleCount }}</p>
        <!-- 显示用户是否登录 -->
        <p>用户是否登录: {{ isUserLoggedIn }}</p>

        <!-- 点击按钮让计数器加 1 -->
        <button @click="increment">增加计数器</button>
        <!-- 点击按钮异步增加计数器 -->
        <button @click="incrementAsync">异步增加计数器</button>
        <!-- 点击按钮模拟用户登录 -->
        <button @click="login">用户登录</button>
    </div>
</template>

<script setup>
import { useStore } from 'vuex';

// 获取 store 实例
const store = useStore();

// 获取 state 里的计数器值
const count = store.state.count;
// 获取 getters 里的计数器值的两倍
const doubleCount = store.getters.doubleCount;
// 获取 getters 里的用户是否登录状态
const isUserLoggedIn = store.getters.isUserLoggedIn;

// 定义一个方法,调用 mutations 里的 increment 来增加计数器的值
const increment = () => {
    store.commit('increment');
};

// 定义一个方法,调用 actions 里的 incrementAsync 来异步增加计数器的值
const incrementAsync = () => {
    store.dispatch('incrementAsync');
};

// 定义一个方法,调用 actions 里的 loginAsync 来模拟用户登录
const login = () => {
    const userData = { name: '张三' };
    store.dispatch('loginAsync', userData);
};
</script>

通过以上步骤,你就可以在 Vue 3 项目里使用 Vuex 来管理共享数据了。组件可以方便地从 store 里获取数据,也可以通过 mutations 或 actions 来修改数据,保证了数据在整个应用里的一致性和可维护性。

相关文章:

  • 前端里的this指向问题
  • JavaScript 内置对象-数组对象
  • python的装饰器
  • 降序排序算法
  • POI 和 EasyExcel
  • Altium Designer 23原理图编译Net XXX has no driving source警告
  • 【iOS】包大小和性能稳定性优化
  • B. Make It Increasing
  • 【phpstudy】关于实现两个不同版本的mysql并存。
  • SpringBoot速成(12)文章分类P15-P19
  • JAVA集合
  • python 视频处理库moviepy 设置字幕
  • 【LeetCode Hot100 矩阵】矩阵置零、螺旋矩阵、旋转图像、搜索二维矩阵II
  • 开源协议深度解析:理解MIT、GPL、Apache等常见许可证
  • JavaScript 简介
  • 枚举类型Enum
  • DeepSeek-R1 + Cherry Studio 本地部署打造个人 AI 知识库
  • C语言01
  • Kimi k1.5:继Deepseek R1 后多模态 AI 的新标杆
  • 低成本、高效率且成熟的电商实时数据采集方案:梦想成真?
  • 五一假期,长三角铁路张家港、台州等多个车站客发量创新高
  • 今晚上海地铁多条线路加开定点加班车,2号线运营至次日2时
  • 厦大历史系教授林汀水辞世,曾参编《中国历史地图集》
  • 特朗普宣布对进口电影征收100%关税
  • 巴菲特执掌60年,伯克希尔市值如何增长5.5万倍?详解五大经典投资案例
  • 长三角铁路持续迎五一出行高峰:今日预计发送旅客418万人次