Vuex的使用

1、Vuex介绍

1.1、概念

专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式管理(读/写),也是一种组件间通信的方式,且适用于任意组件之间的通信。


(资料图)

1.2、什么时候使用Vuex

多个组件共享同一个状态(数据)的时候。

1.3、Vuex原理图

注意:图中没有体现出来,但是VueComponent可以直接commit给Mutations。

1.4、搭建vuex环境

1、npm i vuex

如果不指定版本,会自动安装vuex4,而vuex4只能在vue3中使用,因此vue2要指定vuex3的版本。npm i vuex@3

2、main.js

import Vuex from "vuex";// 使用插件Vue.use(Vuex);

3、src下创建store文件夹,创建index.js文件。

// 该文件用于创建Vuex中最为核心的store// 引入Vueimport Vue from "vue";// 引入Vueximport Vuex from "vuex"// 应用Vuex插件Vue.use(Vuex);// 准备actions——用于响应组件中的动作const actions = {};// 准备mutations——用于操作数据(state)const mutations = {};// 准备state——用于存储数据const state = {};// 创建storeconst store = new Vuex.Store({    actions,    mutations,    state});// 暴露storeexport default store;

main.js

// 引入Vueimport Vue from "vue";// 引入Appimport App from "./App.vue";// 引入storeimport store from "./store";Vue.config.productionTip = false// 创建Vue实例对象 --- vmnew Vue({  render: h => h(App),  store,  beforeCreate() {    Vue.prototype.$bus = this; // 安装全局事件总线  },  mounted() {    console.log("vm", this);  }}).$mount("#app")

1.5、Vuex开发者工具

就是vue的开发者工具,因为vuex是vue开发者团队开发的。

2、基本使用

1、store文件夹下的index.js

// 该文件用于创建Vuex中最为核心的store// 引入Vueimport Vue from "vue";// 引入Vueximport Vuex from "vuex"// 应用Vuex插件Vue.use(Vuex);// 准备actions——用于响应组件中的动作const actions = {    // 响应组件中加的动作    jia(context, value) {        context.commit("JIA", value);    }};// 准备mutations——用于操作数据(state)const mutations = {    // 执行加,方法大写是为了和actions中的方法区别    JIA(state, value) {        state.sum += value;    }};// 准备state——用于存储数据const state = {    sum: 0};// 创建storeconst store = new Vuex.Store({    actions,    mutations,    state});// 暴露storeexport default store;

2、组件读取vuex中的数据:$store.state.sum

3、组件中修改vuex中的数据:$store.dispatch("action中的方法名", 数据) 或者 $store.commit("mutations中的方法名",数据)

备注:如果没有网络请求以及业务逻辑,组件中也可以直接越过action,也就是说不写dispatch,直接commit给mutations去操作数据。

3、配置项

3.1、getters配置项

1、当state中的数据需要经过加工之后再使用时,可以使用getters加工。

2、在store.js中追加getters配置。

3、组件中读取数据:$store.getters.bigSum

index.js

......// 准备getters——用于将state中的数据进行加工,和computed属性类似const getters = {    bigSum(state) {        return state.sum + "元";    }}// 创建storeconst store = new Vuex.Store({    actions,    mutations,    state,    getters});// 暴露storeexport default store;

3.2、四个map方法的使用

1、mapState方法:用于帮助我们映射state中的数据为计算属性

