Vuex:全面指南及使用示例

学习 Vuex:全面指南及使用示例

Vuex 是一个专为 Vue.js 应用设计的状态管理库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。本文将详细介绍 Vuex 的核心概念和使用方法,并通过一个完整的示例演示如何在 Vue.js 项目中集成和使用 Vuex。

1. 为什么需要 Vuex?

在大型 Vue.js 应用中,多个组件之间可能需要共享状态。通过父子组件的 props 和事件传递数据在某些情况下会显得复杂且难以维护。Vuex 通过集中式状态管理提供了一种更好的解决方案,使得组件之间的状态共享和管理更加容易。

2. Vuex 的核心概念

Vuex 包含五个核心部分:State, Getters, Mutations, Actions, 和 Modules。

  • State:存储应用的状态。
  • Getters:从状态中派生出新的状态。
  • Mutations:更改状态的唯一方法,必须是同步函数。
  • Actions:类似于 mutations,但包含异步操作。
  • Modules:将 store 分割成模块,每个模块拥有自己的 state、getters、mutations 和 actions。
3. 安装 Vuex

首先,在 Vue 项目中安装 Vuex:

npm install vuex --save

然后,在项目中引入 Vuex:

import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);
4. 创建一个简单的 Vuex Store

接下来,我们创建一个简单的 Vuex store。假设我们正在开发一个计数器应用。

// store.js
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);const store = new Vuex.Store({state: {count: 0},getters: {doubleCount: state => state.count * 2},mutations: {increment(state) {state.count++;},decrement(state) {state.count--;}},actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment');}, 1000);},decrementAsync({ commit }) {setTimeout(() => {commit('decrement');}, 1000);}}
});export default store;

在这个 store 中,我们定义了:

  • state:存储一个计数器的值 count
  • getters:定义一个 doubleCount getter,它返回 count 的两倍。
  • mutations:定义 incrementdecrement 两个同步函数,用于更改 count 的值。
  • actions:定义 incrementAsyncdecrementAsync 两个异步函数,分别在 1 秒后调用相应的 mutation。
5. 在 Vue 组件中使用 Vuex

现在我们创建一个 Vue 组件来使用这个 store。

<template><div><p>{{ count }}</p><p>{{ doubleCount }}</p><button @click="increment">Increment</button><button @click="decrement">Decrement</button><button @click="incrementAsync">Increment Async</button><button @click="decrementAsync">Decrement Async</button></div>
</template><script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';export default {computed: {...mapState(['count']),...mapGetters(['doubleCount'])},methods: {...mapMutations(['increment', 'decrement']),...mapActions(['incrementAsync', 'decrementAsync'])}
}
</script>

在这个组件中:

  • 使用 mapStatestate 中的 count 映射到组件的计算属性。
  • 使用 mapGettersgetters 中的 doubleCount 映射到组件的计算属性。
  • 使用 mapMutationsmutations 中的 incrementdecrement 映射到组件的方法。
  • 使用 mapActionsactions 中的 incrementAsyncdecrementAsync 映射到组件的方法。
6. 模块化 Vuex Store

对于大型应用,可以将 store 拆分为模块,每个模块拥有自己的 state、getters、mutations 和 actions。

// store/modules/counter.js
const state = {count: 0
};const getters = {doubleCount: state => state.count * 2
};const mutations = {increment(state) {state.count++;},decrement(state) {state.count--;}
};const actions = {incrementAsync({ commit }) {setTimeout(() => {commit('increment');}, 1000);},decrementAsync({ commit }) {setTimeout(() => {commit('decrement');}, 1000);}
};export default {namespaced: true,state,getters,mutations,actions
};

然后在主 store 文件中引入这个模块:

// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import counter from './modules/counter';Vue.use(Vuex);const store = new Vuex.Store({modules: {counter}
});export default store;

使用模块化的 store 后,在组件中访问和使用模块化的状态和方法:

