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.rhkb.cn/news/4792.html

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

相关文章

Linux系统之kill命令的基本使用

Linux系统之kill命令的基本使用 一、kill命令介绍1. kill命令简介2. kill命令的使用场景3. kill命令使用注意事项 二、kill命令的使用帮助1. 查看kill命令帮助信息2. kill命令帮助解释 三、kill常用的信号1. 列出所有的信号2.kill常用的信号 四、kill命令的基本使用1. 运行一个…

HTML之拜年/跨年APP(改进版)

目录&#xff1a; 一&#xff1a;目录 二&#xff1a;效果 三&#xff1a;页面分析/开发逻辑 1.页面详细分析&#xff1a; 2.开发逻辑&#xff1a; 四&#xff1a;完整代码&#xff08;不多废话&#xff09; index.html部分 app.json部分 二&#xff1a;效果 三&#xff1a;页面…

深入探索Python人脸识别技术:从原理到实践

一、引言在当今数字化时代,人脸识别技术已然成为了计算机视觉领域的璀璨明星,广泛且深入地融入到我们生活的各个角落。从门禁系统的安全守护,到金融支付的便捷认证,再到安防监控的敏锐洞察,它的身影无处不在,以其高效、精准的特性,极大地提升了我们生活的便利性与安全性…

JupyterLab 安装以及部分相关配置

安装 JupyterLab pip install jupyter启动 JupyterLab jupyter lab [--port <指定的端口号>] [--no-browser] # --port 指定端口 # --no-browser 启动时不打开浏览器安装中文 首先安装中文包 pip install jupyterlab-language-pack-zh-CN安装完成后重启 JupyterLab 选…

mac m1下载maven安装并配置环境变量

下载地址&#xff1a;Download Apache Maven – Maven 解压到一个没有中文和空格的文件夹 输入pwd查看安装路径 输入cd返回根目录再输入 code .zshrc 若显示 command not found: code你可以通过以下步骤来安装和配置 code 命令&#xff1a; 1. 确保你已经安装了 Visual Studio…

【环境搭建】Metersphere v2.x 容器部署教程踩坑总结

前言 Metersphere部署过程中遇到的问题有点多&#xff0c;原因是其容器的架构蛮复杂的&#xff0c;比较容易踩坑&#xff0c;所以记录一下。 介绍 MeterSphere 是开源持续测试平台&#xff0c;遵循 GPL v3 开源许可协议&#xff0c;涵盖测试管理、接口测试、UI 测试和性能测…

VSCode的配置与使用(C/C++)

从0开始教你在vscode调试一个C文件 一.首先是配置你的编译环境&#xff0c;添加到环境变量&#xff08;默认你是全新的电脑&#xff0c;没有安装vs2019之类的&#xff09; 原因&#xff1a;因为相比于vs2019&#xff0c;vscode只是个代码编辑器&#xff0c;相当于一个彩色的、…

QTableWidget的简单使用

1.最简单的表格示例&#xff1a; ui->tableWidget->setRowCount(2);// 设置行数ui->tableWidget->setColumnCount(3);// 设置列数&#xff0c;一定要放在设置行表头之前QStringList rowHeaderList;// 行表头rowHeaderList << QStringLiteral("姓名"…

七大排序算法

文章目录 排序的概念及引用1.插入排序2.希尔排序(缩小增量排序)3.选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序8.代码排序部分的测试9.代码加效果大致测试时间&#xff08;仅供参考&#xff09; 排序的概念及引用 排序:将数据按照特定的规律排成递增或递减的操作 稳定性:…

前端常见标签

1. <!-- ! 快速生成标签 --> &#xff01;回车会立刻生成模板 2. <!-- CTRL / 生成注释--> 3. 文本标签 <!-- span 文本标签 --> 生成如下&#xff1a; 4. <!-- h1-h6标题标签 --> 大小依次递减 生成&…

PHP教育系统小程序

