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,一经查实,立即删除!

相关文章

中型项目中 HTTP 的挑战与解决方案

一、引言 在当今数字化时代&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;作为Web应用程序的基础通信协议&#xff0c;在中型项目的开发中扮演着至关重要的角色。它为客户端和服务器之间的数据传输提供了标准规范&#xff0c;使得各种类型的应用&#xff0c;从简单的…

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…

小结:OSPF协议的工作原理

OSPF&#xff08;开放最短路径优先&#xff09;优点&#xff1a; 快速收敛&#xff1a;OSPF的收敛速度较快&#xff0c;能迅速响应网络拓扑变化&#xff0c;并在发生故障后快速更新路由信息。 支持大规模网络&#xff1a;OSPF适合大型网络&#xff0c;可以通过划分区域来减少网…

TypeScript - 利用GPT辅助学习

TypeScript 一、基础1. 安装 TypeScript2. 创建你的第一个 TypeScript 文件3. 编译 TypeScript 代码4. 变量声明与类型注解5. 函数与类型注解6. 总结 二、进阶常用类型1. 类型别名2. 对象类型3. 类型断言4.typeof 操作符 高级类型1. 类2. 交叉类型3. 泛型与 keyof4. 索引签名类…

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 存储的地方了。 之后就不…

element的el-form-item的prop作用

这个在elemenui中介绍比较简单&#xff0c;一般写的时候照着例子写&#xff0c;会正常运行。没太注意porp到底有啥影响点。这次有点时间整理一下。 这个https://worktile.com/kb/p/3534641链接讲述的要比一般csdn上的文章清晰。 总结&#xff1a; Vue表单验证中的prop属性用于指…

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&…

leetcode——找到字符串中所有字母异位词(java)

给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "…

LDN的蓝牙双模键盘帮助文档

文档索引 已支持的PCB列表(仅列出少部分)&#xff1a;键盘特性硬件软件键盘以及驱动蓝牙模式USB模式 驱动功能介绍主界面键盘列表页面键盘配置&#xff08;使用双模键盘的请务必细看本说明&#xff09;功能层配置(改键)触发层配置(改FN键等触发功能)功能选择&#xff08;重要&a…

STM32 FreeRTOS 信号量

信号量的简介 reeRTOS中的信号量是一种用于任务间同步和资源管理的机制。信号量可以是二进制的&#xff08;只能取0或1&#xff09;也可以是计数型的&#xff08;可以是任意正整数&#xff09;。信号量的基本操作包括“获取”和“释放”。 比如动车上的卫生间&#xff0c;一个…

Android SystemUI——系统快捷设置面板(十三)

通过前面的内容我们了解了 SystemUI 的启动流程以及相关组件的加载流程,同时也详细介绍了导航栏的创建和加载流程,对于 SystemUI 的组件来说,除了导航栏之外,下拉快捷设置面板也是比较重要的一个组件。 一、快捷设置面板 快捷设置面板(Quick Settings, QS)是 Android 系…