vue保姆级教程----深入了解Vuex的工作原理

news2024/11/19 15:20:19

📢 鸿蒙专栏:想学鸿蒙的,冲

📢 C语言专栏:想学C语言的,冲

📢 VUE专栏:想学VUE的,冲这里

📢 CSS专栏:想学CSS的,冲这里

📢 Krpano专栏:想学VUE的,冲这里

🔔 上述专栏,都在不定期持续更新中!!!!!!!!!!!!!

目录

✨ 前言

Vuex的几个核心概念

Vuex工作原理

✨ 结语


✨ 前言

        Vuex是一个专门为Vue.js设计的状态管理模式。它采用集中式存储管理应用程序的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

        下面我们来对它的核心概念与工作原理进行详细分解:

Vuex的几个核心概念

  • State:储存应用状态的数据源,是一个树形结构,只有通过mutation函数才能改变其状态。
  • Getters: 对State的计算属性,类似Vue中的computed。
  • Mutations: 改变State的唯一途径, mutation必须是同步函数。
  • Actions: 用于提交Mutation来改变State,可以包含异步操作。
  • Modules: 将State、Getters、Mutations和Actions分割到不同的module中以保持项目的结构化。

State

        State是Vuex中的状态中心,存储着所有组件状态的数据。它是一个树形结构,只能通过mutation改变状态。

        State提供了一个应用的“单一数据源”,所有共享状态都定义在这里, components只需要引入使用不需要担心状态不同步的问题。

// store.js

export default new Vuex.Store({
  state: {
    count: 0
  }  
})

// Component.vue

import { mapState } from 'vuex'

export default {
  computed: mapState({
    count: state => state.count
  })
}

Getters

        Getters相当于store的计算属性,对State进行加工处理形成易于使用的新数据。

        Getters接收state作为第一个参数,供其内部消费和处理,通过返回值暴露给外部。可以用来简化数据处理和实现缓存。

// store.js

export default new Vuex.Store({
  getters: {
    doubleCount: state => state.count * 2 
  }
})

// Component.vue

import { mapGetters } from 'vuex'

export default {
  computed: mapGetters([
    'doubleCount' 
  ])
}

Mutations

        Mutations是改变State的唯一途径。

        它接受state作为第一个参数,payload作为第二个参数。可以包含多个mutation函数,通过type区分不同的mutation。

        必须是同步函数,通过提交mutation而非直接改变state来保证状态改变可追踪和调试。

// store.js

export default new Vuex.Store({
  mutations: {
    increment (state) {
      state.count++
    }
  }  
})

// Component.vue 

methods: {
  increment() {
    this.$store.commit('increment') 
  }
}

 Actions

        Actions用于处理业务逻辑,支持异步操作。

        通过context.commit提交mutation来触发状态改变,而非直接改变state。

        可以包含异步操作如 AJAX请求,可以用async/await简化异步流程。

// store.js

export default new Vuex.Store({
  actions: {
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment')
      }, 1000) 
    }
  }
})

// Component.vue

methods: {
  incrementAsync() {
    this.$store.dispatch('incrementAsync')
  }
}

Modules

        Modules用于将状态、getters、actions、mutations分割到不同模块中。

        每个模块都有自己的state、getters、actions、mutations,不同模块的状态独立维护。

        有助于项目结构化,减少命名冲突。

// store.js

const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

        这样Vuex的每个部分如何协同工作会更加明确,希望对你进一步理解Vuex有帮助!可以根据这个框架来深入去实践和应用Vuex。

Vuex工作原理

  1. Vue组件通过dispatch方法触发Actions。
    // Component.vue
    methods: {
      increment() {
        this.$store.dispatch('increment') 
      }
    }
  2. Actions 通过commit方法提交Mutations。
    // store.js
    actions: {
      increment({ commit }) {
        commit('INCREMENT')
      }
    }
  3. Mutations改变State中的数据。
    mutations: {
      INCREMENT(state) {
        state.count++
      }  
    }
  4. State数据的变化将触发所有依赖于它的组件的重新渲染。
    // Component.vue
    computed: {
      count() {
        return this.$store.state.count
      }
    }
  5. 可选步骤:组件可以通过getters从Store中获取特定的数据。
    // Component.vue 
    import { mapGetters } from 'vuex'
    
    computed: {
      ...mapGetters(['doubleCount'])
    }

