Vuex 入门与实战

news2024/9/20 16:04:10

image.png

引言

Vuex 是 Vue.js 官方推荐的状态管理库,它可以帮助我们更好地管理 Vue 应用的状态。在大型应用中,组件之间的状态共享和通信是一个非常重要的问题,而 Vuex 提供了一种优雅的解决方案。

在 Vue 应用中,数据的流动一般是单向的:从父组件传递到子组件。但是当我们需要在多个组件之共享和修改数据时,这种单向的数据流就显得不够灵活。此时,Vuex 可以提供一个集中式的状态管理方案,让我们更方便地管理和共享应用的状态,并且处理复杂的组件通信需求。

通过本篇文章的学习,你将全面了解 Vuex 的基础使用方法和注意事项,掌握高效的状态管理技巧。

一. 什么是 Vuex

image.png

单向数据流

Vuex 是一个专门为 Vue.js 应用程序开发的状态管理模式和库。它集中管理 Vue 组件的状态,并提供了一种可预测的方式来管理和变更状态,从而方便多个组件之共享数据。Vuex 遵循单向数据流的原则,使得状态的变化更加可控和追踪。它与 Vue.js 的配合使用可以管理全局的状态,包括数据、网络请求、用户登录状态等。

1. 核心概念

  1. State(状态):用于存储应用中共享的状态数据,类似于组中的本地 data。

  2. Mutations(突变):用于修改状态,只能执行同步操作,类似于组件中的方法。

  3. Actions(动作):用于执行异步操作和复杂的业务逻辑,并最终通过提交 mutations 来修改状态。

  4. Getters(获取):用于从状态中派生出一些数据,类似于组件中的计算属性。

2. 核心思想

Vuex 的核心思想是单一状态树,即:使用一个对象来存储应用的所有状态,这样整个应用的状态变化可以被追踪和维护。

Vuex 使不同组件之间可以更方便地共享和访问状态,降低了组件间的耦合性,特别是在大型复杂的应用中,可以帮助开发人员更好地管理和维护状态,提高开发效率。

3. 基本原则

Vuex 状态管理的原则主要包括以下几点:

  1. 单一数据源

遵循单一数据源的原则,即将所有的状态存储在一个单一的 state 对象中。这种集中的状态管理使得状态的变化更加可追踪和可预测,同时也方便了开发者对状态的统一管理和调试。

  1. 状态是响应式的

使用 Vue 的响应式系统来实现状态的变化监测和更新。当 state 中的数据发生变化时,所有依赖于该状态的组件都会自动更新。这样可以保证组件和状态之间的一致性,避免了手动去同步状态的问题。

  1. Mutations 是同步的

mutations 用于修改 state 中的数据,它们必须是同步的。这是因为 Vue 的响应式机制要求对状态的更新是同步的。如果需要进行异步操作,应该使用 actions 来处理。

  1. Actions 处理异步操作

Actions 用于处理异步操作和复杂业务逻辑。通过提交 mutations 来修改 state 中的数据。这样的设计可以将异步操作和状态更新的职责进行分离,使代码更加清晰和可维护。同时,actions 也可以用来触发其他 actions,实现复杂的异步操作的串联和组合。

  1. Getters 计算派生状态

Getters 用于从 state 中派生出一些状态,类似于 Vue 组件中的 computed 属性。它们可以对 state 进行逻辑计算和过滤,从而在组件中方便地获取需要的派生状态。通过 getters,我们可以避免在多个组件中重复计算相同的逻辑。

  1. 模块化管理

当应用的状态变得非常庞大和复杂时,可以使用 Vuex 的模块化管理来将状态进行划分和组织。每个模块都可以拥有自己的 state、mutations、actions 和 getters,从而实现更好的代码组织和维护。

在 Vue 项目中使用 Vuex 时,遵循这些原则,可以使状态管理变得更加易于理解、可维护和扩展。同时,也能够让我们更好地利用 Vuex 的特性和功能来进行状态管理。

二. 深入理解 Vuex 的核心概念

image.png

