Vue 中的 Vuex:全面解析与使用教程

news/2024/9/19 18:43:13/ 标签: vue.js, 前端, javascript

什么是 Vuex?

Vuex 是 Vue.js 官方提供的状态管理模式,专为 Vue.js 应用设计。它通过集中式存储管理应用中所有的组件状态,允许组件之间更方便地共享数据,并提供了一套规则来确保状态以可预测的方式发生变化。Vuex 对大型应用尤其有用,因为它将组件中的状态提取到外部,并通过全局状态管理器进行集中管理。

Vuex 提供了响应式的数据存储,与 Vue 组件深度集成,这意味着当状态发生变化时,所有依赖该状态的组件会自动更新。

为什么需要 Vuex?

在小型应用中,组件之间的状态可以通过父子组件通信或事件总线来管理。然而,当应用逐渐变大,组件间的状态变得复杂时,这种方法就显得笨拙且难以维护。这时,我们可以使用 Vuex 作为统一的状态管理工具,以确保整个应用状态的一致性和可预测性。

Vuex 的核心概念

Vuex 由以下几个核心部分组成:

  • State:状态,存储应用的全局数据。

  • Getters:计算属性,用于派生状态数据。

  • Mutations:同步操作,用于改变状态。

  • Actions:异步操作,用于处理业务逻辑,并通过提交 mutations 改变状态。

  • Modules:将状态和逻辑划分成多个模块,便于管理。

Vuex 的安装

首先,需要安装 vuex

npm install vuex --save
// src/store/index.js
import { createStore } from 'vuex';const store = createStore({state: {count: 0},mutations: {increment(state) {state.count++;}},actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment');}, 1000);}},getters: {doubleCount(state) {return state.count * 2;}}
});export default store;

main.js 中注册 Vuex

import { createApp } from 'vue';
import App from './App.vue';
import store from './store';const app = createApp(App);app.use(store);
app.mount('#app');

使用 Vuex 管理状态

1. State - 存储全局状态

State 是存储全局状态数据的地方,类似于组件中的 data。在组件中,我们可以通过 this.$store.state 来访问 Vuex 中的状态。

const store = createStore({state: {count: 0}
});

在组件中使用 state

<template><div><p>当前计数:{{ count }}</p></div>
</template><script>
export default {computed: {count() {return this.$store.state.count;}}
};
</script>

2. Mutations - 修改状态

Mutations 是用于修改 state 的方法,通常是同步的。我们通过 commit 函数来调用 mutations

const store = createStore({state: {count: 0},mutations: {increment(state) {state.count++;}}
});

在组件中调用 mutations 来修改状态:

<template><div><p>当前计数:{{ count }}</p><button @click="increment">增加计数</button></div>
</template><script>
export default {computed: {count() {return this.$store.state.count;}},methods: {increment() {this.$store.commit('increment');}}
};
</script>

3. Getters - 计算属性

Getters 类似于组件中的 computed,用于从 state 中派生数据。

const store = createStore({state: {count: 0},getters: {doubleCount(state) {return state.count * 2;}}
});

在组件中使用 getters

<template><div><p>计数的两倍:{{ doubleCount }}</p></div>
</template><script>
export default {computed: {doubleCount() {return this.$store.getters.doubleCount;}}
};
</script>

4. Actions - 异步操作

Actions 是用于处理异步操作的,通常用来提交 mutations。在组件中调用 actions 时,我们使用 dispatch 函数。

const store = createStore({state: {count: 0},mutations: {increment(state) {state.count++;}},actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment');}, 1000);}}
});

在组件中调用 actions

<template><div><p>当前计数:{{ count }}</p><button @click="incrementAsync">异步增加计数</button></div>
</template><script>
export default {computed: {count() {return this.$store.state.count;}},methods: {incrementAsync() {this.$store.dispatch('incrementAsync');}}
};
</script>

5. Modules - 模块化管理状态

当应用变得复杂时,可以将 store 划分为多个 module。每个模块有自己的 statemutationsactionsgetters,并且模块可以嵌套。

const moduleA = {state: () => ({ count: 0 }),mutations: {increment(state) {state.count++;}},getters: {doubleCount(state) {return state.count * 2;}}
};const store = createStore({modules: {a: moduleA}
});