为何要分离 Mutation 和 Action

  • Action 可以包含异步操作,Mutation 只能是同步。
  • 将状态改变隔离到 Mutation 中,便于追踪和调试。
  • 分离业务逻辑 (Action)与状态变更 (Mutation) 使代码结构更清晰。

为何 Mutation 必须是同步

  • 直接在 Action 中改状态,不能明确追踪状态变化。
  • 很难追踪多个组件共享的状态变更。
  • 调试工具无法捕捉每个状态变更,失败记录前后快照。
  • 如果是异步操作,后续的改变可能基于之前的过时状态。

所以 Vuex 通过这种设计保证可追踪和可预测的状态管理,也使代码更结构化。这就是它的核心工作原理。

✨ 结语

        Vuex通过集中化的状态管理,将组件的共享状态抽离出来,以一个全局单例模式管理。这使得状态变化可预测,避免了复杂的组件间通信,也使调试和维护变得简单。

        其核心概念State、Getters、Mutations和Actions各司其职,但又相互配合,共同定义了一个清晰流程来改变和处理状态。这种模式提高了代码的结构化,也给予开发者更强的控制力。

        深入理解Vuex的设计思想,可以让我们更好地运用它管理复杂应用的状态,构建健壮可维护的Vue应用程序。Vuex是一个值得深入学习和应用的重要框架和思想。

        我们改日再会        

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

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

相关文章

HTML----JavaScript操作对象BOM对象

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 本章要求 了解BOM模型掌握BOM模型实际应用 一.BOM模型概述 BOM(浏览器对象模型)是JavaScript中的一个重要概念,它提供了一组用于控制浏览器窗口和页面内容的…

通过IP地址防范钓鱼网站诈骗的有效措施

随着互联网的普及,钓鱼网站诈骗成为一种广泛存在的网络犯罪行为。通过冒充合法网站,攻击者试图窃取用户的敏感信息。本文将探讨如何通过IP地址防范钓鱼网站诈骗,提供一系列有效的措施,以加强网络安全,保护用户免受诈骗…

逻辑回归算法到底能做什么

逻辑回归(Logistic Regression)是一种广义的线性回归分析模型,常用于数据挖掘、疾病自动诊断、经济预测等领域。它根据给定的自变量数据集来估计事件的发生概率。变量的范围在0和1之间,通常用于二分类问题,最终输出的预…

javafx

JavaFX JavaFX简介 JavaFX是一个用于创建富客户端应用程序的图形用户界面(GUI)框架。它是Java平台的一部分,从Java 8开始成为Java的标准库。 JavaFX提供了丰富的图形和多媒体功能,使开发人员能够创建具有吸引力和交互性的应用程…

【Proteus仿真】【Arduino单片机】数控稳压可调电源设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用动态数码管、按键、PCF8591 AD/DAC、LM358放大电路模块等。 主要功能: 系统运行后,系统默认输出直流5V,数…

C#使用 OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率相关方式

C# 去获取电脑相关的基础信息,还是需要借助 外部的库,我这边尝试了自己去实现它 网上有一些信息,但不太完整,都比较零碎,这边尽量将代码完整的去展示出来 OpenHardwareMonitor获取CPU的温度和频率需要管理员权限 在没…

第十二章 需求工程之一图胜千言