Vuex 提供了一种集中式的状态管理方案,使得组件之间的状态共享更加方便和可控。在 Vuex 中,有四个核心概念:statemutationsactionsgetters

场景:以数值累加的计算方式为场景,详细说明这几个重要概念

1. State(状态)

State 即应用的状态,可以理解为存储数据的容器。在 Vuex 中,我们通过定义一个 state 对象来存储应用的各种状态值。

定义一个名为 count 的状态来存储计数值:

state: {
  count: 0;
}

通过 this.$store.state.count 来访问和获取状态值。

2. Mutations(突变)

Mutations 用于修改 state 的值,它是唯一可以修改 state 的方法。每个 mutation 都有一个字符串的事件类型(type)和一个回调函数。回调函数中进行实际的状态修改操作。

定义一个名为 increment 的 mutation 来增加 count 的值:

mutations: {
  increment(state) {
    state.count++;
  }
}

通过 this.$store.commit('increment') 来提交(触发)一个 mutation,并修改 state 中的值。

3. Actions(动作)

Actions 用于处理异步逻辑,可以包含任意异步操作和业务逻辑。和 mutation 类似,每个 action 也有一个字符串的事件类型和一个回调函数。回调函数中可以执行异步操作,并通过提交(commit)mutation 来修改 state。

定义一个名为 incrementAsync 的 action 来异步函数增加 count 的值:

actions: {
  incrementAsync(context) {
    setTimeout(() => {
      context.commit('increment');
    }, 1000);
  }
}

通过 this.$store.dispatch('incrementAsync') 来分发(触发)一个 action,执行异步操作。

4. Getters(计算属性)

Getters 用于从 state 中派生出一些衍生状态,类似于 Vue 组件中的计算属性。它们可以对 state 进行逻辑计算和过滤,并返回派生的值。

定义一个名为 doubleCount 的 getter 来返回 count 的两倍值:

getters: {
  doubleCount(state) {
    return state.count * 2;
  }
}

通过 this.$store.getters.doubleCount 来访问和获取 getter 的值。

以上的这些核心概念共同组成了 Vuex 的状态管理机制,通过统一的方式管理和响应 state 的变化,使得应用的状态变得可预测和可维护。同时,Vuex 提供了丰富的工具和功能,可以帮助我们更好地进行状态管理。

三. Vuex 的使用场景

Vuex 的使用场景主要包括以下几种情况:

  1. 多个组件共享状态数据

当多个组件需要访问或修改同一个状态数据时,可以使用 Vuex 来集中管理这些状态数据,避免状态的分散和重复定义。例如,一个购物车应用中的多个组件可能都需要访问购物车的商品数量和总价,使用 Vuex 可以方便地共享这些状态数据。

  1. 多个组件共享数据的响应式更新

当一个组件修改了共享状态数据时,其他组件也需要能够感知到状态的变化并进行相应的处理。Vuex 通过响应式地管理和更新状态数据,可以确保多个组件之间状态的一致性,避免手动在组件之间进行数据传递和同步。

  1. 管理异步操作和业务逻辑

当需要进行异步操作(如网络请求)或复杂的业务逻辑处理时,可以使用 Vuex 的 Actions 来封装这些操作和逻辑,并最终通过提交 Mutations 来修改状态。使用 Vuex 可以让异步操作和业务逻辑与组件解耦,使得组件更关注于展示和用户交互。

四. Vuex 的使用步骤

场景:还是以数值累加的计算方式为场景,我们用 Vuex 来管理它们的状态,实现数值的显示和修改

1. 安装 Vuex

通过 npm 或 yarn 来安装 Vuex。打开命令行工具,进入你的项目根目录,然后执行以下命令:

npm install vuex

或者:

yarn add vuex

2. 创建 Vuex 的 store

在项目的根目录或 src 目录下创建一个新的文件夹,例如 store,然后在 store 文件夹中创建一个新的 JavaScript 文件,例如 index.js。这个文件将是 Vuex 的 store 的入口文件。

在 index.js 中,需要引入 Vue 和 Vuex,并创建一个新的 store 实例。示例代码如下:

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

