系统性学习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组件放入容器中// 配置storestore,//....
}).$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.hqwc.cn/news/412839.html

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

相关文章

使用Sqoop的并行处理:扩展数据传输

使用Sqoop的并行处理是在大数据环境中高效传输数据的关键。它可以显著减少数据传输的时间&#xff0c;并充分利用集群资源。本文将深入探讨Sqoop的并行处理能力&#xff0c;提供详细的示例代码&#xff0c;以帮助大家更全面地了解和应用这一技术。 Sqoop的并行处理 在开始介绍…

Python用selenium实现自动登录和下单的项目实战

前言 学python对selenium应该不陌生吧 Selenium 是最广泛使用的开源 Web UI&#xff08;用户界面&#xff09;自动化测试套件之一。Selenium 支持的语言包括C#&#xff0c;Java&#xff0c;Perl&#xff0c;PHP&#xff0c;Python 和 Ruby。目前&#xff0c;Selenium Web 驱动…

【音视频原理】图像相关概念 ② ( 帧率 | 常见帧率标准 | 码率 | 码率单位 )

文章目录 一、帧率1、帧率简介2、常见帧率标准3、帧率 刷新率 二、码率1、码率简介2、码率单位 一、帧率 1、帧率简介 帧率 Frame Rate , 帧 指的是 是 画面帧 , 帧率 是 画面帧 的 速率 ; 帧率 的 单位是 FPS , Frames Per Second , 是 每秒钟 的 画面帧 个数 ; 帧率 是 动画…

头像空白问题

当用户没有设置头像时&#xff0c;我们可以使用用户名第一个字来当头像 主要涉及一个截取&#xff0c;截取字符串第一个字 变量名.charAt(0) 如果变量名为null或者undefine 那么就会报错 使用可选链操作符 &#xff1f; 当前面的值为nul或undefine时&#xff0c;就不会执行…

011:vue结合css动画animation实现下雪效果

文章目录 1. 实现效果2. 编写一个下雪效果组件 VabSnow.vue3. 页面使用4. 注意点 1. 实现效果 GIF录屏文件太卡有点卡&#xff0c;实际是很丝滑的 2. 编写一个下雪效果组件 VabSnow.vue 在 src 下新建 components 文件&#xff0c;创建VabSnow.vue组件文件 <template>…

第三届iEnglish全国ETP大赛展现教育游戏新趋势

随着社会步入数字化纪元,游戏作为信息交流和传播的重要载体,在教育领域的潜能日益凸显。特别是寓教于乐的“教育游戏”学习方式让更多家长和孩子体验到“玩中学,学中玩”的乐趣,在教育领域的潜能也日益凸显。 本周五(1月19日)晚上7点,国内首个教育游戏赛事、以“玩转英语,用iE…

在国外外出结账时应该怎样表述,柯桥生活英语学习

大家平时外出就餐时&#xff0c;尤其是那种外国餐厅&#xff0c;结账时都怎么表达&#xff1f;可能大家会脱口而出“how much”..... 如果你真的这么说&#xff0c;那可就“踩雷”了。因为&#xff0c;在歪果仁的文化中&#xff0c;用how引导的疑问句都或多或少涉及隐私问题&am…

触发器简述

数据库是与表有关的数据库对象&#xff0c;在执行insert&#xff0c;delete&#xff0c;update之前或之后&#xff0c;触发并执行触发器中定义的sql语句集合&#xff0c;来保证数据的完整性等操作,目前只支持行级触发器&#xff0c;而不支持语句触发器。 触发器的语法&#xff…

线程同步--生产者消费者模型

文章目录 一.条件变量pthread线程库提供的条件变量操作 二.生产者消费者模型生产者消费者模型的高效性基于环形队列实现生产者消费者模型中的数据容器 一.条件变量 条件变量是线程间共享的全局变量,线程间可以通过条件变量进行同步控制条件变量的使用必须依赖于互斥锁以确保线…

Pure-admin框架 Pure-table中获取所选中的内容的信息

最近在尝试使用Pure-admin框架来进行开发&#xff0c;正好遇到了多选表格需要获取选中项的id的情况&#xff0c;因为平台介绍说是二次封装 element-plus 的 Table &#xff0c;直接拿el-table的方法来试 在table上设置属性ref"multipleTableRef" let idArr [];mult…

centos7 arm服务器编译升级安装动态库libstdc++.so.6,解决GLIBC和CXXABI版本低的问题

前言 由于centos7内置的libstdc.so.6版本太低&#xff0c;导致安装第三方包的时候&#xff0c;会报“CXXABI_1.3.8”不存在等问题。 自带的打印如下&#xff1a; strings /usr/lib64/libstdc.so.6 | grep GLIBC strings /usr/lib64/libstdc.so.6 | grep CXXABI 如图 升级 注…

Pytorch实战——3、数据加载与处理

&#x1f345; 写在前面 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;这里是hyk写算法了吗&#xff0c;一枚致力于学习算法和人工智能领域的小菜鸟。 &#x1f50e;个人主页&#xff1a;主页链接&#xff08;欢迎各位大佬光临指导&#xff09; ⭐️近…