在组件中访问模块的 stategetters

<template><div><p>模块A的计数:{{ count }}</p><p>计数的两倍:{{ doubleCount }}</p><button @click="increment">增加计数</button></div>
</template><script>
export default {computed: {count() {return this.$store.state.a.count;},doubleCount() {return this.$store.getters['a/doubleCount'];}},methods: {increment() {this.$store.commit('a/increment');}}
};
</script>

Vuex 开发者工具

Vuex 与 Vue Devtools 紧密集成,可以实时查看状态的变化、mutationsactions 的触发过程。这使得调试 Vuex 应用变得非常方便。

总结

Vuex 提供了一个强大的状态管理模式,尤其适合大型应用的开发。通过 state 来集中存储数据,通过 mutationsactions 来改变状态,通过 getters 来派生状态数据,并通过模块化管理使得应用的逻辑清晰易维护。在现代 Vue 应用中,Vuex 是一种非常有用的工具,能够帮助开发者轻松地管理复杂的状态。


http://www.ppmy.cn/news/1524178.html

相关文章

Inspector里面可以编辑的变量相关

1.私有和保护变量无法在Inspector中编辑 2.给私有和保护变量加个特性[SerializeField]&#xff08;强制序列化字段特性&#xff09;就可以在inspector中看到和修改了 序列化就是把一个对象保存到一个文件或数据库字段中去 3.公共的也不让其显示编辑 给变量前加特性[HideInIn…

【Leetcode学习笔记】路径总和

【题目描述】给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 输入&#x…

Linux 信息安全:构建坚固的防御体系

摘要&#xff1a; 本文围绕 Linux 信息安全展开。阐述了 Linux 在信息技术中的重要地位&#xff0c;强调信息安全的重要性以及 Linux 信息安全面临复杂网络环境、演变攻击手段与内部威胁等挑战。详细介绍了 Linux 系统的安全架构与机制&#xff0c;包括用户与权限管理、文件系统…

HarmonyOS开发实战( Beta5.0)自定义组件冻结功能规范

自定义组件处于非激活状态时&#xff0c;状态变量将不响应更新&#xff0c;即Watch不会调用&#xff0c;状态变量关联的节点不会刷新。通过freezeWhenInactive属性来决定是否使用冻结功能&#xff0c;不传参数时默认不使用。支持的场景有&#xff1a;页面路由&#xff0c;TabCo…

vue3安装sass时报错:Embedded Dart Sass couldn‘t find the embedded compiler executable

vue3安装sass&#xff1a; npm install sass --save-dev 引用 <template><div class"c1"><h1>hello</h1></div> </template> <style lang"scss">.c1{background-color:red;h1{color:yellow;}} </style>报…

Nestjs微服务简单案例

相信大家&#xff0c;来看这篇博客&#xff0c;就应该知道微服务的概念。只是不太知道实用方法而已。下面我通过最简单的案例&#xff0c;来教会大家。 首先这是我的项目目录&#xff1a; nestwfw/ ├── app/ ├── project-microsericesapp 是web服务&#xff0c;用来接收…

HAL库学习目录查询表

日期内容2024.09.11基于STM32C8T6的CubeMX&#xff1a;HAL库点亮LED2024.09.11STMCuBeMX新建项目的两种匪夷所思的问题2024.09.11STMCubeMX文件下载后会出现其他项目无法下载的问题

如何在Vue实例上挂载自己定义的工具类

在实际的Vue开发中&#xff0c;我们经常需要在多个组件之间共享一些工具函数或类&#xff0c;比如格式化日期、处理字符串、操作数组等。这些工具类可以封装到一个独立的模块中&#xff0c;然后挂载到Vue实例上&#xff0c;方便在任何地方使用。本文将详细介绍如何在Vue实例上挂…

如何利用免费工具轻松设计出专业Logo?

Logo 作为品牌的象征和视觉核心&#xff0c;承载了品牌的价值和理念。无论是创业公司还是个人品牌&#xff0c;拥有一个独特的 Logo 都显得尤为重要。然而&#xff0c;设计一个专业的 Logo 通常需要高昂的设计费用&#xff0c;许多人因此望而却步。幸运的是&#xff0c;随着互联…

