系统性学习vue-vuex

news2025/2/25 5:46:31

系统性学习vue-vuex

  • 理解vuex
  • vuex工作原理
  • 搭建vuex环境
  • 案例
  • Vuex的开发者工具使用
  • getters配置项
  • mapState与mapGetters
  • mapActions和mapMutations
  • vuex模块化+namespace

理解vuex

概念: 专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信

兄弟组件间需要共享数据
vuex是不属于任何组件的一个存储区域,所有组件都可以对其数据进行获取和更改

vuex工作原理

vuex有三个重要部分组成:Actions、Mutations、State,他们都是对象类型,且都由store来管理
如果不需要请求服务器数据或一些处理业务逻辑,那也可以直接从vc到Mutations
在这里插入图片描述

搭建vuex环境

  1. 安装 npm i vuex
    注意:如果使用的是vue2,那就要下载vuex3,而目前默认是下载vuex4,vuex4是要在vue3中使用 npm i vuex@3
  2. 引入并使用vuex(main.js中)
    import Vuex from "vuex";
    Vue.use(Vuex)
    引入并使用后vm和vc就都可以看到$store这一属性了
  3. 创建store
    有两种写法:
    一种是src下创建vuex文件夹,里面再创建store.js
    另一种是src下创建store文件夹,里面再创建index.js(官网使用)
// /src/store/index.js
// 该文件用于创建Vuex中最为核心的store

// 引入vuex
import Vuex from "vuex";

// 准备actions 用于响应组件中的动作
const actions = {};

// 准备mutations 用于操作数据(状态)
const mutations = {};

// 准备state 用于存储数据
const state = {};

// 创建并暴露store
export default new Vuex.Store({
  actions,
  mutations,
  state,
});

// 暴露store
// export default store; //改为简写

  1. 引入store并添加配置项(main.js中)
import store from "./store";
new Vue({
  render: (h) => h(App), //将App组件放入容器中
  // 配置store
  store,
  //....
}).$mount("#app"); //绑定模板
  1. 运行,报错
    意思是要在创建store实例之前use(Vuex)
    在这里插入图片描述
    main.js中 我们import引入store
import Vuex from "vuex";
// 引入store
import store from "./store";
// ...
Vue.use(Vuex); //使用vuex

引入会将这个引入代码执行一遍,将暴露的进行引入
执行了store/index.js就会创建store实例
那这么写呢?

import Vuex from "vuex";
// ...
Vue.use(Vuex); //使用vuex
// 引入store
import store from "./store";

不行,js会将所有import提升到头部执行
真正的解决方法:在store/index.js中创建实例前添加Vue.use(Vuex); 记得要引入Vue
此时完整的

// /src/store/index.js
// 该文件用于创建Vuex中最为核心的store

// 引入vuex
import Vuex from "vuex";
//引入Vue
import Vue from "vue";

// 准备actions 用于响应组件中的动作
const actions = {};

// 准备mutations 用于操作数据(状态)
const mutations = {};

// 准备state 用于存储数据
const state = {};

Vue.use(Vuex); //使用vuex

// 创建并暴露store
export default new Vuex.Store({
  actions,
  mutations,
  state,
});

// 暴露store
// export default store; //改为简写

至此完毕

案例

需求如下,先实现+按钮,其他同理
在这里插入图片描述

//Count.vue
// 加号按钮回调
increment() {
  //   this.sum += this.num; //原始写法
  // 通过store调用dispatch 传入事件名称和参数
  this.$store.dispatch("add", this.num);
},

store中也要准备好方法和数据

// /store/index.js
// 准备actions 用于响应组件中的动作
const actions = {
  /**
   * @param {*} context 上下文 简短版的store
   * @param {*} value 传递的参数
   */
  add(context, value) {
    context.commit("ADD", value); //一般将mutations的方法全大写 进行区分
  },
};

// 准备mutations 用于操作数据(状态)
const mutations = {
  /**
   * @param {*} state 存储数据的state
   * @param {*} value 传递的参数
   */
  ADD(state, value) {
    state.sum += value;
  },
};

// 准备state 用于存储数据
const state = {
  sum: 0,
};

获取数据

