Vuex的搭建与使用

news2024/11/28 10:34:04

Vuex

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

如果多个组件需要使用同一个数据的时候,可以利用Vuex

在这里插入图片描述

store管理action,mutations,state

  1. vm调用dispatch这个api告诉actions(对象),方法名和数据,actions触发add这个函数,当传递数据从后端来的时候,actions可与后端交互

store.dispatch(‘add’,2)

  1. actions调用commit这个api,这时候流程走到mutations这里,mutations是一个对象,其中存储着add函数,add函数可以拿到state和数据2

  2. mutations中的add函数中写state.sum+=2,那么state中存储的sum就发生了改变。

  3. 之后vuex重新解析组件,进行渲染

vue2中要使用vuex3,vue3中要使用vuex4

npm i vuex@3

搭建vuex环境

创建store文件夹==>创建index.js文件

index.js

//引入Vue
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'

//应用Vuex插件
Vue.use(Vuex)

//准备actions对象,用于响应用户的动作
const actions={}
//准备mutations对象,用于修改state中的数据
const mutations={}
//准备store对象,用于存储用户数据
const store={}

//创建并暴露store对象
export default new Vue.Store({
    actions,
    mutations,
    store
})

之后在main.js中import引入store并在创建vue实例对象的时候声明。

Vuex的使用

//在组件
methods:{
        increment(){
            //调用dispatch这个api通知action
            this.$store.commit('ADD',this.n)
        },
        decrement(){
            this.$store.commit('SUB',this.n)
        },
        oddIncrement(){
            this.$store.dispatch('odd',this.n)
        },
        waitIncrement(){
            this.$store.dispatch('wait',this.n)
        }

    }

//vuex
//准备actions对象,用于响应用户的动作
const actions={
    // //dispatch通知到了action,这里进行操作
    // add(context,value){
    //     //调用commit这个api通知mutations
    //     //context相当于一个miniStore,存储了dispatch和commit还有state等
    //     context.commit('ADD',value)

    // },
    // sub(context,value){
    //     context.commit('SUB',value)
    // },
    
    odd(context,value){
        //上下文中存储着state
        if(context.state.sum %2){
            context.commit('ODD',value)
        }
    },
    wait(context,value){
        setTimeout(()=>{
            context.commit('WAIT',value)
        },500)
    }
}
//准备mutations对象,用于修改state中的数据
const mutations={
    ADD(state,value){
        //对state中的数据进行操作
        state.sum+=value
    },
    SUB(state,value){
        state.sum-=value
    },
    ODD(state,value){
        state.sum+=value
    },
    WAIT(state,value){
        state.sum+=value
    }
}
//准备state对象,用于存储用户数据
const state={
    sum:0,
}

//创建并暴露store对象
export default new Vuex.Store({
    actions,
    mutations,
    state
})

注意:

  1. 当需要进行if判断,设置定时器等业务逻辑操作的时候需要在actions中进行操作,mutations中只负责对数据的操作。
  2. 如果不需要actions那么在组件中可以直接和mutations进行对话 this.$store.commit('JIA',this.n)

getters配置项

getters可以将state中的数据进行加工,和计算属性的使用方法类似,都是通过return返回值来决定值

const getters={
    mulSum(state){
        return state.sum*10
    }
}

export default new Vuex.Store({
    actions,mutations,state,getters
})

在组件中使用: $store.getters.mulSun

mapState

如果模板中需要使用state中的数据,那么直接将this.$store.state.xxx写在模板中会太长了(模板中最好不要写太长的语句),所以这里要用到计算属性

//使用
{{school}}
//计算属性
computed:{
    add(){
        return this.$store.state.sum
    },
    school(){
        return this.$store.state.school
    },
    job(){
        return this.$store.state.job
    }
}

观察以上计算属性中的代码可以发现,这些代码前面相同,只有最后的后缀不同,所以这里可以通过Vuex中的mapState来实现以上计算属性中的代码

//导入mapState
import {mapState} from 'vuex'

export default{
    computed:{
        //es6中...可以将对象中的属性拆分出来
        //借助mapState生成计算属性,从state中读取数据(对象写法)
       ...mapState({
            add:'sum',
            school:'school',
            job:'job'
        }),
        //数组写法(生成的计算属性名和state中属性名要相同)
        ...mapState(['sum','school','job'])
    }
}

