当前位置: 首页 > ops >正文

【Vue2 ✨】Vue2 入门之旅(十):Vuex 入门

在前面几篇文章中,我们学习了 Vue Router。本篇将介绍 Vuex,它是 Vue 官方提供的状态管理库,用来解决组件之间共享数据的问题。


目录

  1. 为什么需要 Vuex
  2. 安装与引入
  3. 核心概念
    • state
    • getters
    • mutations
    • actions
  4. 一个最小示例
  5. 小结

为什么需要 Vuex

在 Vue 项目中,父子组件之间可以用 props$emit 进行通信,但当层级很深或多个组件需要共享数据时,就会变得复杂。
这时就需要一个 集中式的状态管理 —— Vuex。

优点:

  • 数据集中存放,方便管理
  • 任意组件都能方便访问
  • 改变数据有统一规范(mutation/action)

安装与引入

CDN 方式:

<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuex@3/dist/vuex.js"></script>

NPM 方式:

npm install vuex@3

核心概念

state

存放全局数据,相当于组件的 data

const store = new Vuex.Store({state: {count: 0}
})

组件中访问:

this.$store.state.count

getters

类似于计算属性,用来从 state 派生数据。

const store = new Vuex.Store({state: { count: 0 },getters: {double: state => state.count * 2}
})

组件中访问:

this.$store.getters.double

mutations

用于修改 state,必须是 同步操作

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

组件中提交:

this.$store.commit('increment')

actions

用于处理异步逻辑,再通过 mutation 修改 state。

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

组件中分发:

this.$store.dispatch('incrementAsync')

一个最小示例

<div id="app"><p>计数:{{ $store.state.count }}</p><button @click="$store.commit('increment')">+1</button><button @click="$store.dispatch('incrementAsync')">异步+1</button>
</div><script>
const store = new Vuex.Store({state: { count: 0 },mutations: {increment(state) {state.count++}},actions: {incrementAsync({ commit }) {setTimeout(() => commit('increment'), 1000)}}
})new Vue({el: '#app',store
})
</script>

在这里插入图片描述


小结

  1. Vuex 是集中式状态管理工具,解决多组件共享数据的问题。
  2. 核心概念:
    • state:存放数据
    • getters:派生数据
    • mutations:同步修改数据
    • actions:异步操作
  3. 通过 commit 提交 mutation,dispatch 分发 action。

📚至此,《Vue2 入门之旅》系列的基础十篇就完整啦!后续可以考虑写一些进阶篇,比如 响应式原理虚拟 DOM性能优化

http://www.xdnf.cn/news/19608.html

相关文章:

  • 精读:《VideoMAE V2: Scaling Video Masked Autoencoders with Dual Masking》
  • 一键换装玩疯了!3个AI魔法提示词让你秒变时尚达人
  • lua脚本在redis中执行是否是原子性?
  • Java反序列化漏洞揭秘:从原理到攻击实战
  • RT-DETR模型训练中断,接着训练的方法
  • 单片机day1
  • DevExpress WPF中文教程:如何将WPF数据网格绑定到本地数据库?
  • MyBatis:让 SQL 与代码和谐共处的持久层框架
  • Windows 和 Linux 服务器 IP 与域名强制绑定方法
  • Python上下文管理器:资源管理的隐形守护者
  • 灵神题单之链表、树
  • k8s的CRD自定义资源类型示例
  • 整体认识K8s之PriorityClass优先级调度/HPA自动扩缩容机制
  • 【设计模式】从游戏角度开始了解设计模式 --- 创建型模式(一)
  • 【Linux系统】万字解析,进程间的信号
  • Photoshop用户必看:让你的PSD像JPG一样可预览
  • 书写腾讯天气遇到的问题
  • 虚拟继承:破解菱形继承之谜
  • 【论文阅读】Deepseek-VL:走向现实世界的视觉语言理解
  • Postman接口测试工具:高效管理测试用例与环境变量,支持断言验证及团队协作同步
  • 软件设计师——软件工程学习笔记
  • 前端架构知识体系:常见压缩算法全解析及原理揭秘(gzip、zip)
  • 麒麟信安受邀出席第三届电子信息测试产业大会,参编四项团标发布,详解麒麟信安操作系统测试全流程
  • Navicat vs DBeaver vs DataGrip:三款主流数据库客户端深度对比与选择
  • 力扣222 代码随想录Day15 第四题
  • 【高并发内存池】三、线程缓存的设计
  • Steam开发者上架游戏完整指南(含具体技术细节)
  • 【最新Pr 2025安装包(Adobe Premiere Pro 2025 中文解锁版)安装包永久免费版下载安装教程】
  • Java-Spring入门指南(一)Spring简介
  • 如何把HTML转化成桌面Electron