需求建模 可视化需求模型能帮助我们识别被遗漏的、不相关的和不一致的需求。数据流图(DFD)流程图,如泳道图状态转换图(STD)和状态表对话图决策表和决策树事件-响应表需求树用例图活动图实体关系图(ERD&…

Win10升级到Win11

Win10升级到Win11 1. 下载PC健康状况检查应用2. 下载Win111. Windows 11 安装助手2. 创建Windows 11 安装3. 下载Windows 11 磁盘映像(ISO) 3. Windows 11 安装助手4. 安装成功 有些小伙伴的诉求是想使用一下当前最火的Win11操作系统怎么样。 这里就来安…

Java基础进阶(学习笔记)

注:本篇的代码和PPT图片来源于黑马程序员,本篇仅为学习笔记 static static 是静态的意思,可以修饰成员变量,也可以修饰成员方法 修饰成员的特点: 被其修饰的成员, 被该类的所有对象所共享 多了一种调用方式, 可以通过…

引导过程与服务控制

一、开机启动的完整过程 bios加电自检测-------mbr------grub----------加载内核文件------------启动第一个进程 简述:加电后bios程序会自检硬件,硬件无故障,会根据第一启动项去找内核,一般来说,第一启动项是硬盘&a…

初学者快速入门学习日语,PDF文档音频教学资料合集

一、资料描述 本套学习资料是很全面的,共有734份文件,包括PDF,PPT,表格,图片,音频等多种格式,可以作为初级日语的学习教材,也是非常适合初学者入门的,可以帮助大家快速的…

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先搜索和广度优先搜索,都是图形搜索算法,它两相似,又却不同,在应用上也被用到不同的地方。这里拿一起讨论,方便比较。 一、深度优先搜索 深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法&…

西城微科|充气泵方案PCBA和芯片

智能充气泵是一种常见的充气工具,它在我们的日常生活中扮演着重要的角色。它主要用于给车辆、自行车、橡皮艇、游泳圈等充气,方便人们在各种场合使用。它简单方便的操作,快速高效的充气速度,以及便携的设计,让我们能够…

ubuntu系统没有网络图标的解决办法

参考文章:https://blog.csdn.net/qq_56922632/article/details/132309643 1. 执行关闭网络服务的命令,关闭网络服务sudo service NetworkManager stop2. 删除网络的状态文件sudo rm /var/lib/NetworkManager/NetworkManager.state3. 修改网络的配置文件sudo vi /etc…

如何避免LLM的“幻觉”(Hallucination)

生成式大语言模型(LLM)可以针对各种用户的 prompt 生成高度流畅的回复。然而,大模型倾向于产生幻觉或做出非事实陈述,这可能会损害用户的信任。 大语言模型的长而详细的输出看起来很有说服力,但是这些输出很有可能是虚…

Modbus 通信协议 二

Modbus 常用缩写 通用Modbus帧结构 -应用数据单元(ADU) Modbus数据模型 Modbus ADU 和 PDU 的长度 Modbus PDU结构 串行链路上的 Modbus 帧结构 Modbus 地址规则 ASCLL 模式 和 RTU 模式的比较 RTU 模式 RTU 模式位序列 帧格式 帧的标识与鉴别 CRC 循环冗…

linux系统下sql脚本的执行与导出

terminal中执行 执行 mysql -u [username] -p -D [databasename] < [XXX.sql] 导出 mysql -u [username] -p [datbasename] > [XXX.sql] 导出的数据库名自定义。 mysql -u [username] -p [databasename] [tablename] > [xxx.sql] 导出表名自定义 mysql shell 执行 …

众和策略:沪指震荡跌0.21%,煤炭、电力等板块拉升,核电概念活跃

2日早盘&#xff0c;三大股指盘中震荡走低&#xff0c;创业板指跌逾1%&#xff0c;北证50指数逆市拉升&#xff1b;北向资金大幅流出。 到午间收盘&#xff0c;沪指跌0.21%报2968.7点&#xff0c;深成指跌0.91%&#xff0c;创业板指跌1.38%&#xff0c;北证50指数涨1.33%&…

Java学习路线第六篇:互联网生态(1)

这篇则分享Java学习路线第六part&#xff1a;互联网生态 恭喜你已经成功追到第六章节啦&#xff0c;要被自己的努力感动到了吧&#xff0c;而这节将承担起学完互联网生态的使命&#xff0c;本使命为单向契约&#xff0c;你可选择YES或者选择YES。 Linux Linux从入门到精通视…

基于电商场景的高并发RocketMQ实战-促销活动推送至用户完整流程、Spring结合RocketMQ的生产者消费者使用

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff09;&#xff0c;发送【资料】可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景、中间件系列…