computed: {  // 借助mapState生成计算属性:sum,school(对象写法)  ...mapState({sum: "sum", school:"school"}),    // 借助mapState生成计算属性:sum,school(数组写法)  ...mapState(["sum", "school"]),}

2、mapGetters方法:用于帮我们映射getters中的数据为计算属性

computed: {  // 借助mapState生成计算属性:sum,school(对象写法)  ...mapGetters({bigSum: "bigSum"}),    // 借助mapState生成计算属性:sum,school(数组写法)  ...mapGetters(["bigSum"]),}

3、mapActions方法:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数。

methods: {  // 靠mapActions生成:incrementOdd、incrementWait(对象写法)  ...mapActions({incrementOdd: "jiaOdd", incrementWait: "jixWait"});    // 靠mapActions生成:incrementOdd、incrementWait(数组形式)  ...mapActions(["jiaOdd", "jixWait"]);}

4、mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数。

methods: {  // 靠mapMutations生成:increment、decrement(对象写法)  ...mapMutations({increment: "JIA", decrement: "JIAM"});    // 靠mapMutations生成:JIA、JIAM(数组形式)  ...mapMutations(["JIA", "JIAM"]);}

备注:mapActions和mapMutations使用的时候,如果需要传递参数需要:在模板中绑定事件时传递好参数,否则参数会是事件对象。

4、vuex模块化 + namespace

1、目的:让代码更好维护,让多种数据分类更加明确。

2、修改index.js

// count模块相关业务const countAbout = {  namespaced: true, // 开启命名空间  state: {},  mutations: {},  actions: {},  getters: {}}// person模块相关业务const personAbout = {  namespaced: true, // 开启命名空间  state: {},  mutations: {},  actions: {},  getters: {}}const store = new Vuex.Store({  modules: {    countAbout,    personAbout  }});

3、开启命名空间后,组件中读取state数据

this.$store.state.personAbout.list...mapState("countAbout", ["sum","school","subject"]);

4、开启命名空间后,组件中读取getters数据

this.$store.getters["personAbout/firstName"]...mapGetters("countAbout", ["bigSum"]);

5、开启命名空间后,组件中调用dispatch

this.$store.dispatch("personAbout/addPerson", person)...mapActions("countAbout", {incrementOdd: "jiaOdd"});

6、开启命名空间后,组件中调用commit

this.$store.commit("personAbout/ADD_PERSON",person);...mapMutations("countAbout", {increment: "JIA"});

标签:

最近更新

Vuex的使用
2023-05-17 09:24:06
宁夏黄河文化实业有限公司-世界热头条
2023-05-17 09:10:20
读一本好书就是和许多高尚的人谈话是比喻句吗(读一本好书就是和许多高尚的人谈话)
2023-05-17 08:21:17
LOL:DRX冠军皮肤首曝,“至臻冠军”剑魔巨帅,BeryL寒冰美哭!
2023-05-17 07:30:42
闻泰科技(600745):5月16日北向资金增持13.19万股 简讯
2023-05-17 06:39:50
大势所趋?世嘉暗示可能会将游戏售价提升至70美元
2023-05-17 05:28:18
熏火龙任务奖励(熏火龙在)_新消息
2023-05-17 02:59:41
4月国民经济延续恢复态势
2023-05-17 00:17:33
世界观热点:江苏将推出三大系列百项博物馆特色活动
2023-05-16 22:27:04
【聚看点】【云想科技:依赖短视频营销能走多远?】
2023-05-16 21:55:05
10万元买8套房?鹤壁低价房火爆出圈
2023-05-16 20:44:02
北京:基本医保报销费用全部纳入医疗救助范围
2023-05-16 20:13:26
环球快资讯丨今天最新消息 周强:加强司法交流合作 积极服务构建更加紧密的上海合作组织命运共同体
2023-05-16 20:07:47
【环球速看料】海葵鱼亚科(海葵鱼)
2023-05-16 19:00:12
马斯克夜店跳舞视频曝光 这舞姿你打几分?
2023-05-16 18:23:02
爱奇艺第一季度营收83亿元同比增长15%,日均订阅会员数达1.29亿 世界新消息
2023-05-16 17:52:13
环球动态:回归“7元时代”!今晚油价迎年内最大跌幅:加满一箱油省15元
2023-05-16 17:31:40
豆油龙虎榜 | 日内增仓下行 多空双方均呈进场态势
2023-05-16 17:07:17
【全球独家】中芯国际:二季度公司收入和产能利用率预计有所恢复
2023-05-16 16:22:23
美女演员陈红_陈红 中国大陆女演员 最新
2023-05-16 15:53:05
不买C罗,求购内马尔!5冠豪门半价捡漏,10亿豪阵挑战曼城霸权 消息
2023-05-16 15:15:45
世界要闻:新疆喀什古城:旅游业态多元发展 拓文旅消费新空间
2023-05-16 15:03:12
环球报道:通讯:中国医生以医者仁心架起中厄友谊桥梁
2023-05-16 14:07:26
“追着花儿看新疆”主题采访活动正式启动_每日报道
2023-05-16 13:59:02
当前热文:鸡蛋保质期多久常温下_鸡蛋保质期一般多久
2023-05-16 12:44:39
美国“脱钩断链”威胁全球供应链安全
2023-05-16 12:01:30
大禹节水子公司预中标韩城市禹门口抽黄改造工程泥沙处理站项目
2023-05-16 11:42:19
国家统计局:下半年PPI有望逐步回升 今日最新
2023-05-16 11:13:59
天天即时:华菱精工开盘涨停 公司拟定增募资用于补充流动资金和偿还有息负债
2023-05-16 10:43:00
山东高速拟发行3年期美元债券,初始指导价5.70%区域
2023-05-16 10:16:24