【平渊科技】项目拆解:小说推文项目 | 经验分享

目录 项目介绍 直接上操作教程 第一步&#xff1a;选文 第二步&#xff1a;改文 第三步&#xff1a;配音 第四步&#xff1a;剪辑 项目介绍 小说推文项目&#xff0c;可以说是市场上最常见的项目了。 我是去年十月份开始接触的&#xff0c;接触的比较晚了&#xff0c;我…

【H2O2|全栈】更多关于HTML(1)HTML进阶(一)

目录 HTML进阶知识 前言 准备工作 标签的扩展&#xff08;一&#xff09; 本文中的标签在什么位置使用&#xff1f; title标签 meta标签 name viewport referrer http-equiv charset content link标签 实际案例 可视部分 代码分析 其他标签 base标签 styl…

【Hot100算法刷题集】哈希-03-最长连续序列(含排序、哈希、并查集法未正确使用哈希表导致算法效率降低的分析)

&#x1f3e0;关于专栏&#xff1a;专栏用于记录LeetCode中Hot100专题的所有题目 &#x1f3af;每日努力一点点&#xff0c;技术变化看得见 题目转载 题目描述 &#x1f512;link->题目跳转链接 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#x…

hiricacp 连接池校验机制

一、背景 项目发生告警&#xff0c;但是并没有影响业务&#xff0c;看了下日志&#xff0c;红框里面有循环调用了3次 &#xff0c;一直以为是外部的重试在重试&#xff0c;但是外部确没有重试记录&#xff0c;就深扒了代码 二、想法 我知道hikaricp获取连接之后会校验连接的有…

一文读懂在线学习凸优化技术

一文读懂在线学习凸优化技术 在当今的数据驱动时代&#xff0c;机器学习算法已成为解决复杂问题的关键工具。在线学习凸优化作为机器学习中的一项核心技术&#xff0c;不仅在理论研究上具有重要意义&#xff0c;还在实际应用中展现出巨大的潜力。本文将深入浅出地介绍在线学习…

【CanMV K230 AI视觉】 人体检测

【CanMV K230 AI视觉】 人体检测 人体检测 动态测试效果可以去下面网站自己看。 B站视频链接&#xff1a;已做成合集 抖音链接&#xff1a;已做成合集 人体检测 人体检测是判断摄像头画面中有无出现人体&#xff0c;常用于人体数量检测&#xff0c;人流量监控以及安防监控等。…

Windows下使用MinGW编译安装zmq的步骤

背景&#xff1a; 在开发过程中&#xff0c;需要使用zmq库进行数据交互&#xff0c;因此需要编译zmq库。 安装步骤 软件下载 https://github.com/zeromq/libzmq.git 下载&#xff0c;将代码切换到git checkout 4c6cff6391分支 软件编译 cd .\libzmq\ mkdir build cd .\bu…

数学基础 -- 线性代数之矩阵的迹

矩阵的迹 什么是矩阵的迹&#xff1f; 矩阵的迹&#xff08;Trace of a Matrix&#xff09;是线性代数中的一个基本概念&#xff0c;定义为一个方阵主对角线上元素的总和。矩阵的迹在许多数学和物理应用中都起着重要作用&#xff0c;例如在矩阵分析、量子力学、统计学和系统理…

通过卷积神经网络(CNN)识别和预测手写数字

一&#xff1a;卷积神经网络&#xff08;CNN&#xff09;和手写数字识别MNIST数据集的介绍 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;是一种深度学习模型&#xff0c;它在图像和视频识别、分类和分割任务中表现出色。CNN通过模仿…

2024.9.10 作业

做一个闹钟 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent> #include <QTimer> #include <QTime> #include <QTimerEvent> #include<QTextToSpeech> //文本转语音类QT_BEGIN_NAMESPACE name…

Kotlin 代替Java接口回调,就这么简单

假如你使用旧的接口回调&#xff1a; 通常三步&#xff1a;1 定义接口和方法&#xff1b;2 使用接口中方法&#xff1b;3 继承接口并实现方法&#xff1b; 例&#xff1a; class XXXAdapter{public var mClickCollBack: clickCollBack? null //1定义interface clickColl…