<!--Count.vue-->
<h2>当前求和为:{{ $store.state.sum }}</h2>

其他是不是会了
再说两句
其中“当前求和为奇数时加”需求的业务逻辑可以写在actions中

addOdd(context, value) {
  if (context.state.sum % 2) {
    context.commit("ADD", value);
  }
},

还有没有业务逻辑的如+可以直接调用this.$store.commit('ADD',this.num)
还有~ 如果actions的方法里需要处理的逻辑很多,可以再次调用context.dispatch()触发另一个actions中的函数
还有~如果直接在actions函数中操作state数据,也能奏效但是开发者工具不认了捕获不到了

Vuex的开发者工具使用

因为vuex也是vue的开发团队所打造的所以直接使用之前的vue插件就可以
在这里插入图片描述

getters配置项

在创建store实例传入getters配置项

//....
// 准备getters 用于将state中的数据进行加工
const getters = {
  formatSum(state) {
    return state.sum * 10;
  },
};

Vue.use(Vuex); //使用vuex

// 创建并暴露store
export default new Vuex.Store({
  actions,
  mutations,
  state,
  getters,
});

使用

<h4>当前求和放大10倍为:{{ $store.getters.formatSum }}</h4>

类似vm中data和computed关系

mapState与mapGetters

之前的案例,使用store的数据

<h2>当前求和为:{{ $store.state.sum }}</h2>
<h4>当前求和放大10倍为:{{ $store.getters.formatSum }}</h4>

结果没有问题,但是风格指南中说道,模板表达式应该尽量精简
所以能不能直接用{{sum}}{{formatSum}}
这里vuex就为我们提供了专属的方法
引入

import { mapState, mapGetters } from "vuex";

获取数据
借助mapState和mapGetters生成计算属性,从中读取数据

  • 方式一:对象写法

先写到mounted函数中输出看看
参数中的key是希望使用时的属性名,value是store中定义的属性名

const x = mapState({ sum: "sum" });
const y = mapGetters({ formatSum: "formatSum" });
console.log(x);
console.log(y);

看控制台
在这里插入图片描述
是对象包裹的方法,方法返回的就是我们需要的数据了
将这些方法直接放到我们的computed中,那不就能直接取用了么
这里用了es6语法,将对象内容拆分出来放到另一个对象里

computed: {
  ...mapState({ sum: "sum" }),
  ...mapGetters({ formatSum: "formatSum" }),
},
  • 方式二:数组写法

当取用的数据不用变换属性名,就可以使用这种简写形式

computed: {
  ...mapState(["sum" ]),
  ...mapGetters(["formatSum"]),
},

使用
就可以直接使用了

<h2>当前求和为:{{ sum }}</h2>
<h4>当前求和放大10倍为:{{ formatSum }}</h4>

注意
调试工具中,使用mapState或mapGetters生成的计算属性,并不会隶属于computed,而是区分出来属于vuexBindings
在这里插入图片描述

mapActions和mapMutations

类似上面的,就是方便调用actions和mutations中的方法

import { mapActions, mapMutations } from "vuex";
methods: {
    ...mapMutations({ increment: "ADD" }),
    // 等同
    // increment() {
    //   this.$store.commit("ADD", this.num);
    // },
    ...mapActions({ incrementOdd: "addOdd" }),
    // 等同
    // incrementOdd() {
    //   this.$store.dispatch("add", this.num);
    // },
}

使用时注意要传递参数

<button @click="increment(num)">+</button>
<button @click="incrementOdd(num)">当前求和为奇数时加</button>

同样,也有传递数组的写法

vuex模块化+namespace

如果我们继续按原来方法开发,最后actions或mutations中的方法会很多且杂乱
所以要分类

// store.js
const countOptions = {
  namespaced: true, //默认false 为true后就可以通过mapState等获取到模块内数据
  // 准备actions 用于响应组件中的动作
  actions: {
    //...
  },

  // 准备mutations 用于操作数据(状态)
  mutations: {
    //...
  },

  // 准备state 用于存储数据
  state: {
    //...
  },

  // 准备getters 用于将state中的数据进行加工
  getters: {
    //...
  },
};

