vuex状态管理的使用

一、创建store,单个store的使用

1、

/*** 该文件用于创建vuex中最核心的store*///引入Vuex
import Vuex from 'vuex';
import Vue from "vue";//使用vuex来集中管理状态,必要
//new store的前提是必须要使用Vuex插件
Vue.use(Vuex);//创建actions(本质就是对象) 用于响应组件中的动作
const actions = {//收到上下文对象(包含commit)和dispatch过来的值// increment(context, value){//     context.commit('INCREMENT', value);// },// decrement(context, value){//     context.commit('DECREMENT', value);// },incrementIfOdd(context, value){// console.log(`action中的incrementIfOdd被调用`);// console.log('处理了一些事情');// context.dispatch('demo1', value);if(context.state.sum % 2) {console.log('@')context.commit('INCREMENT',value);// context.state.sum += 1;//这样可以实现但是记住本次对状态的改变开发者工具将无法捕获,因为开发者工具是对mutations对话的}},incrementWait(context, value){setTimeout(() => {context.commit('INCREMENT', value);},500)},// demo1(context, value){//     console.log('处理了一些事情---demo1');//     context.dispatch('demo2', value);// },// demo2(context, value){//     console.log('在action的demo中完成最终的逻辑');//     if(context.state.sum % 2) {//         console.log('@')//         context.commit('INCREMENT',value);//     }// }
}//创建mutations(本质也是对象) 用于修改数据(state)
const mutations = {//收到state和要操作数valueINCREMENT(state, value) {state.sum += value;},DECREMENT(state, value) {state.sum -= value;},
}//准备getters用于加工state,将其共享于各个组件当中
const getters = {bigSum(state){return state.sum * 10;}
}//准备state(数据) 存储数据
//类似于各个组件里的computed(计算属性),只不过它是共享的
const state = {sum: 0,school: 'Wust',subject: 'Computer Science',
}//创建并暴露store
export default new Vuex.Store({actions,mutations,state,getters
});

2、main.js中引入

//引入Vue
import Vue from "vue";
//引入App
import App from './App';
//引入store
import store from './store';//关闭Vue的生产提示
Vue.config.productionTip = false;new Vue({el: '#app',store,render: h => h(App),
});

3、store的使用

<template><div><h1>当前求和为: {{ sum }}</h1><!--让其收集到的数据全是number类型的 number修饰符--><h3>当前求和放大3倍为:{{ bigSum }}</h3><h3>我在{{ school }}, 学习{{ subject }}</h3><select v-model.number="n"><!--让所有的value全部绑定为数字--><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="increment(n)">+</button><button @click="decrement(n)">-</button><button @click="incrementIfOdd(n)">当前求和为奇数再加</button><button @click="incrementWait(n)">等一等再加</button></div>
</template><script>
import { mapState, mapGetters, mapMutations, mapActions} from 'vuex';
export default {//计数组件name: "Count",data(){return {n: 1,// 代表用户在select框开始的时候选择的数字}},computed:{//借助mapState从state中生成计算属性,对象写法// ... mapState({//   sum:'sum',//   school: 'school',//   subject: 'subject'// }),//借助mapState从state中生成计算属性,数组写法(即代表了生成的计算属性名为sum,同时也代表了从state找到sum)... mapState(['sum', 'school', 'subject']),//借助mapGetters从getters中生成计算属性,对象写法// ...mapGetters({ bigSum: 'bigSum' }),//借助mapGetters从getters中生成计算属性,数组写法...mapGetters(['bigSum']),},methods:{// increment(){//   this.$store.commit('INCREMENT', this.n);// },// decrement(){//   this.$store.commit('DECREMENT', this.n);// },//借助mapMutations生成对应方法,方法会调用commit去联系mutations,对象写法...mapMutations({increment: 'INCREMENT',decrement: 'DECREMENT',}),//借助数组写法生成方法,但注意你生成的方法名和mutations里对应的方法名将会一样的// ...mapMutations(['increment', 'decrement']),// incrementOdd(){//   this.$store.dispatch('incrementIfOdd', this.n);// },// incrementWait(){//   this.$store.dispatch('incrementWait', this.n);// }//借助mapMutations生成对应方法,方法会调用dispatch去联系actions,对象写法// ...mapActions({//   incrementIfOdd: 'incrementIfOdd',//   incrementWait: 'incrementWait',// }),...mapActions(['incrementWait', 'incrementIfOdd']), //数组写法,同上},
}
</script><style scoped>button{margin-left: 5px;}
</style>

