vue2 - Day05 - VueX

Vuex 是 Vue.js 官方的状态管理库。它是一个让你能在应用中集中管理共享状态的工具。当应用的规模逐渐增大,组件之间的数据传递变得越来越复杂时,Vuex 就成为了救星,提供了一个集中式的存储来管理所有的组件状态,并且保证状态以一种可预测的方式发生变化。

文章目录

    • 目的
    • Vuex 怎么做的?
      • (1). State
        • <1> 为什么有 `data` 和 `state`?
            • `data` 关心的是单个组件的内部状态;
        • <2> 使用数据信息
      • (2)Getters
      • (3)Mutations
        • Vuex 严格模式
      • (4) Actions
      • (5)Modules
    • Vuex 的“心脏” —— 单向数据流
        • 为什么 Vuex 很“牛”?
    • 总结:Vuex 让你理清数据的“厨房”!

目的

Vuex 的目标是让你的 Vue 应用在状态管理上不至于像一锅乱炖,避免在多个组件间传递数据时乱七八糟。你可以想象,在 Vuex 中,所有状态都被“规范化”了,组件们可以优雅地共享这些数据,而不需要通过层层的父子传递 props 和事件。这也解决了“数据共享时,父组件、子组件、孙组件之间的数据流动混乱”的老大难问题。

  1. 集中式管理:把所有共享的状态存放在一个地方,统一管理,避免数据凌乱。
  2. 严格的单向数据流:让数据更新的过程清晰可控,不会出现“你修改我,我改你”的尴尬局面。
  3. 跨组件通信:组件之间不再需要通过复杂的 prop 和 event 来传递数据,只需要从 store 获取就好。

Vuex 怎么做的?

Vuex 采用了几个核心概念来实现这一切:State、Getters、Mutations、Actions 和 Modules

