Vue 3 30天精进之旅:Day 11 - 状态管理

在开发复杂的前端应用时,状态管理是一个不可或缺的部分。Vuex是Vue.js官方提供的状态管理库,能够高效地管理应用中的共享状态。它使得各个组件之间的状态共享和维护变得更加简单和清晰。今天,我们将探讨以下几个方面:

  1. Vuex概述
  2. 安装Vuex
  3. Vuex的基本概念
  4. 在Vue组件中使用Vuex
  5. 异步操作与Vuex
  6. Vuex中的模块化
  7. 总结与实践

1. Vuex概述

Vuex是专为Vue.js应用程序开发的状态管理模式和库。它集中存储所有组件的共享状态,并通过一种可预测的方式来保证状态以一种安全的方式发生变化。Vuex的核心理念是将应用的状态统一管理,以提高管理和维护的效率。

2. 安装Vuex

在Vue 3项目中添加Vuex,你可以通过npm或yarn进行安装:

npm install vuex@next

3. Vuex的基本概念

Vuex主要由以下几个核心概念组成:

  • State:Vuex应用的状态,类似于Vue组件的data。
  • Getters:计算State的属性,类似于Vue的计算属性。
  • Mutations:唯一改变State的方式,直接修改State。
  • Actions:用于处理异步操作及提交Mutations的函数。
  • Modules:允许将store分割成模块来管理应用的状态。

3.1. 创建 Vuex Store

在Vue 3项目中创建和配置Vuex Store如下:

javascript

// store.js
import { createStore } from 'vuex';const store = createStore({state() {return {count: 0,};},mutations: {increment(state) {state.count++;},decrement(state) {state.count--;},},
});export default store;

在上面的代码中,我们定义了一个简单的Store,并在其中初始化了状态,创建了相应的mutations。

3.2. 在应用中使用 Vuex

要在 Vue 应用中使用 Vuex,需要在主入口文件中引入并挂载 Store:

javascript

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';const app = createApp(App);
app.use(store);
app.mount('#app');

4. 在 Vue 组件中使用 Vuex

在组件中,我们可以通过 mapStatemapGettersmapMutations 和 mapActions 来访问和更改 Vuex Store 中的状态。

4.1. 使用 mapState

vue