export default new Vuex.Store({
  // actions,
  // mutations,
  // state,
  // getters,
  // 模块化编码
  modules: {
    countAbout: countOptions,
  },
});

使用时,要在原始参数前加一个模块名称

...mapState("countAbout", { sum: "sum" }),
...mapMutations("countAbout", { increment: "ADD" }),

如果是直接用store调用,也要加上模块名

this.$store.state.countAbout.sum;
this.$store.getters["countAbout/formatSum"].sum;
this.$store.commit("countAbout/ADD", this.num)

需要注意的是state和getters的索引方式是不一样的
可见下图this.$store输出
在这里插入图片描述
在优化就是将模块分到另一个js文件并暴露
在index.js中import
这样更精简

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

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

相关文章

黄金t+d与黄金期货交易的区别

在金融投资领域中&#xff0c;黄金是一种重要的避险工具和财富保值增值手段。对于投资者来说&#xff0c;了解并熟悉不同的黄金交易方式是至关重要的。其中&#xff0c;黄金TD和黄金期货交易是两种常见的黄金交易形式。那么&#xff0c;它们之间具体有哪些区别呢&#xff1f; 了…

WebGL中开发VR(虚拟现实)应用

WebGL&#xff08;Web Graphics Library&#xff09;是一种用于在浏览器中渲染交互式3D和2D图形的JavaScript API。要在WebGL中开发VR&#xff08;虚拟现实&#xff09;应用程序&#xff0c;您可以遵循以下一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&a…

OpenJDK 和 OracleJDK 哪个jdk更好更稳定,正式项目用哪个呢?关注者

OpenJDK 和 OracleJDK&#xff1a;哪个JDK更好更稳定&#xff0c;正式项目应该使用哪个呢&#xff1f;我会从&#xff0c;从开源性质、更新和支持、功能差异等方面进行比较&#xff0c;如何选择&#xff0c;哪个jdk更好更稳定&#xff0c;正式项目用哪个呢&#xff0c;进行比较…

select子句简单查询

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 目录 数据查询 起别名 连接 ​编辑 去重 ​编辑 另外补充几个不常用的命令 如果要进行查询,那么需要使用数据操纵语言&#xff08;Data Manipulation Language&#xff0c;DML&am…

yum仓库详解(命令+搭建)

目录 一、初步了解yum 1、yum简介 2、yum实现过程 二、yum配置文件及命令 1、 yum配置文件 1.1 主配置文件 1.2 仓库设置文件 1.3 日志文件 2、yum命令详解 三、搭建仓库的方法 1、搭建本地yum仓库 2、搭建阿里云仓库&#xff08;http方式外网环境&#xff09; 3、f…

搜索经典题——填充 9*9矩阵

题目&#xff1a;给定一个九行九列矩阵&#xff0c;填充矩阵元素&#xff0c;要求&#xff1a; 1、每一行每一列&#xff0c;每个小九宫格&#xff08;图片画粗的地方就是&#xff09;不能包含相同元素 2、每一行&#xff0c;每一列&#xff0c;每个小九宫格均会完整出现1-9的数…

pycharm学生认证免费使用专业版

进入pycharm官网Monthly and yearly plans with JetBrains Toolboxhttps://www.jetbrains.com/store/?fromMenu#discounts ​​​ 按照要求填写&#xff0c;但是如果遇到这个提示&#xff0c;恭喜你&#xff0c;你的学校获得了美国商务部认证。 ​ 遇到这个不要慌&#…

Spring Boot - Application Events 的发布顺序_ApplicationStartingEvent

文章目录 概述Code源码分析 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#xff0c;使得应用程序中的不同组件可以独立地改变和复用逻辑&#xff0c;而无需直接进行通信。 …

残差网络 ResNet

目录 1.1 ResNet 2.代码实现 1.1 ResNet 如上图函数的大小代表函数的复杂程度&#xff0c;星星代表最优解&#xff0c;可见加了更多层之后的预测比小模型的预测离真实最优解更远了&#xff0c; ResNet做的事情就是使得模型加深一定会使效果变好而不是变差。 2.代码实现 impo…

