系统性学习vue-vuex

系统性学习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
这样更精简

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GIS复试Tips(特别是南师大)

注&#xff1a;本文仅个人观点&#xff0c;仅供参考 在这提前㊗️24年考南师大GISer成功上岸&#xff01; 当然&#xff0c;考研是个考试&#xff0c;总有人顺利上岸&#xff0c;稳上岸或逆袭上岸&#xff0c;但可能也有人被刷&#xff0c;这是常态。 所以&#xff0c;㊗️你…

RHCE作业

网站需求&#xff1a; 题目一&#xff1a; 基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! 配置&#xff1a; 1&#xff0c;关闭防护墙&#xff0c;关闭selinux [rootnodel ~]# systemctl stop firewalld [rootnodel ~]# se…

TEE2024大湾区进出口贸易博览会

TEE2024大湾区进出口贸易博览会 INTE 2024RNATIONAL TRADE E-COMMERCE EXPO 时间&#xff1a;2024年08月11--13日 地点&#xff1a;深圳福田会展中心 联合主办&#xff1a; 深圳市电子商务协会 深圳市跨境电子商务行业发展促进会 广东进出口商会 广东省国牌出海电子商务…

Qt/QML编程之路:OpenGL的示例(39)

Qt编程之后,会发现有版本问题,有时候一个示例不同的版本下可能会跑不同,有些Qt5跑不同Qt6已经完善,可以跑通。 我就看到有个关于OpenGL的示例: 这个示例是演示怎么基于OpenGL编程的,但是调试时却发现glViewXXX等gl打头的函数说找不到reference,或者什么link不上之类的错…

ffmpeg 常用命令行详解

概述 ffmpeg 是一个命令行音视频后期处理软件 1. 裁剪命令 参数说明 -i 文件&#xff0c;orgin.mp3 为待处理源文件-ss 裁剪时间&#xff0c;后跟裁剪开始时间&#xff0c;或者开始的秒数-t 裁剪时间output.mp3 为处理结果文件 ffmpeg -i organ.mp3 -ss 00:00:xx -t 120 o…

轻松一刻 浅休息下哈

yum -y install epel-release yum install -y linux_logo cal 此命令以日历表的方式显示日期 curl http://wttr.in 此网站进行在屏幕上面显示天气情况

mybatis-plus批量保存异常及效率优化

最近基于自己公司内部服务维护&#xff0c;发现其中调度中心近期出现不少错误日志&#xff0c;但是该任务却是正常执行&#xff0c;生成的报表数据也是正常的&#xff0c;所以很多天没有发现问题 这就匪夷所思了&#xff0c; 经仔细排查发现&#xff0c;是触发了feign超时hyst…

Js-WebAPIs-事件(二)

事件监听&#xff08;绑定&#xff09; 什么是事件&#xff1f; 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 什么是事件监听&#xff1f; 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响…

1.19(232.用栈实现队列)

1.19(232.用栈实现队列) 在push数据的时候&#xff0c;只要数据放进输入栈就好&#xff0c;但在pop的时候&#xff0c;操作就复杂一些&#xff0c;输出栈如果为空&#xff0c;就把进栈数据全部导入进来&#xff08;注意是全部导入&#xff09;&#xff0c;再从出栈弹出数据&a…

牛客月赛86+cf(edu)好题

思路&#xff1a;前缀和双指针 代码&#xff1a; #include <bits/stdc.h> using namespace std; using i64 int64_t; int main() {cin.tie(nullptr)->sync_with_stdio(false);cout << fixed << setprecision(20);int t 1;for (int ti 0; ti < t; …

C语言之通过指针操作字符串

下面我们来学习通过指针来灵活操作字符串的方法 判断字符串的长度 我们用对指针的遍历来实现判断字符串的长度 #include <stdio.h> int str_length(const char*s) {int len 0;while(*s)len;return len; } int main() {char str[128];printf("请输入字符&#xff…

猫咪增肥发腮吃什么?适合猫咪增肥发腮的猫罐头推荐

冬天开始了&#xff0c;北方的小猫咪们有暖气还好过一些&#xff0c;南方的猫咪就只能依靠自己的抵抗力来过冬了。如果不囤点肉肉&#xff0c;怕冷的小猫咪要怎么过冬啊&#xff1f;有些猫咪无论怎么吃也吃不胖&#xff0c;真的很让铲屎官烦恼。 作为一个开宠物店6年了的铲屎官…

温故而知新:直方图均衡、直方图匹配的再次理解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 引言 数字图像处理的知识在2年前学过一阵子&#xff0c;但没学完&#xff0c;后来基于各种原因就停滞了整整2年没有学习了&#xff0c;现在准备重新开始&#xff0c;为此把以前学习写的总结博文翻出来重新进…

初识VUE

文章目录 Vue是什么1.创建一个Vue实例2.插值表达式{{ }}3.Vue的响应式特性4.开发者工具的安装 Vue是什么 概念&#xff1a;Vue是一个用于构建用户界面的渐进式框架 ①构建用户界面&#xff1a;基于数据渲染出用户看到的界面 ②渐进式&#xff1a;循序渐进 ③ 框架&#xff1…

【每日一题】2809. 使数组和小于等于 x 的最少时间-2024.1.19

题目&#xff1a; 2809. 使数组和小于等于 x 的最少时间 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒&#xff0c;对于所有下标 0 < i < nums1.length &#xff0c;nums1[i] 的值都增加 nums2[i] 。操作 完成后 &#xff0c;你可以进行如下操作&…

什么是区块链?

区块链 区块链 &#xff08;英语&#xff1a;blockchain&#xff09;是借由 密码学 与 共识机制 等技术建立&#xff0c;存储数据的 保证不可篡改和不可伪造的 分布式技术。 什么是区块 区块 就是将一批数据打包在一起&#xff0c;并且给打包出来的区块编号。第一个区块的编…

北斗导航 | 基于恒定虚警率算法的接收机自主完好性监测(附Matlab代码)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 基于恒定虚警率算法的接收机自主完好性监测 输入输出外部引用代码参考…

基于springboot+vue的旅游网站系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Java Springboot SSE如何判断客户端能否正常接收消息

目录 背景解决方案思路代码代码解释 Java反射知识点补充 背景 当新建一个 emitter 对象的时候, 它的默认超时时间是 30s. SseEmitter emitter new SseEmitter(); 但是很多情况下, 默认30s的时间太短, 需要把 emitter 对象的超时时间设置成不超时, 也就是永久有效. private …

Proxifier海外動態IP代理工具使用教程

Proxifier是一款多平臺代理客戶端&#xff0c;能讓不支持代理伺服器的程式正常運行。它支持各種操作系統和代理協議&#xff0c;並允許自定義端口和應用程式代理設置。用戶可以將其與代理伺服器集成&#xff0c;從而最大程度釋放性能效果。 本文將對其進行全面的概述&#xff…