&#x1f310; 教育系统&#xff1a;全方位学习新体验&#xff0c;引领未来教育风尚 &#x1f680; 教育系统&#xff1a;创新平台&#xff0c;智慧启航 &#x1f4f1; 教育系统&#xff0c;一款深度融合科技与教育的创新平台&#xff0c;匠心独运地采用先进的ThinkPHP框架与U…

MySQL配置my.ini文件

my.ini文件中存储了数据库的文件地址&#xff0c;数据库数据存储地址以及登录密码等基础信息。在遇到忘记密码或者其他基础问题时&#xff0c;修改my.ini文件很方便。但是部分数据库版本默认不生成my.ini文件&#xff0c;需要自己进行配置。 1.停止数据库服务。在搜索框中输入…

【电视盒子】HI3798MV300刷机教程笔记/备份遥控码修复遥控器/ADB/线刷卡刷/电视盒子安装第三方应用软件

心血来潮&#xff0c;看到电视机顶盒满天飞的广告&#xff0c;想改造一下家里的电视盒子&#xff0c;学一下网上的人刷机&#xff0c;但是一切都不知道怎么开始&#xff0c;虽然折腾了一天&#xff0c;以失败告终&#xff0c;还是做点刷机笔记。 0.我的机器 年少不会甄别&…

Java中的构造器

Java中的构造器详解 1. 什么是构造器 构造器&#xff08;Constructor&#xff09; 是一种特殊的方法&#xff0c;用于在创建对象时初始化对象的状态。构造器的名字必须与类名相同&#xff0c;且没有返回类型&#xff0c;连 void 也不能使用。 2. 构造器的特点 名称与类名相同…

Zabbix监控山特UPS电源:实现高效监控与告警

背景 近期&#xff0c;随着机房迁移的进行&#xff0c;为了提升电力保障并确保设备的持续运行&#xff0c;我们在原有基础上新增了多台山特UPS电源作为备用电源。这些UPS电源的主要作用是在电力中断时为机房设备提供足够的电力支持&#xff0c;确保设备有充足的时间进行正常关…

计算机系统原理:一些断言

0 虚拟机和解释器 在Java中&#xff0c;JVM既充当了一个虚拟机的角色&#xff0c;也包含了用于执行字节码的解释器。同样地&#xff0c;Python的CPython实现也是先将源代码编译成字节码&#xff0c;然后由Python虚拟机执行。 1 从源代码中提取token的过程就是词法分析 词法分…

【正则表达式】从0开始学习正则表达式

正则表达式&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09; 一、推荐学习网站 正则表达式 – 语法 | 菜鸟教程 正则表达式30分钟入门教程 | 菜鸟教程 编程胶囊-打造学习编程的最好系统 二、必知必记 2.1 元字符…

mysql之基本常用的语法

mysql之基本常用的语法 1.增加数据2.删除数据3.更新/修改数据4.查询数据 4.1.where子句4.2.order by4.3.limit与offset4.4.分组与having4.5.连接 5.创建表 1.增加数据 insert into 1.指定列插入 语法&#xff1a;insert into table_name(列名1,列名2,....,列名n) values (值…

Jenkins 启动

废话 这一阵子感觉空虚&#xff0c;心里空捞捞的&#xff0c;总想找点事情做&#xff0c;即使这是一件微小的事情&#xff0c;空余时间除了骑车、打球&#xff0c;偶尔朋友聚会 … 还能干什么呢&#xff1f; 当独自一人时&#xff0c;究竟可以做点什么&#xff0c;填补这空虚…

阳振坤:AI 大模型的基础是数据,AI越发达,数据库价值越大

2024年1月12日&#xff0c;第四届OceanBase数据库大赛决赛在北京圆满落幕。在大赛的颁奖典礼上&#xff0c;OceanBase 首席科学家阳振坤老师为同学们献上了一场主题为“爱上数据库”的公开课&#xff0c;他不仅分享了个人的成长历程&#xff0c;还阐述了对数据库行业现状与未来…