(1). State

  • state 是存储数据的地方,它是 Vuex 的数据源。在应用中,组件需要共享的状态应该放在 state 中。你可以将它看作 Vuex 提供的“全球变量”,它能够帮助你在组件间共享数据。

  • 当然,如果你把所有东西都放进 state,那可能会导致一堆“杂货”,所以一定要有一定的规划,避免所有数据都成堆的乱象。 (´ω`)

const store = new Vuex.Store({state: {count: 0}
})
<1> 为什么有 datastate
  • data 是用来管理组件自身的状态,关注的是单一组件内的数据变化;

    image-20250120173621152

  • state 是 Vuex 用来管理全局状态的地方,目的是让多个组件能够共享和操作相同的数据。

    image-20250120173634397

换句话说:

  • data 关心的是单个组件的内部状态;
  • state 关心的是整个应用的全局状态,特别是跨组件、跨页面的数据共享和更新。

特性datastate
作用范围仅限于当前组件的局部状态全局状态,多个组件共享
存储位置Vue 组件内部Vuex store(状态管理仓库)
访问方式this.countthis.$store.state.count
响应性自动响应式更新视图自动响应式更新视图
用途处理单个组件的状态,通常是 UI 数据处理跨组件共享的状态

举个例子,如果你有一个购物车应用,在每个商品详情页面,商品的数量和价格会保存在该组件的 data 中;而购物车总数、用户登录状态、支付信息等会保存在 Vuex 的 state 中,让不同组件都能访问和修改。

所以,datastate 是两个不同范围的状态管理工具,一个是组件级的局部状态管理,一个是全局级的状态管理。

<2> 使用数据信息
  • 任何组件都可以通过 this.$store.state 来访问 Vuex 中的 state

    // Vuex store
    const store = new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++;}}
    });// 组件中访问 state
    export default {computed: {// 直接通过 this.$store.state 访问 state 中的数据count() {return this.$store.state.count;}},methods: {increment() {// 通过 mutation 更新 statethis.$store.commit('increment');}}
    }
  • 通过辅助函数mapState访问 state 数据

    import { mapState } from 'vuex';export default {computed: {// 使用 mapState 辅助函数...mapState({count: state => state.count // 将 state.count 映射到组件的 computed 属性中})},methods: {increment() {this.$store.commit('increment');}}
    }
    

(2)Getters

  • getters 是从 state 中派生出一些状态的“函数”,类似于 Vue 的计算属性,它们不会直接改变 state,而是返回一些加工过的计算结果。
  • 例如,如果 state 中有一个列表,我们可以在 getters 中处理这些数据,像是过滤出有效的元素或者计算某个值。
const store = new Vuex.Store({state: {count: 0},getters: {doubleCount: state => state.count * 2}
})

Getters 可不只是“取拿冰箱里的食材”,还会根据你的需求“做点小加工”,像做饭前的切菜一样(如果你能忍受长时间等待的切菜过程…)。

(3)Mutations

Mutations 就是唯一合法的修改state的唯一途径!它们是同步的,你不能在这里做异步操作(想抄捷径?做梦去吧)。每次要改变 state 的内容,你都必须通过 mutation 来“正式授权”进行修改。

const store = new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++}}
})

Mutations 就像一个“厨房的管理员”,它是唯一能决定“今天菜单”是什么的,不通过它你就不能随便动手。想做什么就要跟它打招呼!

  • 例如,你可能会写一个 mutation 来修改用户的登录状态:

    mutations: {login(state) {state.loggedIn = true;}
    }
    
Vuex 严格模式

要启用 Vuex 的严格模式,只需要在创建 Vuex.Store 实例时,将 strict 属性设置为 true 即可。

const store = new Vuex.Store({strict: true,  // 启用严格模式
});
  • 允许通过 mutations 修改 state:如果你按照 Vuex 的规范通过 commit 调用 mutations 来修改 state,Vuex 严格模式不会报错。
  • 不允许直接修改 state:如果你在 Vue 组件或其他地方直接修改 state,严格模式会报错,并且提供警告。比如:
this.$store.state.count++;  // 这是不被允许的,严格模式下会触发警告

Vuex 在开发环境下会检测到这种不合规的操作,并提示错误信息。

image-20250120182354292

(4) Actions

  • actions 类似于 mutations,但它们可以包含异步操作。actions 用来派发 mutation,通常你会在 actions 中执行一些异步操作(比如向后端发送请求),然后通过 commit 来触发 mutation。

    actions: {async fetchData({ commit }) {const data = await axios.get('/api/data');commit('setData', data);}
    }
    
  • 它们可以像一个小助手一样,帮你完成一些复杂的异步任务(比如 API 请求),最后将结果交给 mutation 来更新状态。

const store = new Vuex.Store({state: {count: 0},actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment')}, 1000)}}
})

它们可以像一个小助手一样,帮你完成一些复杂的异步任务(比如 API 请求),最后将结果交给 mutation 来更新状态。

(5)Modules

  • Vuex 还支持将 store 分成多个模块,每个模块都有自己的 state、mutations、actions 和 getters。这对于大型应用来说非常有用,它能帮助你将不同的业务逻辑进行分离。
  • 例如,如果你有一个用户模块和一个商品模块,你可以将它们分别定义在不同的模块中,避免了一个大的 store 变得过于复杂。
  • 看起来很像分区管理,有了这个功能,你就可以把代码管理得像一个井然有序的图书馆,而不是一团乱麻(¬_¬)。
const store = new Vuex.Store({modules: {moduleA: {state: { count: 0 },mutations: {increment(state) {state.count++}}}}
})

Modules 就是让你可以分摊厨房的责任,让多个厨师各司其职,避免一锅煮成了乱炖(不同模块管理自己的状态,既不冲突又井然有序)。

Vuex 的“心脏” —— 单向数据流

Vuex 强调了单向数据流(state -> getter -> component -> actions -> mutation -> state),你可以把它看作是一个规范化的流水线,每一步都非常清晰:

  1. state 提供数据;
  2. getter 提供处理过的数据;
  3. component 用来展示数据;
  4. actions 负责异步操作;
  5. mutation 最终改变数据。

整个流程都遵循着严格的规则,数据像流水一样流动。想要逆流而上?想都别想(除非是调皮的 mutation…)。

为什么 Vuex 很“牛”?

Vuex 是一个非常严谨的库,它的设计理念非常高大上(可能是你不想用它时最喜欢说的句子)。它让你避免了在组件间“乱搞”数据的尴尬局面,确保了每个数据变动都有清晰的路径和轨迹。

Vuex 的优点包括:

  • 集中管理状态:所有的状态都集中在 store,方便管理。
  • 严格的数据流控制:单向数据流让数据变化有迹可循。
  • 便捷的调试工具:Vuex 提供的时间旅行调试功能让你随时了解数据如何变化。
  • 模块化管理:即使是庞大的应用,也能清晰拆分和管理。

但如果你是小型应用,Vuex 的使用就有点像“用大炮打蚊子”。你可能会觉得:这怎么像是拿高科技武器去捉小猫咪呢?(不过一旦应用扩展,你会发现 Vuex 的威力)。

总结:Vuex 让你理清数据的“厨房”!

Vuex 是一个强大的工具,它让 Vue 应用的状态管理变得更加清晰和可预测。在大型应用中,Vuex 能够有效地集中管理状态,避免了直接操作 DOM 元素的凌乱(毕竟,Vuex 和 DOM 元素并没有什么关系哦~(。•́︿•̀。))。

当然,如果你是开发一个小型应用,Vuex 可能就有点“重”。不过没关系,就像你不需要开动整个火车来送一包米那样,小应用用别的状态管理方法就够了。所以,Vuex 不适合“短跑”,但适合长期合作!(如果你不怕它有时“拗口”…)

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

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

相关文章

IDEA导入Maven工程不识别pom.xml

0 现象 把阿里 sentinel 项目下载本地后&#xff0c;IDEA 中却没显示 maven 工具栏。 1 右键Maven Projects 点击IDEA右侧边栏的Maven Projects&#xff0c;再点击&#xff1a; 在出现的选择框中选择指定的未被识别的pom.xml即可&#xff1a; 2 Add as maven project 右键p…

VUE学习笔记(入门)5__vue指令v-html

v-html是用来解析字符串标签 示例 <!doctype html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document<…

OSPF的LSA的学习研究

OSPF常见1、2、3、4、5、7类LSA的研究 1、拓扑如图&#xff0c;按照地址表配置&#xff0c;激活OSPF划分相关区域并宣告相关网段 2、1类LSA&#xff0c;每台运行了OSPF的路由器都会产生&#xff0c;描述了路由器的直连接口状况和cost 可以看到R1产生了一条router lsa&#xff0…

Java - WebSocket

一、WebSocket 1.1、WebSocket概念 WebSocket是一种协议&#xff0c;用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接&#xff0c;这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发&#xff0c;并于2…

stm32 no connect target

解决 STM32 报错 “no target connected” 的方法 前言 stm32最小系统在下载程序是一直报错&#xff1a;no target connected&#xff0c;试了很多办法成功不了&#xff0c;最后将芯片擦除了才成功。 一、问题描述 当时是写flash的时候写到ST Link 存储的地方了。 之后就不…

Open3D计算点云粗糙度(方法一)【2025最新版】

目录 一、Roughness二、代码实现三、结果展示博客长期更新,本文最近更新时间为:2025年1月18日。 一、Roughness 通过菜单栏的Tools > Other > Roughness找到该功能。 这个工具可以估计点云的“粗糙度”。 选择一个或几个点云,然后启动这个工具。 CloudCompare只会询问…

窥探QCC518x/308x系列与手机之间的蓝牙HCI记录与分析 - 手机篇

今天要介绍给大家的是, 当我们在开发高通耳机时如果遇到与手机之间相容性问题, 通常会用Frontline或Ellisys的Bluetooth Analyzer来截取资料分析, 如果手边没有这样的仪器, 要如何窥探Bluetooth的HCI log.这次介绍的是手机篇. 这次跟QCC518x/QCC308x测试的手机是Samsung S23 U…

【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界

目录 前言 一、Python—— 网络爬虫的绝佳拍档 二、网络爬虫基础&#xff1a;揭开神秘面纱 &#xff08;一&#xff09;工作原理&#xff1a;步步为营的数据狩猎 &#xff08;二&#xff09;分类&#xff1a;各显神通的爬虫家族 三、Python 网络爬虫核心库深度剖析 &…

前端炫酷动画--图片(一)

目录 一、四角线框的跟随移动 二、元素倒影(-webkit-box-reflect) 三、模特换装(maskblend) 四、元素平滑上升 五、无限视差滚动 六、判断鼠标进入方向(轮播方向) 七、环形旋转效果 八、黑白小球交替旋转 九、hover时圆形放大 十、画一棵随机树(canvas) 十一、代码雨…

STL--list(双向链表)

目录 一、list 对象创建 1、默认构造函数 2、初始化列表 3、迭代器 4、全0初始化 5、全值初始化 6、拷贝构造函数 二、list 赋值操作 1、赋值 2、assign&#xff08;迭代器1&#xff0c;迭代器2&#xff09; 3、assign&#xff08;初始化列表&#xff09; 4、assig…

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…

小程序获取微信运动步数

1、用户点击按钮&#xff0c;在小程序中触发getuserinfo方法&#xff0c;获取用户信息 <scroll-view class"scrollarea" scroll-y type"list"><view class"container"><button bind:tap"getLogin">获取</button&…

C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一课主要是让大家初步了解C语言&#xff0c;了解我们的开发环境&#xff0c;main函数&#xff0c;库…

VSCode下EIDE插件开发STM32

VSCode下STM32开发环境搭建 本STM32教程使用vscode的EIDE插件的开发环境&#xff0c;完全免费&#xff0c;有管理代码文件的界面&#xff0c;不需要其它IDE。 视频教程见本人的 VSCodeEIDE开发STM32 安装EIDE插件 Embedded IDE 嵌入式IDE 这个插件可以帮我们管理代码文件&am…

Linux内核编程(二十一)USB驱动开发

一、驱动类型 USB 驱动开发主要分为两种&#xff1a;主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备&#xff0c;而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…

论文笔记-arXiv2025-A survey about Cold Start Recommendation

论文笔记-arXiv2025-Cold-Start Recommendation towards the Era of Large Language Models: A Comprehensive Survey and Roadmap 面向大语言模型&#xff08;LLMs&#xff09;时代的冷启动推荐&#xff1a;全面调研与路线图1.引言2.前言3.内容特征3.1数据不完整学习3.1.1鲁棒…

C#使用WMI获取控制面板中安装的所有程序列表

C#使用WMI获取控制面板中安装的所有程序列表 WMI 全称Windows Management Instrumentation,Windows Management Instrumentation是Windows中用于提供共同的界面和对象模式以便访问有关操作系统、设备、应用程序和服务的管理信息。如果此服务被终止&#xff0c;多数基于 Windo…

风光并网对电网电能质量影响的matlab/simulink仿真建模

这个课题早在一几年的时候比较热门&#xff0c;之前作电科院配电网的一个项目中也有所涉及&#xff0c;我把其中一部分经典仿真模型思路分享给大家&#xff0c;电能质量影响这部分&#xff0c;我在模型中主要体现的就是不同容量的光伏、风电接入&#xff0c;对并网点的电压影响…

.Net Core微服务入门全纪录(六)——EventBus-事件总线

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

C#防止重复提交

C#防止重复提交 文章目录 C#防止重复提交前言防止重复提交的思路Web API 防止重复提交代码实现代码讲解使用方法 MVC防止重复提交总结 前言 当用户在前端进行提交数据时&#xff0c;如果网络出现卡顿和前端没有给出响应的话顾客通常都会狂点提交按钮&#xff0c;这样就很容易导…