java版微信小程序商城 免 费 搭 建 java版直播商城平台规划及常见的营销模式有哪些?电商源码/小程序/三级分销

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

用通俗易懂的方式讲解:使用 LlamaIndex 和 Eleasticsearch 进行大模型 RAG 检索增强生成

检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;是一种结合了检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的技术&#xff0c;它有效地解决了大语言模型&#xff08;LLM&#xff09;的一些问题&#x…

车载音频EMI的产生及典型音频功放AW836XX的解决方案

之前针对 eCall的文章中有提到D类音频功放需要关注EMI问题&#xff08;点击文章回看《车载eCall系统音频应用解决方案》&#xff09;&#xff0c;在此展开此问题并寻求解决方案。 1. EMI定义与分类 电磁干扰&#xff08;Electromagnetic Interference&#xff0c;EMI&#xff…

企业为什么要选择软件定制开发?

引言&#xff1a;定制开发的兴起 在商业竞争日益激烈的今天&#xff0c;企业领导者们面临着一个重要的抉择&#xff1a;是选择通用软件解决方案&#xff0c;还是探寻更贴合企业需求的定制开发路径&#xff1f; 在企业决策软件解决方案时&#xff0c;通用软件和软件定制开发各…

IOS-高德地图连续定位-Swift

使用定位功能需要需要接入高德地图定位Api&#xff1a; pod AMapLocation配置Info 在info中新建一个名为Privacy - Location Temporary Usage Description Dictionary的字典&#xff0c;然后在这个字典下新建Privacy - Location When In Use Usage Description、Privacy - Lo…

应用案例 | Softing工业物联网连接解决方案助力汽车零部件供应商实现智能制造升级

随着业务的扩展和技术的进步&#xff0c;某国际先进汽车零部件供应商在其工业物联网的升级方案中使用了Softing的dataFEED OPC Suite——通过MQTT协议将现场控制器和数控系统的数据上传到其物联网云平台&#xff0c;从而实现了设备状态的远程监控&#xff0c;不仅能够提前发现设…

drools开源规则引擎介绍以及在Centos上的具体部署方案,让你的业务规则能够独立于应用程序本身

Drools是一个基于Java的开源规则引擎&#xff0c;用于处理业务规则和复杂事件处理。它提供了一个声明性的规则语言&#xff0c;允许开发人员定义业务规则&#xff0c;并通过引擎执行这些规则。以下是Drools规则引擎的简介和一些应用场景描述。 Drools规则引擎简介 规则引擎概述…

消费增值模式:引领消费者与平台共创双赢的新篇章

在数字化时代&#xff0c;消费模式正在发生深刻变革。消费者不再满足于单纯的购物行为&#xff0c;而是寻求更加个性化和有价值的消费体验。而平台也面临着如何吸引和留住消费者的挑战。消费增值模式作为一种新型的商业模式&#xff0c;正逐渐成为解决这一问题的关键。 消费增…

钢岚芯片:如何获取及鉴别真伪?

在不断变革的高科技时代&#xff0c;芯片技术作为科技前沿的重要标志&#xff0c;已成为衡量一个国家和地区科技实力的重要指标。钢岚芯片&#xff0c;这一神秘而又先进的科技产物&#xff0c;作为当前芯片科技研究的巅峰之作&#xff0c;吸引了无数科技爱好者和业界精英的追捧…

ROS第 6 课 编写简单的订阅器 Subscriber

文章目录 第 6 课 编写简单的订阅器 Subscriber1. 编写订阅者节点2. 测试发布者和订阅者 第 6 课 编写简单的订阅器 Subscriber 订阅器是基于编辑了发布器的基础上创建的&#xff0c;只有发布了消息&#xff0c;才有可能订阅。若未编辑发布器&#xff0c;可前往"ROS第5课 …

SQL注入漏洞的检测及防御,零基础入门到精通

SQL注入&#xff08;SQL Injection&#xff09;是一种广泛存在于Web应用程序中的严重安全漏洞&#xff0c;它允许攻击者在不得到授权的情况下访问、修改或删除数据库中的数据。这是一种常见的攻击方式&#xff0c;因此数据库开发者、Web开发者和安全专业人员需要了解它&#xf…