系统性学习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.mzph.cn/news/629247.shtml

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

相关文章

性能优化-一文宏观理解OpenCL

本文主要对OpenCL做一个整体的介绍、包括环境搭建、第一个OpenCL程序、架构、优化策略&#xff0c;希望对读者有所收获。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…

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

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

react、Vue打包直接运行index.html不空白方法

react vue 在根目录下创建 vue.config.js 文件&#xff0c;写入 module.exports {publicPath: ./, }

C++中map按照从大到小的顺序存储元素

map按照从大到小存储元素 引言map的大致介绍概述 场景误区示例示例代码&#xff08;方法一&#xff09;运行结果示例代码二&#xff08;方法二&#xff09;运行结果 引言 在对map的使用中&#xff0c;由于对业务的需要&#xff0c;希望map中存储元素能够按照键的大小从大到小的…

若依修改侧边栏

引用&#xff1a;https://blog.csdn.net/Sabrina_cc/article/details/125871591 子菜单选中后&#xff0c;文字和背景改变&#xff1a; .el-submenu__title i{color: #e8e8e8 !important;} #app .sidebar-container .theme-dark .nest-menu .el-submenu .is-active > .el-su…

C++设计模式(李建忠)笔记1

C设计模式&#xff08;李建忠&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考链接 Youtube: C设计模式 Gtihub源码与PPT&#xff1a;https://github.com/ZachL1/Bilibili-plus 豆瓣: 设计模式–可复用面向对象软件的基础 文章目录 C设计模…

探索单元测试和 E2E 测试:提升软件质量的关键步骤(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

修复系统和修复常见安卓问题的 10 个应用

我们都喜欢我们的 Android 智能手机&#xff0c;对吧&#xff1f;有很多值得喜欢的地方。 Android 手机易于使用且通常无故障&#xff0c;但毕竟它只是一台机器&#xff0c;偶尔也会出现问题。面对现实吧&#xff0c;我们的智能手机并不完美。用户经常遇到的一些常见 Android …

select子句简单查询

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

React Store及store持久化的使用

1.安装 npm insatll react-redux npm install reduxjs/toolkit npm install redux-persist2. 使用React Toolkit创建counterStore并配置持久化 store/modules/counterStore.ts&#xff1a; import { createSlice } from reduxjs/toolkit// 定义状态类型 interface Action {…

linux-部署Samba文件共享服务

linux-部署Samba文件共享服务 1、使用命令安装samba服务和samba客户端 dnf install samba samba-client # 或者 yum install samba samba-client2、配置文件的设置(可提前备份smb.conf) vim /etc/samba/smb.conf [global]workgroup SAMBAsecurity userpassdb backend tdbsam…

在EasyBoss ERP上查Shopee产品表现,数据更全、处理更高效!

在运营Shopee本土店的过程中&#xff0c;卖家需要及时了解产品数据来进行产品的调整和优化。不过&#xff0c;调整和优化需要基于数据&#xff0c;而非仅凭直觉。 但是&#xff0c;如何全面地查看产品表现数据、快速处理表现不佳的产品&#xff0c;成为诸多卖家头痛的问题&…

java的运行机制以及整体流程

背景&#xff1a;学习了这么多年的Java&#xff0c;把自己的理解写成JVM系列&#xff0c;以便于后面的温习&#xff0c;以及帮助更多的java开发人员。 开篇先梳理下&#xff0c;我们之前写的第一个Hello World&#xff01;&#xff0c;当我们运行出来后&#xff0c;在控制台打印…

史上最全的数据科学与艺术

1.背景介绍 数据分析是一种将数据转化为价值的艺术和科学。它涉及到大量的数学、统计、编程、数据库、机器学习等多个领域的知识。数据分析的目的是从数据中提取有用的信息&#xff0c;以便做出明智的决策。 数据分析的艺术体现在数据分析师需要具备丰富的经验和洞察力&#…

『C++成长记』内存管理

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、C/C内存分布 二、内存管理方式 &#x1f4d2;2.1C语言内存管理方式 &#x…

【OpenAI】自定义GPTs应用(GPT助手应用)及外部API接口请求

11月10日&#xff0c;OpenAI正式宣布向所有ChatGPT Plus用户开放GPTs功能 简而言之&#xff1a;GPT应用市场(简称GPTs, 全称GPT Store) Ps&#xff1a; 上图为首次进入时的页面&#xff0c;第一部分是自己创建的GPTs应用&#xff0c;下面是公开可以使用的GPTs应用 一、创建GPTs…

振弦采集仪在桥梁结构健康监测中的应用探索

振弦采集仪在桥梁结构健康监测中的应用探索 振弦采集仪是一种用于测量结构振动特性的仪器&#xff0c;通过采集结构上的振弦信号&#xff0c;可以评估结构的健康状况。在桥梁结构健康监测中&#xff0c;振弦采集仪可以发挥重要的作用。 首先&#xff0c;振弦采集仪能够实时监测…

上传文件:413 Request Entity Too Large Maximum upload size exceeded 解决方案

文章目录 前言一、原因分析二、解决方案1.nginx配置文件2.application.yml配置文件 总结 前言 在上传文件时&#xff0c;如果没有做一些配置的话&#xff0c;会导致上传失败&#xff1a;413 Request Entity Too Large 或者 Maximum upload size exceeded。 提示&#xff1a;以…

geemap学习笔记049:下载Landsat数据时遇到的一个问题

前言 最近在下载Landsat 8 地面反射率数据&#xff08;Surface Reflectance&#xff09;时&#xff0c;遇到了一个问题&#xff0c;无论是使用geemap.ee_export_image_to_drive() 函数还是geemap.download_ee_image() 函数下载的数据&#xff0c;易康都打不开&#xff0c;显示…

【Java】面向对象 OOP

文章目录 面向对象OOP概述一、对象内存相关二、类的成员之一&#xff1a;成员变量&#xff08;Field&#xff09;2.1 如何声明成员变量2.2 成员变量 与 局部变量 三、类的成员之一&#xff1a;成员方法&#xff08;Method&#xff09;3.1 方法调用内存分析3.2 方法的重载3.3 可…