<template><div><p>Count: {{ count }}</p><button @click="increment">Increment</button><button @click="decrement">Decrement</button></div>
</template><script>
import { mapState, mapMutations } from 'vuex';export default {computed: {...mapState(['count']), // 映射状态},methods: {...mapMutations(['increment', 'decrement']), // 映射 mutations },
};
</script>

在这个例子中,我们使用了 mapState 来自动将 count 映射到组件的计算属性中,并使用 mapMutations 来映射相应的变更方法。

4.2. 使用 mapGetters

Getters使得我们能够对State进行派生计算,并通过 mapGetters 访问其结果:

javascript

const store = createStore({state() {return {count: 0,};},getters: {doubleCount(state) {return state.count * 2;},},
});

在组件中使用:

vue

<template><div><p>Double Count: {{ doubleCount }}</p></div>
</template><script>
import { mapGetters } from 'vuex';export default {computed: {...mapGetters(['doubleCount']), // 映射 getters},
};
</script>

5. 异步操作与Vuex

由于Vuex的mutations是同步的,因此我们通常使用actions来处理异步操作。你可以在actions中执行异步请求或其他异步逻辑,并随后提交mutations。

javascript

const store = createStore({state() {return {count: 0,};},mutations: {increment(state) {state.count++;},},actions: {async incrementAsync({ commit }) {await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟异步操作commit('increment');},},
});

在组件中调用:

vue

<template><div><p>Count: {{ count }}</p><button @click="incrementAsync">Increment After 1 Second</button></div>
</template><script>
import { mapState, mapActions } from 'vuex';export default {computed: {...mapState(['count']),},methods: {...mapActions(['incrementAsync']), // 映射 actions},
};
</script>

6. Vuex中的模块化

对于较大型的应用,Vuex允许将store分割成模块。每个模块拥有自己的state、mutations、actions和getters。

例如,创建一个用户模块:

javascript

const userModule = {state() {return {userInfo: null,};},mutations: {setUserInfo(state, payload) {state.userInfo = payload;},},actions: {fetchUserInfo({ commit }) {// 模拟异步请求const userInfo = { name: 'John Doe', age: 30 };commit('setUserInfo', userInfo);},},
};const store = createStore({modules: {user: userModule,},
});

在组件中使用模块状态:

vue

<template><div><p>User Name: {{ userName }}</p><button @click="fetchUserInfo">Fetch User Info</button></div>
</template><script>
import { mapState, mapActions } from 'vuex';export default {computed: {...mapState('user', ['userInfo']), // 映射模块状态userName() {return this.userInfo ? this.userInfo.name : 'No User';},},methods: {...mapActions('user', ['fetchUserInfo']), // 映射模块中的 actions},
};
</script>

7. 总结与实践

今天我们深入了解了Vuex的核心概念以及如何在Vue 3中使用它来管理状态。掌握了Vuex后,你将能够更有效地控制应用的状态,尤其在创建大型应用时。通过状态管理,我们可以使组件之间的状态共享变得清晰、有序。

练习

  1. 创建一个简单的购物车应用,使用Vuex来管理购物车中的商品状态。
  2. 使用Vuex模块化的方式将不同的状态(如用户信息、商品列表等)分开管理。
  3. 在购物车应用中实现异步获取商品数据的功能,并将其存储到Vuex状态中。

通过完成这些练习,你将能够更好地理解Vuex在实际应用中的强大功能。明天我们将探索如何在Vue与后端API进行异步操作的整合,敬请期待!

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

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

相关文章

【Python】第七弹---Python基础进阶:深入字典操作与文件处理技巧

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、字典 1.1、字典是什么 1.2、创建字典 1.3、查找 key 1.4、新增/修改元素 1.5、删除元素 1.6、遍历…

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操 Janus-Pro-7B介绍 Janus-Pro-7B 是由 DeepSeek 开发的多模态 AI 模型&#xff0c;它在理解和生成方面取得了显著的进步。这意味着它不仅可以处理文本&#xff0c;还可以处理图像等其他模态的信息。 模型主要特点:Permalink…

BW AO/工作簿权限配置

场景&#xff1a; 按事业部配置工作簿权限&#xff1b; 1、创建用户 事务码&#xff1a;SU01&#xff0c;用户主数据的维护&#xff0c;可以创建、修改、删除、锁定、解锁、修改密码等 用户设置详情页 2、创建权限角色 用户的权限菜单是通过权限角色分配来实现的 2.1、自定…

jstat命令详解

jstat 用于监视虚拟机运行时状态信息的命令&#xff0c;它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。 命令的使用格式如下。 jstat [option] LVMID [interval] [count]各个参数详解&#xff1a; option&#xff1a;操作参数LVMID&#xff1a;本…

3.Spring-事务

一、隔离级别&#xff1a; 脏读&#xff1a; 一个事务访问到另外一个事务未提交的数据。 不可重复读&#xff1a; 事务内多次查询相同条件返回的结果不同。 幻读&#xff1a; 一个事务在前后两次查询同一个范围的时候&#xff0c;后一次查询看到了前一次查询没有看到的行。 二…

MYSQL--一条SQL执行的流程,分析MYSQL的架构

文章目录 第一步建立连接第二部解析 SQL第三步执行 sql预处理优化阶段执行阶段索引下推 执行一条select 语句中间会发生什么&#xff1f; 这个是对 mysql 架构的深入理解。 select * from product where id 1;对于mysql的架构分层: mysql 架构分成了 Server 层和存储引擎层&a…

ReentrantReadWriteLock源码分析

文章目录 概述一、状态位设计二、读锁三、锁降级机制四、写锁总结 概述 ReentrantReadWriteLock&#xff08;读写锁&#xff09;是对于ReentranLock&#xff08;可重入锁&#xff09;的一种改进&#xff0c;在可重入锁的基础上&#xff0c;进行了读写分离。适用于读多写少的场景…

51单片机开发:温度传感器

温度传感器DS18B20&#xff1a; 初始化时序图如下图所示&#xff1a; u8 ds18b20_init(void){ds18b20_reset();return ds18b20_check(); }void ds18b20_reset(void){DS18B20_PORT 0;delay_10us(75);DS18B20_PORT 1;delay_10us(2); }u8 ds18b20_check(void){u8 time_temp0;wh…

vue2项目(一)

项目介绍 电商前台项目 技术架构&#xff1a;vuewebpackvuexvue-routeraxiosless.. 封装通用组件登录注册token购物车支付项目性能优化 一、项目初始化 使用vue create projrct_vue2在命令行窗口创建项目 1.1、脚手架目录介绍 ├── node_modules:放置项目的依赖 ├──…

labelme_json_to_dataset ValueError: path is on mount ‘D:‘,start on C

这是你的labelme运行时label照片的盘和保存目的地址的盘不同都值得报错 labelme_json_to_dataset ValueError: path is on mount D:,start on C 只需要放一个盘但可以不放一个目录

物联网 STM32【源代码形式-使用以太网】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

物联网&#xff08;IoT&#xff09;‌是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器等装置与技术&#xff0c;实时采集并连接任何需要监控、连接、互动的物体或过程&#xff0c;实现对物品和过程的智能化感知、识别和管理。物联网的核心功能包括数据采集与监…

无心剑七绝《深度求索》

七绝深度求索 深研妙理定乾坤 度世玄机启智门 求路千难兼万险 索萦华夏自为尊 2025年2月1日 平水韵十三元平韵 无心剑七绝《深度求索》以平水韵十三元平韵写成&#xff0c;意境深远&#xff0c;气势磅礴。诗中“深研妙理定乾坤”开篇点题&#xff0c;展现出对深奥道理的钻研与探…

Hot100之普通数组

53最大子数组和 题目 思路解析 我们用一个dp数组来收集我们从左往右&#xff0c;加起来的最大的和 也就是我们的节点不是负数&#xff0c;那我们直接收集就好了 如果是负数&#xff0c;我们就用Max&#xff08;&#xff09;比较是这个节点大还是当前节点大&#xff08;这个情…

如何利用天赋实现最大化的价值输出-补

原文&#xff1a; https://blog.csdn.net/ZhangRelay/article/details/145408621 ​​​​​​如何利用天赋实现最大化的价值输出-CSDN博客 如何利用天赋实现最大化的价值输出-CSDN博客 引用视频差异 第一段视频目标明确&#xff0c;建议也非常明确。 录制视频的人是主动性…

新能源算力战争:为什么AI大模型需要绿色数据中心?

新能源算力战争:为什么AI大模型需要绿色数据中心? 近年来,人工智能(AI)大模型的爆发式增长正在重塑全球科技产业的格局。以GPT-4、Gemini、Llama等为代表的千亿参数级模型,不仅需要海量数据训练,更依赖庞大的算力支撑。然而,这种算力的背后隐藏着一个日益严峻的挑战——…

Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)

目录 前言1. 基本知识2. Demo3. 实战代码 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&am…

unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等

目录 1 场景数量 SceneManager.sceneCount 2 直接代码生成新场景 SceneManager.CreateScene 3 场景的加载 3.1 用代码加载场景&#xff0c;仍然build setting里先加入配置 3.2 卸载场景 SceneManager.UnloadSceneAsync(); 3.3 同步加载场景 SceneManager.LoadScene 3.3.…

【Android】布局文件layout.xml文件使用控件属性android:layout_weight使布局较为美观,以RadioButton为例

目录 说明举例 说明 简单来说&#xff0c;android:layout_weight为当前控件按比例分配剩余空间。且单个控件该属性的具体数值不重要&#xff0c;而是多个控件的属性值之比发挥作用&#xff0c;例如有2个控件&#xff0c;各自的android:layout_weight的值设为0.5和0.5&#xff0…

hot100_21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[…

4 [危机13小时追踪一场GitHub投毒事件]

事件概要 自北京时间 2024.12.4 晚间6点起&#xff0c; GitHub 上不断出现“幽灵仓库”&#xff0c;仓库中没有任何代码&#xff0c;只有诱导性的病毒文件。当天&#xff0c;他们成为了 GitHub 上 star 增速最快的仓库。超过 180 个虚假僵尸账户正在传播病毒&#xff0c;等待不…