mapGetters

用于映射getters中的数据为计算属性

import {mapGetters} from vuex
computed:{
    //对象写法
    ...mapGetters({mulSum:'mulSum'})
    //数组写法
    ...mapGetters(['mulSum'])
}

mapActions

借助mapActions生成对应的方法,方法中会调用dispatch函数去联系actions

import {mapActions} from vuex
methods:{
     oddIncrement(){
            this.$store.dispatch('odd',this.n)
        },
        waitIncrement(){
            this.$store.dispatch('wait',this.n)
        }
 
    //以下代码可以替代以上代码
  	//对象写法
    ...mapActions(oddIncrement:'odd',waitIncrement:'wait')
    //数组写法
    ...mapActions('odd','wait')
    @click='odd(n)'
}

mapMutations

借助mapMutations生成对应的方法,方法中会调用commit函数去联系mutations

import {mapMutations} from vuex
methods:{
// increment(){
//     this.$store.commit('JIA',this.n)
// },
// decrement(){
 //    this.$store.commit('JIAN',this.n)
// }
   
 //以下代码可以替代以上代码   
 
 //对象写法
    ...mapMutations({increment:'JIA',decrement:'JIAN'})
 //数组写法
 ...mapMutions['JIA','JIAN']
 @click= "JIA(n)"
}

要注意的是使用mapMutations这个函数并没有传入参数,所以在绑定事件的时候要传入参数,原来的写法@click="increment",现在的写法是@click=increment(n)将参数传入

多组件共享数据

模块化编码+命名空间

目的是让代码更好维护,让多种数据分类更加明确

开启命名空间

const countAbout={
    namespaced:true,	//开启命名空间
    state:{},
    mutations:{},
    actions:{},
    getters:{}
}

const personAbout={
     namespaced:true,	//开启命名空间
    state:{},
    mutations:{},
    actions:{},
    getters:{}
}

const state=new Vuex.Store({
    //这种方法声明命名空间
    modules:{
        countAbout,
        personAbout
    }
})

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

//自己直接读取
this.$store.personAbout.xxx
//借助mapState读取
...mapState('countAbout',['sum','school'])

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

//自己直接读取
this.$store.getters['personAbout/xxx']
//借助mapGetters读取
...mapGetters('countAbout',['bigSum'])

开启命名空间后,组件中调用dispatch方法联系actions

//dispatch
this.$store.dispatch('personAbout/addPersonWang',person)
//mapActions
...mapActions('countAbout',{incrementOdd:'odd',incrementWait:'wait'})

开启命名空间后,组件中调用commit方法联系mutations

//commit
this.$store.commit('personAbout/add',person)
//mapMutations
...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'})

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

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

相关文章

git的使用规范及技巧总结

一、什么是Git? Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同&#x…

聚观早报 | 黑五电子产品销售额飙升;谷歌不满微软收购动视暴雪

今日要闻:黑五电子产品销售额飙升;谷歌不满微软收购动视暴雪;特斯拉海外充电站价格下降;欧盟对微软发起反垄断调查;小米13渲染图曝光黑五电子产品销售额飙升 据消息,Adobe数据和分析部门Adobe Analytics发布…

Navicat Premium 16 连接Oracle注意事项

起因 新同学使用的新版本的Mac电脑 但是装的W系统M芯片 发现 PLSQL Developer 并不兼容 导致无法连接到Oracle数据 就临时换成Navicat Premium 16进行连接 然后就出现了一系列问题 Oracle默认编码集 ZHS16GBK 该问题是Navicat Premium默认使用Navicat自带的instantclient_…

激光雷达发射的PCB布局

1、激光发射的电路如下图所示。 重点就是要考虑电容、GaN、激光器三部分的布局。 2>第一种布局方式 激光器、GaN、电容三者都在同一层上,放电的回路也都在顶层上,此时临近的第二层没有铺地。 用ANSYS仿真得到此时得回路电感为2nH左右。我们都以500M时得寄生电感来评估。…

面试官:介绍一下 Redis 三种集群模式

小码今天去面试。 面试官:给我介绍一下Redis集群, 小码:啊,平时开发用的都是单机Redis,没怎么用过集群了。 面试官:好的,出门右转不谢。 小码内心困惑:在小公司业务量也不大&…