const store = new Vuex.Store({
  // 在这里配置你的state、mutations、actions、getters等
});

export default store;

3. 配置state、mutations、actions 和 getters

在 store 的配置对象中,可以定义和配置你的state、mutations、actions 和 getters。

例如,可以定义一个名为 count 的状态,并定义一个名为 increment 的 mutation 方法来增加 count 的值。示例代码如下:

import Vuex from "vuex";

// 在这里配置你的state、mutations、actions、getters
const store = new Vuex.Store({
  // 配置 state
  state: {
    count: 0,
    doubleCount: 0
  },
  // 配置 mutations
  mutations: {
    increment: (state, device) => {
      state.count++
    },
    reduce: (state, device) => {
      state.count--
    }
  },
  // 配置 actions
  actions: {
    incrementAsync({ commit }) {
      commit('increment')
    },
    reduceAsync({ commit }) {
      commit('reduce')
    }
  },
  // 配置 getters
  getters: {
    count: state => state.count,
    doubleCount: state => state.count * 2
  }
});

4. 在 Vue 应用中使用 Vuex 的 store

现在,需要将 store 配置应用到 Vue 实例中。在 main.js 入口文件中,引入 store 并在 Vue 实例的配置中使用它。示例代码如下:

import Vue from "vue";
import App from "./App.vue";
import store from "./store/index";

new Vue({
  store,
  render: (h) => h(App),
}).$mount("#app");

5. 在组件中使用 Vuex

现在,可以在 Vue 组件中使用 Vuex 的 store 了。

在组件中可以通过this.$store.state.count来获取状态值, 通过this.$store.commit('increment')来提交一个 mutation 并修改状态值。

同时,可以通过mapStatemapMutationsmapActionsmapters等辅助函数来简化在组件中使用 vuex 的过程。示例代码如下:

<template>
  <div>
    <h3>基于 Vuex 的状态管理</h3>
    <button @click="increment">
      increment
    </button>
    <button @click="reduce">
      reduce
    </button>
    <button @click="incrementAsync">
      incrementAsync
    </button>
    <button @click="reduceAsync">
      reduceAsync
    </button>
    <h3>count:{{ count }}</h3>
    <h3>doubleCount:{{ doubleCount }}</h3>
  </div>
</template>

<script>
export default {
  computed: {
    count() {
      return this.$store.getters.count;
    },
    doubleCount() {
      return this.$store.getters.doubleCount;
    },
  },
  methods: {
    increment() {
      this.$store.commit('increment')
    },
    reduce() {
      this.$store.commit('reduce')
    },
    incrementAsync() {
      this.$store.dispatch('incrementAsync')
    },
    reduceAsync() {
      this.$store.dispatch('reduceAsync')
    }
  }
};
</script>

这样就从零到一实现了 Vuex 的安装、配置和使用。现在,你可以在 Vue 组件中使用 this.$store 来访问和操作 store 中的状态、调用 mutations 和 actions,以及获取 getters 中的派生状态了。

通过 Vuex,可以更好地组织和管理 Vue 应用的状态,实现状态的共享和通信。

record-vuex.gif

record-vuex.gif

注意:以上的 Vuex 代码完全可以优化,尤其是管理大型复杂系统时,例如可以使用以下几种方式:

1.Vuex 辅助函数:例如: mapState:简化状态映射、mapMutations:简化 mutations 映射、mapActions:简化 actions 映射、 mapGetters:简化 getters 映射

2.模块化管理和命名空间:模块化组织结构,当状态和操作较多时,通过使用namespace命名空间来组织状态和操作。

...等等还有其他的各种优化创建、使用的操作

五. Vuex 的优缺点总结