二、多个store的使用

count.js

//求和功能配置
export default  {namespaced: true,state:{sum: 0,school: 'Wust',subject: 'Computer Science',},getters:{bigSum(state){return state.sum * 10;}},actions:{incrementIfOdd(context, value){// console.log(`action中的incrementIfOdd被调用`);// console.log('处理了一些事情');// context.dispatch('demo1', value);if(context.state.sum % 2) {console.log('@')context.commit('INCREMENT',value);// context.state.sum += 1;//这样可以实现但是记住本次对状态的改变开发者工具将无法捕获,因为开发者工具是对mutations对话的}},incrementWait(context, value){setTimeout(() => {context.commit('INCREMENT', value);},500)},},mutations:{INCREMENT(state, value) {state.sum += value;},DECREMENT(state, value) {state.sum -= value;},}
}

person.js

//人员列表配置
import axios from "axios";
import {nanoid} from "nanoid";
export default {namespaced: true,state:{personList: [{ id: '001', name: '张三'}],},getters:{firstPersonName(state){return state.personList[0].name;}},actions:{addPersonWang(context, value){if(value.name.indexOf('王') === 0){context.commit('ADD_PERSON',value);}else{alert('添加的人员必须姓王');}},//联系后端apiaddPersonServer(context){axios.get(`https://api.uixsj.cn/hitokoto/get?type=social`).then(res => context.commit('ADD_PERSON',{id: nanoid(),name: res.data})).catch(e => alert(e.message));}},mutations:{ADD_PERSON(state, value){state.personList.unshift(value);}}
}

3、store文件中index.js中引入

/*** 该文件用于创建vuex中最核心的store*///引入Vuex
import Vuex from 'vuex';
import Vue from "vue";
import count from './count';
import person from './person';//使用vuex来集中管理状态,必要
//new store的前提是必须要使用Vuex插件
Vue.use(Vuex);//创建并暴露store
export default new Vuex.Store({modules:{count,person}
});

4、mian.js中引入

//引入Vue
import Vue from "vue";
//引入App
import App from './App';
//引入store
import store from './store';//关闭Vue的生产提示
Vue.config.productionTip = false;new Vue({el: '#app',store,render: h => h(App),
});

5、组件中使用store

<template><div><h1>当前求和为: {{ sum }}</h1><!--让其收集到的数据全是number类型的 number修饰符--><h3>当前求和放大3倍为:{{ bigSum }}</h3><h3>我在{{ school }}, 学习{{ subject }}</h3><h3 style="color: red">下方列表的总人数 {{ personList.length }}</h3><select v-model.number="n"><!--让所有的value全部绑定为数字--><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="increment(n)">+</button><button @click="decrement(n)">-</button><button @click="incrementIfOdd(n)">当前求和为奇数再加</button><button @click="incrementWait(n)">等一等再加</button></div>
</template><script>
import { mapState, mapGetters, mapMutations, mapActions} from 'vuex';
export default {//计数组件name: "Count",data(){return {n: 1,// 代表用户在select框开始的时候选择的数字}},computed:{//借助mapState从state中生成计算属性,对象写法// ... mapState({//   sum:'sum',//   school: 'school',//   subject: 'subject'// }),//借助mapState从state中生成计算属性,数组写法(即代表了生成的计算属性名为sum,同时也代表了从state找到sum)... mapState('count', ['sum', 'subject', 'school']),...mapState('person', ['personList']),//借助mapGetters从getters中生成计算属性,对象写法// ...mapGetters({ bigSum: 'bigSum' }),//借助mapGetters从getters中生成计算属性,数组写法...mapGetters('count',['bigSum']),},methods:{// increment(){//   this.$store.commit('INCREMENT', this.n);// },// decrement(){//   this.$store.commit('DECREMENT', this.n);// },//借助mapMutations生成对应方法,方法会调用commit去联系mutations,对象写法...mapMutations('count',{increment: 'INCREMENT',decrement: 'DECREMENT',}),//借助数组写法生成方法,但注意你生成的方法名和mutations里对应的方法名将会一样的// ...mapMutations(['increment', 'decrement']),// incrementOdd(){//   this.$store.dispatch('incrementIfOdd', this.n);// },// incrementWait(){//   this.$store.dispatch('incrementWait', this.n);// }//借助mapMutations生成对应方法,方法会调用dispatch去联系actions,对象写法// ...mapActions({//   incrementIfOdd: 'incrementIfOdd',//   incrementWait: 'incrementWait',// }),...mapActions('count',['incrementWait', 'incrementIfOdd']), //数组写法,同上},
}
</script><style scoped>button{margin-left: 5px;}
</style>
<template><div><h1>人员列表</h1><h2 style="color:skyblue;">Count组件求和为:{{ sum }}</h2><h3>列表中第一个人的名字是:{{ firstPersonName }}</h3><input type="text" placeholder="请输入名字" v-model="name" /><button @click="add">添加</button><button @click="addWang">添加一个姓王的人</button><button @click="addPersonServer">添加一个人名字随机</button><ul><li v-for="p in personList" :key="p.id">{{ p.name }}</li></ul></div>
</template><script>
// import { mapState } from 'vuex';
import {nanoid} from "nanoid";
export default {name: "Person",data(){return {name: '',}},methods:{add(){const perObj = {id: nanoid(),name: this.name,}console.log(perObj);this.name = '';this.$store.commit('person/ADD_PERSON', perObj);},addWang(){const perObj = {id: nanoid(),name: this.name}this.$store.dispatch('person/addPersonWang', perObj);this.name = '';},addPersonServer(){this.$store.dispatch('person/addPersonServer');}},computed:{// ...mapState(['personList']),personList(){return this.$store.state.person.personList;},sum(){return this.$store.state.count.sum;},firstPersonName() {return this.$store.getters['person/firstPersonName'];}},
}
</script><style scoped>button{margin-left: 5px;}ul{margin-top: 5px;}
</style>

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

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

相关文章

【前端面试3+1】01闭包、跨域

一、对闭包的理解 定义&#xff1a; 闭包是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。 特点&#xff1a; 闭包可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。…

vue项目中使用vue-pdf或pdf.Js,实现在页面上预览pdf内容

一。vue-pdf 1. 安装vue-pdf npm install --save vue-pdf2.页面引入 js部分 import pdf from "vue-pdf";data(){return {pdfUrl: "",pageTotal: 0,} }mounted(){this.pdfUrl pdf.createLoadingTask(pdf文件路径url);// 获取页码this.pdfUrl.promise…

Linux 搭建jenkins docker

jekin docker gitee docker 安装 jenkins docker run -d --restartalways \ --name jenkins -uroot -p 10340:8080 \ -p 10341:50000 \ -v /home/docker/jenkins:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker je…

QT数据类型和容器用法

Qt库提供了基于通用模板的容器类, 这些类可用于存储指定类型的数据项&#xff0c;Qt中这些容器类的设计比STL容器更轻&#xff0c;更安全且更易于使用。容器类也都是隐式共的&#xff0c;它们是可重入的&#xff0c;并且已针对速度/低内存消耗和最小的内联代码扩展进行了优化&a…

【解析几何】 【多源路径】 【贪心】1520 最多的不重叠子字符串

作者推荐 视频算法专题 本身涉及知识点 解析几何 图论 多源路径 贪心 LeetCode1520. 最多的不重叠子字符串 给你一个只包含小写字母的字符串 s &#xff0c;你需要找到 s 中最多数目的非空子字符串&#xff0c;满足如下条件&#xff1a; 这些字符串之间互不重叠&#xff0…

简单讲讲spring事务的传播机制

事务传播机制就像是一个指挥家&#xff0c;控制着程序中的各种操作&#xff08;比如修改数据库&#xff09;何时开始、何时结束&#xff0c;以及如何处理错误。 保证数据一致性&#xff1a;想象一下你在网上购物&#xff0c;你需要先从银行账户扣款&#xff0c;然后再把商品加入…

Wireshark使用实训---分析IP包

1.Wireshark简介和作用 Wireshark是一个开源的网络分析工具&#xff0c;用于捕捉和分析网络数据包。它可以帮助网络管理员和安全专家监控和解决网络问题&#xff0c;同时也可以用于学习和教学网络通信原理。 Wireshark可以在网络中捕获和分析传输的数据包&#xff0c;包括协议…

【Java初阶(五)】类和对象

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1. 前言2.面向对象的认识3.类的认识4. 类的实例化4.1什么是实例化4.2类和对象的说明 5.this引用6.对象初始化6.1 构造方法 7.static关键字8.代码块8.1 …

探索Python中的集成方法:Stacking

在机器学习领域&#xff0c;Stacking是一种高级的集成学习方法&#xff0c;它通过将多个基本模型的预测结果作为新的特征输入到一个元模型中&#xff0c;从而提高整体模型的性能和鲁棒性。本文将深入介绍Stacking的原理、实现方式以及如何在Python中应用。 什么是Stacking&…

算法-数据结构

算法-数据结构 金无足赤人无完人&#xff0c;在处理实际问题的时候我们可以使用到很多合适的数据结构&#xff0c;但目前还没有一个数据结构可以称的上完美。查询速度快的&#xff0c;插入的速度就会慢&#xff1b;插入速度和查询速度都快得&#xff0c;占用的空间就会多&…

PTAxt的考研路

xt是我院19级专业第一&#xff0c;但他认为保研并不能展示他全部的实力&#xff0c;所以他在22年初试一结束就加入了23考研的队伍中&#xff0c;并且他为了填补我院近些年来无北大研究生的空白&#xff0c;毅然决然决定扛起19级的大旗&#xff0c;在学校百年华诞之际献上他最诚…

Springboot项目之mybatis-plus多容器分布式部署id重复问题之源码解析

mybatis-plus 3.3.2 部署多个pod id冲突问题 配置&#xff1a; # 设置随机 mybatis-plus.global-config.worker-id: ${random.int(1,31)} mybatis-plus.global-config.datacenter-id: ${random.int(1,31)}源码解析&#xff1a;MybatisSqlSessionFactoryBean 重点&#xff1a…

mysql数据库查询

MYSQL数据库的搭建 今日目标&#xff1a; 1.搭建数据库 2.实现数据库的增删改查 00-回顾 #dos的常用指令 1. 切换盘符&#xff1a; 盘符名: 2. 切换上一级&#xff1a; cd ../ 3. 切换下一级&#xff1a; cd 目录名 4. 查看当前目录下的所有子目录和子文件&#xff1a; di…

光明源@智慧公厕赋能“厕所革命”主要体现在哪些方面?

当我们提及厕所&#xff0c;不再仅是简单的卫生设施&#xff0c;而是一种对生活品质的关怀与呵护。智慧公厕&#xff0c;作为厕所革命的引领者&#xff0c;以其独特的拟人魅力&#xff0c;彰显着人性化关怀的新风尚。今日&#xff0c;让我们一同探索&#xff0c;智慧公厕是如何…

数据库备份工具(实现数据定时覆盖)

数据库备份工具&#xff08;实现数据定时覆盖&#xff09; 永远热爱&#xff0c;永远执着&#xff01; 工具介绍 自动化测试数据库更新调度程序 这段 Python 脚本自动化了每天定时从生产数据库更新测试数据库的过程。它利用了 schedule 库来安排并执行每天指定时间的更新任务…

在for循环加判断条件当条件都满足时,同时显现的解决方法

一、代码示例 function fu(s) {str ;ste ;console.log(s);let Things s;for (let i 0; i < Things.length; i) {if (Things[i].pid kk) {console.log(Things[i].pid);ste <div class"commodity_nei"><div class"zxc_pic"><div cl…

[CISCN2019 总决赛 Day2 Web1]Easyweb ----不会编程的崽

CISCN的题质量还是很高的。 又是这熟悉的登陆界面。爆破&#xff1f;sql&#xff1f;还是xxe等。先看源码 估摸着也是sql注入。但似乎不是常规注入。同时扫描后台的结果应该也出来了&#xff0c;发现robots.txt 有点懵&#xff0c;后边看了大佬的wp才知道&#xff0c;提示的是*…

车载测试工具 canoe如何使用

其实canoe的使用非常的简单&#xff0c;结合自己的工作项目多多操作就可以了

openssl 升级1.1.1.1k 到 3.0.13

下载 https://www.openssl.org/source/ tar -zxvf openssl-3.0.13.tar.gzcd openssl-3.0.13/./config enable-fips --prefix/usr/local --openssldir/usr/local/opensslmake && make install 将原有openssl备份 mv /usr/bin/openssl /usr/bin/openssl.bak mv /usr/i…

LeetCode Python - 73. 矩阵置零

目录 题目描述解法方法一&#xff1a;数组标记方法二&#xff1a;原地标记 运行结果方法一方法二 题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;…