操作系统

文章目录一,操作系统是什么二,操作系统的发展史1) 1945~1955年2) 1955~1965年:首个操作系统诞生3) 1964~1979年:多道程序系统诞生4) 1979~至今:网络操作系统和分布式操作系统快速发展三,操作系统的类别一&a…

静态HTML旅行主题网页设计与实现——联途旅游网服务平台网(39页)HTML+CSS+JavaScript

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

KafKa C++实战

1 集群 1. Kafka架构是由producer(消息生产者)、consumer(消息消费者)、borker(kafka集群的 server,负责处理消息读、写请求,存储消息,在kafka cluster这一层这里,其实里面是有很多个…

SpringBoot+Vue项目校园防疫管理系统

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…

Apollo 应用与源码分析:Monitor监控-硬件监控-GPS

硬件架构图 可以看到左下角的“GNSS定位模块”其实是有IMU和GPS Antenna 组成的。 执行分析 代码 class GpsMonitor : public RecurrentRunner {public:GpsMonitor();void RunOnce(const double current_time) override; };void GpsMonitor::RunOnce(const double current_t…

为什么要把Linux机器加入到Windows AD/域控制器(Linux机器为什么要入域)?

文章目录1. 如何入域?2. 如何判断入域成功?3. 入域的效果(目的)是什么?4. 入域和SSSD之间是什么关系?1. 如何入域? sudo yum -y install oddjob oddjob-mkhomedir sssd samba-common-tools adcli \krb5-workstation o…

Java项目:jsp+servlet实现的新闻发布系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台; 前台主要功能为: 首页、娱乐新闻、经济新闻、文化新闻、小道新闻、用户评价等; 后台主要…

HTML5学习笔记(五)

CSS3 多列布局 CSS3新增了一种布局方式——多列布局。使用多列布局,可以轻松实现类似报纸那样的布局。 多列布局的应用非常广泛,像各大电商网站、素材网站中常见的“瀑布流效果”。 column-count属性来定义多列布局的列数。 column-width属性来定义多列…

【云原生系列】第四讲:Knative 之 Eventing

目录 序言 1.基础介绍 2.组成要素 2.1 事件源(Event Source) 2.2 事件处理(Flow) 2.3 事件消费者(Event Consumer) 3.架构模式 3.1 Source to Service ​编辑 3.2Channels & Subscriptions …

思科配置SVI实现VLAN间路由

思科SVI配置 说明 SVI技术与单臂路由和传统VLAN间路由一样,都是解决多个VLAN间通信问题。 SVI技术利用了多层交换机(本文以三层交换机为例)。 示例拓扑 其中S1为三层交换机 S2的Fa0/2接口于VLAN 10下 S3的Fa0/2接口于VLAN 20下 PC 1地…

NH2-picolyl-azide|2168629-06-7|Amine azide Picolyl叠氮生物标记基团

【产品描述】 西安凯新生物科技有限公司​picolyl-azide-NH2含有叠氮基,叠氮基可以通过点击化学与炔烃、BCN、DBCO反应,生成稳定的三唑键。末端羧酸在活化剂(如EDC或HATU)存在下可与伯胺基反应,形成稳定的酰胺键。叠氮…

python基础之面向对象基础语法

文章目录一、面向对象基础语法1.dir内置函数:2.定义一个简单的类(只包含方法):二、实例演练3.面对对象练习:小明爱跑步需求:4.摆放家具练习:5.士兵突击,需求:6.私有属性和…

CDN技术介绍

引言 随着Internet技术和多媒体技术的不断发展,图像、音频、视频服务所占的比重越来越大,加之网民数量激增,网络访问距离过长,导致网络负载迅速增加,从而使用户的访问质量受到严重影响。传统的缓存技术对交互性强和比…

【ML特征工程】第 9 章 :回到特征:构建学术论文推荐器

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

算法leetcode|17. 电话号码的字母组合(rust重拳出击)

文章目录17. 电话号码的字母组合:样例 1:样例 2:样例 3:提示:原题传送门:分析题解rustgocjavatypescriptpython17. 电话号码的字母组合: 给定一个仅包含数字 2-9 的字符串,返回所有…