1. 使用 Vuex 的优点

  1. 集中管理状态:使状态的变化更可追踪、可控。通过单一状态树的方式,开发人员可以清晰地知道状态在哪里被修改,方便调试和排查问题。

  2. 共享状态数据:方便地实现多个组件之间的状态共享,避免了手动传递和同步数据的麻烦。组件通过访问 Vuex 中的状态数据,可以实时获取最新的数据,并根据需要进行相应的操作。

  3. 响应式更新:通过采用 Vue 的响应式机制,可以自动追踪状态的变化并触发组件的重新染。当状态发生变化时,相关的组件会自动更新,无需手动进行数据更新的操作。

  4. 简化异步操作:提供了 Actions 来管理异步操作,例如网络请求、定时任务等。开发人员可以在 Actions 中封装相关的异步逻辑,执行完成后再通过提交 Mutations 来改变状态。这样可以更好地组织和管理异步操作,使代码更具可读性和可维护性。

2. 使用 Vuex 的缺点

  1. 学习成本:相对简单的状态管理可能会增加一些学习成本,在刚开始学习使用时,需要了解 Vuex 的核心概念和使用方法,理解单向数据流等概念。

  2. 适用场景有限:适用于大型复杂的应用程序,在小型应用中使用 Vuex 可能会显得冗余。如果应用较简单,状态管理需求不高,使用 Vuex 会增加代码量和复杂度。

  3. 引入额外的依赖:需要将其集成到 Vue.js 应用中,这会增加额外的依赖。如果项目中没有其他需要集成的插件或库,可能会觉得引入 Vuex 有点过于繁琐。

总体来说,Vuex 在大型应用中能够极大地简化状态管理,提高开发效率和代码质量但在小型应用中或对状态管理需求不高的情况下,使用 Vuex 可能会显得过于繁琐,不利于代码的简洁性。因此,需要根据具体的项目需求和模来评估是否使用 Vuex。

六. 使用注意事项

在使用 Vuex 时,有一些注意事项需要我们注意:

  1. 单一状态树:建议将应用的状态保存在单一的状态树中。这意味着所有的状态都集中存放在一个地方,方便状态的管理和追踪。

  2. 异步操作:在 Actions 中封装异步逻辑时,需要确保异步操作完成后再通过提交 Mutations 来修改状态,否则会导致状态不一致的问题。

  3. 只能通过 Mutations 修改状态:状态的修改只能通过 Mutations 来进行,不能直接在组件中直接修改状态。这样可以确保状态的变更可追踪,方便排查问题。

  4. 避免在组件中直接访问和修改 Vuex 的状态:虽然 Vuex 允许通过组件的计算属性和方法来访问和修改状态,但是为了保持状态的单向数据流,最好将状态的获取和修改逻辑统一放到 Vuex 的 Getter 和 Mutations 中。

  5. 模块化管理:随着应用规模的增加,可以将 Vuex 的状态和逻辑按照模块进行划分,方便管理和维护。

  6. 注意命名冲突:当状态和操作较多时,要注意避免命名冲突。可以通过使用命名空间来组织状态和操作,或者在命名时添加模块前缀来避免冲突。

  7. 应用较小的场景:对于较小的应用或者状态管理需求较低的情况,可能不需要引入 Vuex。可以通过 Props 和 Events 等 Vue.js 的核心特性来进行组件间的状态传递和通信。

以上是在使用 Vuex 时需要注意的几点事项,遵循这些注意事项可以帮助我们更好地使用和管理应用的状态,提高开发效率并保持代码的可维护性。

结语

在本篇文章中,我们简单介绍了 Vuex 的基础知识、使用场景以及其优缺点。Vuex 作为 Vue.js 的官方状态管理库,可以帮助开发者更好地管理和共享应用的状态数据,提高开发效率和代码质量。

通过使用 Vuex,我们可以集中管理应用的状态,实现多个组件之间的状态共享,避免了手动传递和同步数据的麻烦。同时,通过采用 Vue 的响应式机制,Vuex 实现了状态的自动更新,使得状态变化和组件的重新染过程更加高效和简洁。

然而,使用 Vuex 也会有一些学习成本,并且在小型应用或状态管理需求不高的情况下引入 Vuex 可能会过于繁琐。因此,在项目开发前需要对项目需求和规模进行评估,选择是否使用 Vuex。

