vuex的学习

vuex

vuex是个插件,用于多个组件操作共享变量

引入:数字操作案例
在这里插入图片描述

基于组件自定义事件而实现的操作数字案例如下:

App.vue

<template><div id="app"><input class="num_input" type="text" v-model.number="sum"><!-- 下面是两个按钮 --><AddOne :sum="sum" @MyAddOne="MyAddOne"/><MultiTen :sum="sum" @MyMultiTen="MyMultiTen" /></div>
</template><script>
import AddOne from './components/AddOne.vue';
import MultiTen from './components/MultiTen.vue';export default {name: 'App',components: {AddOne,MultiTen},data() {return {sum: 0}},methods: {MyAddOne(num) {this.sum = num;},MyMultiTen(num) {this.sum = num;}}
}
</script><style>#app {text-align: center;margin: 0 auto;}* {margin-bottom: 1px;}.num_input {text-align: center;}
</style>

AddOne.vue

    <div><button @click="addOne">点我加1</button></div>
</template><script>export default{		name: '',props: [ 'sum', 'MyAddOne'],data(){return{}},methods: {addOne() {this.$emit('MyAddOne', this.sum + 1);}},}
</script><style></style>

MultiTen.vue

    <div><button @click="mutiTen">点我乘以10</button></div>
</template><script>export default{		name: '',props: [ 'sum'],data(){return{}},methods: {mutiTen() {this.$emit('MyMultiTen', this.sum * 10);}},}
</script>
<style>
</style>

可以看出,对于每个子组件去操作父组件的数据,都需要子组件有触发函数$emit,父组件需要有回调函数,十分麻烦,而vuex对共享变量的管理就显得清晰且简单得多,下面简单介绍一下vuex。

6.1 vuex工作原理