<template><div><p>{{ count }}</p><p>{{ doubleCount }}</p><button @click="increment">Increment</button><button @click="decrement">Decrement</button><button @click="incrementAsync">Increment Async</button><button @click="decrementAsync">Decrement Async</button></div>
</template><script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';export default {computed: {...mapState('counter', ['count']),...mapGetters('counter', ['doubleCount'])},methods: {...mapMutations('counter', ['increment', 'decrement']),...mapActions('counter', ['incrementAsync', 'decrementAsync'])}
}
</script>
7. 完整的登录示例

接下来,我们演示一个更复杂的场景:用户登录。这个示例将展示如何通过 Vuex 和 API 调用进行用户认证。

定义 API 调用函数

首先,定义一个用于登录的 API 调用函数:

// api/login.js
import axios from 'axios';export function login(username, password, code, uuid) {const data = {username,password,code,uuid};return axios({url: '/login',method: 'post',data});
}
在 Vuex 中定义登录逻辑

接下来,在 Vuex 中定义登录逻辑:

// store/modules/user.js
import { login } from '@/api/login';const state = {token: '',userInfo: {}
};const getters = {isLoggedIn: state => !!state.token
};const mutations = {SET_TOKEN(state, token) {state.token = token;},SET_USER_INFO(state, userInfo) {state.userInfo = userInfo;},LOGOUT(state) {state.token = '';state.userInfo = {};}
};const actions = {async login({ commit }, loginForm) {try {const response = await login(loginForm.username,loginForm.password,loginForm.code,loginForm.uuid);const { token, userInfo } = response.data;commit('SET_TOKEN', token);commit('SET_USER_INFO', userInfo);} catch (error) {throw new Error('Login failed');}},logout({ commit }) {commit('LOGOUT');}
};export default {namespaced: true,state,getters,mutations,actions
};
在主 store 文件中引入用户模块
// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import user from './modules/user';Vue.use(Vuex);const store = new Vuex.Store({modules: {user}
});export default store;
创建登录组件

最后,创建一个登录组件,使用 Vuex 进行状态管理:

<template><div><el-form :model="loginForm"><el-form-item label="Username"><el-input v-model="loginForm.username"></el-input></el-form-item><el-form-item label="Password"><el-input type="password" v-model="loginForm.password"></el-input></el-form-item><el-form-item label="Captcha"><el-input v-model="loginForm.code"></el-input><img :src="captchaSrc" @click="getCaptcha" /></el-form-item><el-button @click="handleLogin">Login</el-button></el-form></div>
</template><script>
import { mapActions } from 'vuex';export default {data() {return {loginForm: {username: '',password: '',code: '',uuid: ''},captchaSrc: ''};},methods: {...mapActions('user', ['login']),async handleLogin() {try {await this.login(this.loginForm);this.$router.push({ path: this.redirect || '/' });} catch (error) {this.$message.error('Login failed, please try again.');this.getCaptcha();}},getCaptcha() {// Assume getCaptcha function sets this.captchaSrc// Typically would fetch a new captcha image from backendthis.captchaSrc = '/api/captcha?uuid=' + this.loginForm.uuid;}},created() {this.getCaptcha();}
};
</script>

在这个组件中:

  • loginForm 用于绑定表单数据,包括用户名、密码和验证码。
  • captchaSrc 用于存储验证码图片的 URL。
  • 使用 mapActionsuser 模块中的 login action 映射到组件的方法。
  • handleLogin 方法调用 Vuex 的 login action 进行登录,并根据结果进行路由跳转或显示错误信息。
  • getCaptcha 方法获取新的验证码。

主要过程:

  1. 安装 Vuex:通过 npm 安装并在项目中引入。
  2. 创建 Store:定义 state、getters、mutations 和 actions 来管理应用状态。
  3. 组件与 Vuex 交互:使用 mapStatemapGettersmapMutationsmapActions 将 Vuex 的状态和方法映射到 Vue 组件。
  4. 模块化 Store:将 store 分割为模块,便于管理和维护。
  5. 实际示例:通过用户登录示例演示如何在实际项目中使用 Vuex。

使用 Vuex 的好处:

  • 集中管理状态:所有状态变化都在一个地方管理,使调试和维护变得更容易。
  • 解耦组件:组件之间通过 Vuex 共享状态,不需要直接通信,减少了组件之间的耦合度。
  • 时间旅行调试:可以方便地回溯和检查状态变化。

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

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

相关文章

数据库之函数、存储过程

函数、存储过程 1.函数 函数&#xff0c;常用于对一个或多个输入参数进行操作&#xff0c;主要目的是返回一个结果值&#xff0c;就是一种方法&#xff0c;在postgre里存放的位置叫function&#xff0c;比如创建一个计算长方面积的函数。 举例&#xff1a;建立一个计算长方形…

kali-搭建Pikachu漏洞练习平台

环境&#xff1a;kali 压缩包&#xff1a;pikachu-master.zip &#xff08;下载地址&#xff1a;GitHub - zhuifengshaonianhanlu/pikachu: 一个好玩的Web安全-漏洞测试平台&#xff09; 1.mysql 1.开启kali中自带的mysql systemctl restart mysql #重启MySQL服务 systemc…

Java面试题:Redis2_解决Redis缓存击穿问题

缓存击穿 当一个key过期时,需要对这个key进行数据重建 在重建的时间内如果有大量的并发请求进入,就会绕过缓存进入数据库,会瞬间击垮DB 重建时间可能因为数据是多个表的混合结果需要分头统计而延长,从而更容易出现缓存击穿问题 缓存击穿的解决方案 添加互斥锁 先查询缓存…

iOS hitTest 机制用处之二-----使用pointInside方法

hittest 机制 下面是伪代码 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{if (self.hidden NO || self.alpha < 0.05 || self.userInteractionEnabled NO) {//1.当满足这几个条件时&#xff0c;直接丢弃touch事件&#xff0c;不再向下分发。return n…

[Mac软件]Leech for Mac v3.2 - 轻量级mac下载工具

黑果魏叔推荐Leech是由Many Tricks开发的适用于Mac OS X的轻量级且功能强大的下载管理器。 Leech让您完全控制下载&#xff0c;并与浏览器完全集成。您可以将下载排队&#xff0c;暂停和恢复&#xff0c;从受密码保护的服务器下载&#xff0c;并将密码存储在系统范围的安全钥匙…

Ubuntu系统配置DDNS-GO【笔记】

DDNS-GO 是一个基于 Go 语言的动态 DNS (DDNS) 客户端&#xff0c;用于自动更新你的 IP 地址到 DNS 记录上。这对于经常变更 IP 地址的用户&#xff08;如使用动态 IP 的家庭用户或者小型服务器&#xff09;非常有用。 此文档实验环境为&#xff1a;ubuntu20.04.6。 在Ubuntu…

GIt快速入门(一文学会使用Git)

GIt快速入门 文章目录 GIt快速入门一、为什么要学习Git二、Git的安装1.安装Git2.下载GUI 三、Git的概念1、版本控制2、集中式控制3、分布式控制4、多人协作开发1.并行开发2.分支管理3.冲突解决4.代码审查5.分布式特性 四、Git客户端操作1.界面介绍2.提交操作3.创建分支4.合并分…

vscode编辑器创建分支注意事项?!

最近在公司开发项目时&#xff0c;不小心将自己分支的东西提交到公司的master的分支&#xff0c;大家看看是什么情况&#xff1f; 先上图&#xff1a; 从图上看&#xff0c;我这边用了GITLENS这个插件&#xff0c;在创建分支时&#xff0c;有个create branch from&#xff0c;有…

Zynq学习笔记--AXI4-Stream 图像数据从仿真输出到图像文件

目录 1. 简介 2. 构建工程 2.1 Vivado 工程 2.2 TestBench 代码 2.3 关键代码分析 3. VPG Background Pattern ID (0x0020) Register 4. 总结 1. 简介 使用 SystemVerilog 将 AXI4-Stream 图像数据从仿真输出到图像文件 (PPM)。 用到的函数包括 $fopen、$fwrite 和 $f…

Hbase 面试题(四)

1. 简述Memstore Flush 流程 &#xff1f; MemStore的Flush流程是HBase中将内存中的数据刷新到磁盘上的HFile的过程。以下是MemStore Flush流程的简要概述&#xff1a; 触发条件&#xff1a; 当MemStore的大小达到预设的阈值&#xff08;由配置参数hbase.hregion.memstore.flu…

2024 第三届 AIGC 中国开发者大会:多模态大模型的发展与趋势

引言 在2024年第三届AIGC中国开发者大会上&#xff0c;零一万物联合创始人潘欣分享了多模态大模型的发展与趋势。潘欣对多模态大模型的历史、现状和未来进行了详细回顾和深刻思考&#xff0c;为我们揭示了该领域的发展路径和技术前景。本文将详细解读潘欣的分享内容&#xff0…

Vue3实战笔记(56)—实战:DefineModel的使用方法细节

文章目录 前言一、实战DefineModel二、思考原理总结 前言 今天写个小例子&#xff0c;实战DefineModel的使用方法细节 一、实战DefineModel 上文官方说的挺清楚&#xff0c;实战验证一下&#xff0c;新建DefineModel.vue&#xff08;这是儿子&#xff09;&#xff1a; <te…

go map 如何比较两个 map 相等

go map 如何比较两个 map 相等 都为 nil非空、长度相等&#xff0c;指向同一个 map 实体对象相应的 key 指向的 value 相等 直接将使用 map1 map2 是错误的。这种写法只能比较 map 是否为 nil。因此只能是遍历map 的每个元素&#xff0c;比较元素是否都是深度相等。

C++核心编程之类和对象一

C核心编程之类和对象一 文章目录 C核心编程之类和对象一1.类1.类的组成2.类的访问权限3.class和struct的区别 1.类 1.类的组成 一个类通常由属性&#xff08;也叫成员属性&#xff09;和行为&#xff08;成员函数、成员方法&#xff09;组成&#xff0c;类有不同的访问权限&a…

Facebook开户 | Facebook二不限户

Facebook二不限户的正确使用方法 Facebook 二不限是指 Facebook 国内二不限户&#xff0c;是通过代理开出来的一种特殊账户&#xff0c;️需要广告主准备主页。 其特点是&#xff1a;限主页、不限域名、额度没解限&#xff0c;解限后则不限额度。 相比于三不限户&#xff0c;…

封装PHP用于发送GET和POST请求的公共方法

封装了ThinkPHP用于发送GET和POST请求的公共方法。这个方法可以放在你的公共函数文件中&#xff0c;或者创建一个独立的类来管理这些请求。 <?php namespace app\common\utils;use think\facade\Log; use think\exception\HttpException;class HttpRequest {/*** 发送GET请…

开源日志分析平台ELK实战应用

1.开源日志分析平台ELK概述及搭建过程 ELK 是一个开源的日志管理平台,由 Elasticsearch、Logstash 和 Kibana 三个组件组成。这个平台广泛用于实时日志处理和分析。下面简单介绍一下每个组件的作用以及如何搭建一个基本的 ELK 栈。 ELK 组件 Elasticsearch:是一个搜索和分析…

Pycharm的基础设置+Pycharm与AutoDL服务器连接

一.pycharm的基础设置 1.下载pycharm profession版&#xff0c;配置之前博客里面的解释器mask2 2.run detect.py 3.终端的设置 &#xff08;1&#xff09;先直接在终端里面pip install 我们再创建一个测试python文件&#xff1a;terninal_test.py 虽然上面安装成功了包&#x…

GNU Radio创建qt time plot python OOT块

文章目录 前言一、创建自定义的 OOT 块1、安装相应依赖2、创建 OOT 块3、修改相关4、编译及安装 OOT 块 二、测试1、grc 图2、运行结果 三、资源自取 前言 官方提供的绘制时域波形的 block 名字叫做 QT GUI Time Sink&#xff0c;其底层实现是用 C 写的&#xff0c;但是我发现…

回归预测 | MATLAB实现基于GOOSE-LightGBM的多特征输入单输出数据回归预测(鹅优化算法)

回归预测 | MATLAB实现基于GOOSE-LightGBM的多特征输入单输出数据回归预测(鹅优化算法) 目录 回归预测 | MATLAB实现基于GOOSE-LightGBM的多特征输入单输出数据回归预测(鹅优化算法)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现基于LightGBM算法的数据回归预…