总之,通过合理使用 Vuex,我们可以更好地管理应用的状态,将代码逻辑与数据分离,提高开发效率和代码重用性。如果你正在进行 Vue.js 项目开发,我相信 Vuex 会是一个值得考虑的选择!

参考资料

  • Vuex 3.x 官方文档

  • Vue 2 官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2149364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCA贡献率

什么是 PCA&#xff1f; PCA&#xff08;Principal Component Analysis, 主成分分析&#xff09;是一种常用的数据降维技术。它通过找到一组新的互不相关的正交轴&#xff08;主成分&#xff09;&#xff0c;将高维数据映射到低维空间。这些新轴是按照数据的方差大小排列的&am…

让Tkinter更美观:教你同步Tkinter窗口与弹窗图标(Tkinter同步主窗口与Messagebox的图标)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 步骤1:主窗口图标📝 步骤2:messagebox 图标📝 示例代码📝 实现原理与代码解释⚓️ 相关链接 ⚓️📖 介绍 📖 你有没有注意到,在开发软件图形界面时,会需要弹出一些提示框,而这些提示框的图标总…

阿里国际发布最新版多模态大模型Ovis,拿下开源第一

看一眼菜品图就知道怎么做、能给植物看病、能把手写英文准确翻译成中文、还能精准分析财报数据……多模态能力再次升级&#xff01;阿里国际AI团队发布了一款多模态大模型Ovis&#xff0c;在图像理解任务上不断突破极限&#xff0c;多种具体的子类任务中均达到了SOTA&#xff0…

【Linux】-----进程第一弹

目录 概念 描述进程-PCB 查看进程 获取进程标识符 终止进程 fork创建进程 返回值说明 进程的状态 ①运行状态(R) ②浅度睡眠(S) ③深度睡眠(D) ④暂停状态(T) ⑤僵尸状态(Z)(重点) 是什么&#xff1f; 举例 危害 孤儿进程 ⑥死亡状态(X) 概念 课本上对于进程…

如何保护电脑文件夹?多种方法保护数据安全

在数字化时代&#xff0c;电脑中的文件夹往往存储着我们最私密、最重要的数据&#xff0c;如个人文档、照片、工作资料等。因此&#xff0c;保护这些文件夹免受未经授权的访问、盗窃或损坏变得尤为重要。本文将介绍多种方法来有效保护电脑文件夹及其数据安全。 文件夹保护3000 …

MySQL中的比较条件

符号!也能够表示不等于条件。 示例一&#xff1a;查询employees表中员工薪水大于等于3000的员工的姓名与薪水。 select l ast_name,salary from employees where salary > 3000; 示例二&#xff1a;查询employees表中员工薪水不等于5000的员工的姓名与薪水。 select las…

人工智能在肿瘤浸润淋巴细胞研究中的最新进展|文献速递·24-09-20

小罗碎碎念 文献速递&#xff5c;目录 一、胆道癌治疗应答的新型AI生物标志物&#xff1a;肿瘤浸润性淋巴细胞的空间分布 补充文献&#xff1a;22年发表于JCO的一篇类似文献 二、生物标志物在肝细胞癌管理中的作用&#xff1a;从发现到临床应用 三、肿瘤样本中免疫细胞浸润水…

C语言进阶【5】---数据在内存中的存储【2】(小数存储很难吗?)

本章概述 本章引要练习 浮点数的存储浮点数的取出小补充题目解析彩蛋时刻&#xff01;&#xff01;&#xff01; 本章引要 常见的浮点数&#xff1a;3.1415&#xff0c;1E10等。其中&#xff0c;1E10是科学计数法的形式&#xff0c;它也就等于1*10^10。小数数据类型&#xff1…

块匹配算法简介(上)

图像中的运动估计方法大致分为两类:光流法和块匹配算法(BMA,Block Matching Algorithm)。本文将介绍BMA的相关内容,包括基本原理、相似度计算准则与常见的几种搜索方法,如三步法、四步法、钻石搜索法等。 1. 背景 视频中相邻帧往往存在大量的相似内容,即只有局部的一些…

【CustomPainter】渐变圆环