工作原理图(下图来自vuex官网

在这里插入图片描述

state:保存共享的变量

actions:进行一些业务的逻辑,是可选的

mutations:唯一可以操作State中共享变量的地方

getter:state中共享变量的计算属性

举个例子:

Vue Components中通过 this.$store 【–> 调用dispatch(“aa”, 2) --> 触发actions里的 aa 函数 】–> commit(“aa”, 2) -->触发 mutations 的"AA"函数从而去操作state的数据 --> 改变state --> 重新渲染模板

【】中为actions的操作,是可选的

actions中的方法会可以显式传入参数 context 上下文

mutations中的方法需要传入参数 state, 第二个参数payload为可选(如果你想控制你变化数据的大小)

6.2 vuex的简单使用

基于上述的数字操作案例,用vuex实现

6.2.1 导入

vue2的项目应该使用 vuex3版本

npm i vuex@3

vue3的项目应该使用vuex4版本

npm i vuex@4

6.2.2 创建store文件夹及index.js

/store/index.js

import Vue from 'vue'
Vue.use(Vuex)
const store = new Vuex.Store({state: {sum: 1},mutations: {ADD(state, payload) {state.sum += payload;},MULTI(state, payload) {state.sum *= payload;}}});export default store

6.2.3 注册使用

main.js

import App from './App.vue'
import store from './store'new Vue({render: h => h(App),store
}).$mount('#app')

6.2.4 其他

此时,在组件中可以使用 this.$store

App.vue

  <div id="app"><!-- 通过this.$store.state.XXX 可以得到共享变量XXX --><input class="num_input" type="text" v-model.number="this.$store.state.sum"><!-- 下面是两个按钮 --><AddOne /><MultiTen /></div>
</template><script>
import AddOne from './components/AddOne.vue';
import MultiTen from './components/MultiTen.vue';export default {name: 'App',components: {AddOne,MultiTen},
}
</script>

AddOne.vue

    <div><button @click="addOne">点我加1</button></div>
</template><script>export default{		name:'',methods: {addOne() {this.$store.commit("ADD", 1)}},}
</script>

MultiTen.vue

    <div><button @click="mutiTen">点我乘以10</button></div>
</template><script>export default{		name: '',methods: {mutiTen() {this.$store.commit('MULTI', 10)}},}
</script>

6.3 mapState

mapState可以帮我们在 this.$store.state 定义的共享变量作为计算属性自动生成

6.3.1 使用

导入

import {mapState} from 'vuex'

App.vue

import MultiTen from './components/MultiTen.vue';
import { mapState } from 'vuex';export default {name: 'App',components: {AddOne,MultiTen},computed: {//这下面两个是等价的,都将 sum 作为计算属性sum显示到页面上//1.// sum() {//   return this.$store.state.sum;// },//2.//我们直接采用 mapState的数组写法// ...mapState(['sum'])}
}

如果要使用mapState、mapGettters、mapMutations、mapActions ,要求在 this.$store 里定义的东西的名字和在组件中使用的 mapXXX(‘[Name]’) 中的Name名字相同

mapGettters、mapMutations、mapActions 的使用基本同理,但需要在调用的地方传好参数 ,不太方便

举个例子:

/store/index.js

import Vue from 'vue'
Vue.use(Vuex)
const store = new Vuex.Store({state: {sum: 1},mutations: {ADD(state, payload) {state.sum += payload}}});export default store

App.vue

  <div id="app"><input class="num_input" type="text" v-model.number="sum"><!-- 需要一开始就定义好参数,所以更适合没参数的方法 --><button @click="ADD(1)">点我加1</button></div>
</template><script>
import { mapState, mapMutations } from 'vuex';export default {name: 'App',computed: {// 需要和 this.$store.state中的sum变量同名...mapState(['sum'])},methods: {// 需要和 this.$store.mutations中的ADD方法同名...mapMutations(['ADD'])}
}
</script>

6.4 Vuex 分模块配置

const a = {namespaced: true //默认是false, 开启方便使用mapXXXactions:{},//....
}
const b = {//...
}export default new Vue.store({modules:{a : [变量1],b : [变量2]}
})

此时,通过组件的 this.$store.state.[模块名] 去获取state对应的内容

通过组件的 this.$store.getters.[‘模块名/对应内容’]去获取getters中的内容

dispatch 和 commit 通过 this.$store.[commit / dispatch](‘模块名/内容名’)

mapState, mapGetters 写成 …mapXXX('模块名 ', [‘数组内容’],)

mapActions 和 mapMutations 需要写成 …mapXXX(‘模块名’,{xx: xx})

举个例子:
/store/index.js

import Vue from 'vue'
Vue.use(Vuex)const a = {namespaced: true, //默认是false, 开启方便使用mapXXXstate: {s_age: 1}
}
const b = {namespaced: true, //默认是false, 开启方便使用mapXXXstate: {    t_age: 2},mutations: {ADD_ONE_TEACHER(state) {state.t_age++}}
}
const store = new Vuex.Store({modules: {// 冒号前面的是模块名,后面的是const定义的常量名student : a,teacher : b}});export default store

App.vue

  <div id="app"><input class="num_input" type="text" v-model.number="s_age"><input class="num_input" type="text" v-model.number="t_age"><button @click="ADD_ONE_TEACHER(1)">点我加1</button></div>
</template><script>
import { mapState, mapMutations } from 'vuex';export default {name: 'App',computed: {...mapState('teacher', ['t_age']),//以下两种是等效的//1.// s_age() {//   return this.$store.state.student.s_age// },//2....mapState('student', ['s_age']),},methods: {//以下两种是等效的//1. // ADD_ONE_TEACHER(num) {//   this.$store.commit('teacher/ADD_ONE_TEACHER', num)// },//2....mapMutations('teacher', {ADD_ONE_TEACHER: 'ADD_ONE_TEACHER'})}
}
</script>

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

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

相关文章

LeeCode 994. 腐烂的橘子

原题链接994. 腐烂的橘子 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;采用bfs遍历图&#xff0c;将烂橘子加入队列&#xff0c;然后将被烂橘子感染的橘子也加入队列&#xff0c;bfs的具体细节就不多说了&#xff0c;可以自己去搜&#xff0c;很简单&#xff0c;…

560.滑动窗口最大值

滑动窗口最大值 239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 题目大意&#xff0c;返回每个窗口内的最大值。 思路-优先队列 优先队列&#xff08;堆&#xff09;&#xff0c;其中的大根堆可以实时维护一系列元素中的最大值。 每当我们向右移动窗口时&#…

地形沉降测量仪器静力水准仪应用全攻略

在地形监测和地质勘探的领域中&#xff0c;地形沉降测量是一项至关重要的工作。它不仅能够及时揭示地质结构的变化&#xff0c;还能为城市规划和基础工程建设提供宝贵的数据支持。在众多测量工具中&#xff0c;静力水准仪以其高精度、高效率的特点&#xff0c;成为地形沉降测量…

AI绘画生成人物的关键词怎么写?手把手教你学会

AI绘画生成人物的关键词怎么写&#xff1f;随着人工智能技术的不断发展&#xff0c;AI绘画已成为艺术领域的一股新势力。特别是在生成人物绘画方面&#xff0c;AI技术以其独特的优势和无限的可能性&#xff0c;为我们带来了全新的创作体验。下面&#xff0c;本文将分享AI绘画生…

svn怎么新建分支,切换分支

在当前分支下&#xff0c;点svn右键&#xff0c;选择分支/标记 在选择远端地址时&#xff0c;点右边更多选项&#xff0c;打开远端版本库。找到对应的分支上级位置&#xff0c;点击确定 填写新分支名称&#xff0c;我这儿是将分支建在了branches下&#xff0c;分支名称为V1.1 填…

【MLP-BEV(7)】深度的计算。针孔相机和鱼眼相机对于深度depth的采样一个是均匀采样,一个是最大深度均匀采样

文章目录 1.1 问题提出1.1 看看DD3D 的深度是怎么处理的给出代码示例 1.2 我们看看BEVDepth的代码 1.1 问题提出 针孔相机和鱼眼相机的投影模型和畸变模型不一样&#xff0c;如果对鱼眼的模型不太了解可以到我的这篇博客【鱼眼镜头11】Kannala-Brandt模型和Scaramuzza多项式模…

vscode刷LeetCode算法题环境配置

首先&#xff0c;下载nodejs 在vscode中安装LeetCode插件 安装好进行配置 选择leetcode-cn 填上刚才下载node.exe的路径 完成之后重启一下vscode 重启之后登陆LeetCode 完成之后就可以看到题目了 点击 code now 就可以开始刷题了

【Linux】进程优先级 | 环境变量

目录 Ⅰ. 进程优先级&#xff08;Process Priority&#xff09; 1. 什么是进程优先级&#xff1f; 2. 查看系统进程 3. 修改进程优先级 4.优先级调度原理 Ⅱ. 进程的切换&#xff08;Process Switch&#xff09; 1. 竞争与独立 2. 并行与并发 3. 进程抢占 4.实现切换…

鸿蒙期末项目(完结)

两天仅睡3个小时的努力奋斗之下&#xff0c;终于写完了这个无比拉跨的项目&#xff0c;最后一篇博客总体展示一下本项目运行效果兼测试&#xff0c;随后就是答辩被同学乱沙&#xff08;悲 刚打开软件&#xff0c;会看到如下欢迎界面&#xff0c;介绍本app的功能和优点 随后我们…

在线开发、实时交互 | 三维天地低代码开发平台助力提高项目交付速度

1.什么是低代码开发平台? 低代码开发平台基于北京三维天地科技股份有限公司自研原生技术架构研发。三维天地作为国内知名的检验检测信息化领域软件开发服务商,拥有多项自主知识产权及自主研发核心技术,致力于为客户提供信息化整体解决方案及相关软件产品与服务。 三维天地低…

【包邮送书】深度学习与信号处理

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

视觉震撼背后:带宽对渲染农场的重要性

在这个注重视觉体验的时代&#xff0c;无论是电影、电子游戏还是虚拟现实&#xff08;VR&#xff09;&#xff0c;令人印象深刻的视觉效果都依赖于渲染农场的强大能力。而带宽&#xff0c;则是确保这些画面能够迅速且以高清晰度传递给我们的核心要素。 一、核心概念&#xff1a…

1.2章节input输入函数语法使用和示例

在Python中&#xff0c;input() 函数用于从用户获取输入。这个函数会等待用户输入一行文本&#xff0c;然后按回车键&#xff0c;最后将输入的文本作为字符串返回。 一、基本语法 当你运行上面的代码时&#xff0c;它会打印出 "请输入一些文字: "&#xff0c;然后等…

工商银行:低息差下的挣扎

时隔四年&#xff0c;市值再度超越贵州茅台成为A股“股王”。 今天要说的就是“宇宙行”——中国工商银行 虽然茅台的信仰开始崩塌&#xff0c;但各大银行股巨头们今年也不好过。2024年一季度六大行业绩集体受挫&#xff0c;息差普遍收窄超过20个基点。其中&#xff0c;包括工…

航天航空零部件装配制造MES系统解决方案详解

航天航空零部件制造行业是一个技术密集、工艺复杂且对精度和可靠性要求极高的行业。为了提升生产效率、保证产品质量并满足严格的行业标准&#xff0c;越来越多的航天航空零部件制造企业引入了MES系统。本文将详细介绍MES系统在航天航空零部件制造行业的应用方法及其价值。 一…

卸载vmware时2503,2502报错的解决办法

1.背景 windows 卸载vmware时&#xff0c;显示2503报错&#xff0c;无法完全卸载 2. 解决方案 2.1 参考安装报错2502&#xff0c;2503的处理方式 文献&#xff1a;https://blog.csdn.net/zhangvalue/article/details/80309828 2.1 步骤&#xff1a; 2.1.1 cmd 管理员打开…

《2023-2024安服安全技术研究白皮书(正式版)》

2023年5月&#xff0c;我们再次更新了《2022-2023安服安全技术研究白皮书》&#xff0c;这次我们进行了内容丰富&#xff0c;并特别介绍了我们围绕反APT技术栈的一些研究和想法&#xff0c;通过该技术栈的积累扩展了更多的安全能力&#xff0c;包括对攻击生命周期本身的认知、攻…

Arduino - 继电器

Arduino - 继电器 In a previous tutorial, we have learned how to turn on/off an LED. In this tutorial, we are going to learn how to turn on/off some kind of devices that use the high voltage power supply(such as a light bulb, fan, electromagnetic lock, lin…

亚马逊卖家的ERP代理贴牌与独立部署策略

贴牌&#xff0c;就是将亚马逊ERP进行个性化定制&#xff0c;包括更换成自己公司的logo、域名、收款账户&#xff0c;同时支持与自己的物流渠道进行对接&#xff0c;以满足自建仓库的需求。 对于独立部署&#xff0c;这需要有自己的服务器、数据库和存储空间等基础设施。在贴牌…

AI时代的风口,中小企业也不能错过

文&#xff5c;白 鸽 编&#xff5c;周效敬 这些场景&#xff0c;对你来说或许并不陌生&#xff1a; 在医院的大屏上&#xff0c;一个医生模样的数字人在做医疗知识科普&#xff1b;在抖音的直播间里&#xff0c;一个真人模样的数字人在线上直播带货&#xff0c;24小时无休无…