说明 实现一个渐变圆环&#xff0c;起点位置为- π / 2。 效果 源码 GradientCircularPainter1 class GradientCircularPainter1 extends CustomPainter {final double progress;GradientCircularPainter1(this.progress);overridevoid paint(Canvas canvas, Size size) {c…

零基础到项目实战:Node.js版Selenium WebDriver教程

在当今数字化时代&#xff0c;Web应用程序的质量和性能至关重要。为了确保这些应用的可靠性&#xff0c;自动化测试成为一种不可或缺的工具。Selenium&#xff0c;作为自动化测试领域的瑰宝&#xff0c;为我们提供了无限可能。本教程将深入介绍Selenium&#xff0c;以及如何结合…

如何删除EXCELL文件中的空行?

1&#xff0c;选择某一列 2&#xff0c;点击《开始》《查找和选择》>《定位条件》&#xff0c;调出《定位条件》的选择框&#xff1b; 3&#xff0c;在定位条件选项框&#xff0c;选择《空值》&#xff1b; 4&#xff0c;找到变灰被选中的某一行&#xff0c;右击《删除》 5&…

配置管理之configmap

一 、云原生要素——配 置分离 ConfigMap&#xff1a;存储明文配置 Secret&#xff1a;存储密文、敏感配置、用户重要信息和密码 等。 配置更新直接同步容器&#xff0c;热加载&#xff0c;无需重启pod或者容 器;镜像和配置分离&#xff0c;可单独修改发布 二、ConfigMap 1.…

详细分析Pytorch中的register_buffer基本知识(附Demo)

目录 1. 基本知识2. Demo3. 与自动注册的差异3.1 torch.nn.Parameter3.2 自动注册子模块3.3 总结 1. 基本知识 register_buffer 是 PyTorch 中 torch.nn.Module 提供的一个方法&#xff0c;允许用户将某些张量注册为模块的一部分&#xff0c;但不会被视为可训练参数。这些张量…

2区“发稿大户”!SCISSCI双检,3天上线出版,在这里,不用担心创新性不足~

【SciencePub学术】眼瞅评职晋升最后期限就在眼前&#xff0c;小编今天就给大家带来了一本“百发百中”的救命神刊~ 01 期刊详情 【期刊简介】IF&#xff1a;2.0-3.0 JCR2区中科院4区 【出版社】MDPI出版社 【自引率】8.30% 【类别】医学 【INDEX】SCIE&SSCI在检 02…

es由一个集群迁移到另外一个集群es的数据迁移

迁移es的数据 改下index的索引 就可以了。 查询 用curl -u就可以查询了

[数据集][目标检测]不同颜色的安全帽检测数据集VOC+YOLO格式7574张5类别

重要说明&#xff1a;数据集里面有2/3是增强数据集&#xff0c;请仔细查看图片预览&#xff0c;确认符合要求在下载&#xff0c;分辨率均为640x640 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件…

微店商品列表API接口实战指南

微店商品列表数据接口是一种允许开发者在其应用程序中调用微店店铺所有商品数据的 API 接口。通过这个接口&#xff0c;开发者可以获取到微店店铺内所有商品的信息&#xff0c;包括但不限于商品的 ID、标题、价格、库存、销量、详情描述、图片等。以下是对微店商品列表数据接口…

如何确保Java程序分发后不被篡改?使用JNI对Java程序进行安全校验

前言 众所周知&#xff0c;Java/Kotlin编译后会编译成smali&#xff0c;使用Jadx这类的反编译工具或者Hook工具就能很轻松的把我们的软件安全校验给破解了。 为了防止这种情况发生&#xff0c;我们一般会将核心代码使用C编写&#xff0c;然后使用JNI技术&#xff0c;使用Java…

TCP报文格式

RFC9293协议规范&#xff0c;规定的TCP格式如图1&#xff0c; 对比RFC793规定的格式&#xff0c;控制位从6bit变成了8bit 图1&#xff0c;图片来源&#xff1a;datatracker.ietf.org 图2为&#xff0c;可对照的中文版TCP格式&#xff0c;中文版参照的是RFC793 图2 重点…