vue3中使用Vuex

news2024/11/14 23:50:21

目录

  • 什么是Vuex
  • 安装和配置Vuex
    • 安装Vuex
    • 配置Vuex
  • 使用Vuex
    • State
      • 定义State
      • 访问State
    • Mutations
      • Mutations 的特点
      • 定义Mutations
      • 触发Mutations 修改State中的状态
    • Action
      • Action 的特点和作用
      • 定义Action
      • 触发Action
    • Getter
      • Getter 的特点和作用
      • 定义Getter
      • 获取Getter
    • Module
      • Module 的特点和作用
      • 定义和使用Module
  • Vuex中的辅助函数
    • mapState
    • mapGetters
    • mapMutations
    • mapActions

Vuex 曾经是Vue.js的官方状态管理库。为什么说是曾经呢,因为在Vue.js官方网站的生态系统的官方系统中找不到Vuex的影子了,取而代之的是Pinia。那么问题来了,既然Vue官方已经舍弃了Vuex,使用Pinia取而代之,我们还有必要去深入了解Vuex吗?

我觉得还是由必要深入了解下Vuex的,虽然Vue.js的官方网站生态系统中已经不再推荐使用Vuex了,但是在目前市面上大多项目中仍然有大量使用Vuex的项目,而且Vuex的核心概念也可以应用于其他状态管理库中。因此,学习Vuex可以帮助我们更好地理解Vue.js的状态管理机制,提高我们处理Vue.js应用中的状态管理的能力,并且能够更好地适应已有的Vue.js项目。因此,今天我们就花费一个章节来详细的聊一聊Vuex

什么是Vuex

Vuex是一个专为 Vue.js 应用程序开发的状态管理库,它允许我们以集中的方式管理应用程序中的所有状态。
官方给出的vuex状态管理执行的流程图下图所示
在这里插入图片描述

安装和配置Vuex

安装Vuex

通过下面的指令按照Vuex

npm install vuex@next --save
# or
yarn add vuex@next --save

配置Vuex

为了代码可读性及便于后期维护管理,我们一般将Vuex相关的代码统一放到一个文件夹中。因此,配置Vuex的步骤如下:

  1. 在src文件夹新建一个store文件夹,在该文件夹下新建index.js文件
  2. 在index.js中引入Vuex中的createStore 方法
import { createStore } from 'vuex'
  1. 使用createStore创建Vuex实例对象,
const store = createStore({
  state:{ 
  //状态管理器中定义的数据源
  },
  mutations:{
  //同步操作
  },
  actions:{
   //异步操作
  },
  //getters相当于计算属性
  getters:{ 
  }
})
  1. 将上面创建的store导出
export default store
  1. 在main.js文件中引入上面创建的sotre.js,并注册到app中
import store from './store'
app.use(store) //注册vuex

经过上面的步骤,Vuex就配置完成了,下面就可以在我们的程序中进行使用了。

使用Vuex

在使用Vuex之前,我们需要了解Vuex中的几个核心概念,即:State,Mutation,Action,Getter 和 Module

State

在Vuex中,state是应用程序的状态管理模式中定义的数据源,它是一个单一的JavaScript对象,在一个应用程序中只使用一个store对象,来存储所有共享的状态信息。该对象具有被访问和修改的方法,可以帮助简化数据的共享和传递。

定义State

定义State有两种方式,分别是使用对象方式和函数方式进行定义,下面是两种定义方式的示例代码,两种方式选一种即可

//对象方式
state:{ 
  isTabbarShow:true
},
//函数方式
state() {
  return {
    isTabbarShow:true
  }
},

访问State

由于Vue3中即支持选项是API,也支持组合式API,因此访问State也有两种方式

在选项是API中,通过如下代码进行访问到上面定义的isTabbarShow

console.lgo(this.$store.state.isTabbarShow)

在组合式API中,通过如下代码访问上面定义的isTabbarShow

import { useStore } from 'vuex'
const store = useStore()
console.lgo(store.state.isTabbarShow)

Mutations

Mutations是用来管理和修改 state 状态的工具,通过Mutations更新的状态,Vuex 可以更容易地追踪状态的变化。

Mutations 的特点

  • Mutations 是同步修改 state 状态的。
  • Mutations 修改 state 必须是通过 store.commit() 来触发。
  • Mutations 只能处理同步操作。

定义Mutations

和上面的State一样,定义Mutations也有对象式和函数式两种方式,这里以对象式为例

  mutations:{
    changeState(state,payload) {
      state.isTabbarShow = payload
    }
  },

触发Mutations 修改State中的状态

通访问State的方法一样,触发Mutations 修改State中的状态也有两种方式。

在选项是API中,通过如下代码进行访问

this.$store.commit('changeState',true) 

在组合式API中,通过如下代码访问上面定义的isTabbarShow

import { useStore } from 'vuex'
const store = useStore()
store.commit('changeState',true) 

Action

Action 用于处理异步操作或复杂的操作逻辑,类似于 Mutations,但是 Action 支持异步操作,而且一般不直接修改 state 状态,而是提交 Mutations 完成具体的状态变更。

Action 的特点和作用

  • Action 是异步的,用于处理异步操作或复杂的操作逻辑。
  • Action 一般不直接修改 state 状态,而是提交 Mutations 完成具体的状态变更。
  • Action 可以提交 Mutations,也可以赋值 state 状态。
  • Action 通过 store.dispatch 触发。

Action 的主要作用是处理异步操作或复杂的操作逻辑,并将操作变更提交给 Mutations 完成更新状态的操作。

定义Action

定义Action和上面定义Mutations类似,以对象方式定义Action的示例代码如下:

  actions:{
    ayncChangeState(context) {
      context.commit('changeState',true)
    }
  }

触发Action

和触发Mutations一样,触发Action 也有两种方式。

在选项是API中,通过如下代码进行访问

this.$store.dispatch('ayncChangeState')

在组合式API中,通过如下代码访问上面定义的isTabbarShow

import { useStore } from 'vuex'
const store = useStore()
store.dispatch('ayncChangeState') 

Getter

Getter 用于从 store 中的 state 中派生出一些状态,例如对 state 中的数据进行计算和过滤。也可以通过 Getter 访问定义在 store 中的 state。我们可以认为是Getter 是 store 的计算属性。

Getter 的特点和作用

  • Getter 访问时不需要调用,是在模块中对 state 进行一个辅助性的处理。
  • Getter 不会对 state 数据进行修改,只是对 state 数据进行加工处理。
  • Getter 的作用是从 store 中派生状态,即从 store 中获取状态。
  • 组件中很少直接使用 state,因为 state 的结构可能会改变,这会导致需要修改组件中的所有使用到这些 state 的地方。而使用 Getter,可以维护一种稳定的接口。

定义Getter

Getter 接受 state 作为其第一个参数:
定义Getter的方式如下

getters: {
  doneTodos: state => {
    return state.todos.filter(todo => todo.done)
  }
}

获取Getter

在选项式API中获取 Getter:

computed: {
  doneTodos() {
    return this.$store.getters.doneTodos
  }
}

在组合式API中获取Getter

store.getters.doneTodos

Module

在 Vuex 中,Module 可以帮助我们把 Store 分割成多个小的 Store,每个 Module 可以有自己的 State、Mutation、Action、Getter。

Module 的特点和作用

  • 命名空间: Module 可以减少把 State、Mutation、Action、Getter 加入到全局命名空间中的问题,避免团队开发时命名冲突的问题。
  • 优化组织结构:当一个 Store 变得非常大时,使用Module将它们拆分成较小而简单的部分可以更轻松地理解和维护。
  • 代码重复使用:可以为多个模块中共享代码提供便利。

定义和使用Module

在实际开发中,当我们需要共享和管理的数据越来越多时,可以使用Module将需要管理的数据进行分类创建,比如,我们需要同时管理user的信息和book的信息,我们就可以通过下面的步骤来定义和使用Module

  1. 在store文件夹下再创建一个module文件夹,创建userModule.js和bookModule.js两个文件,各个文件的代码如下:

userModule.js代码如下:

const user = {
  namespaced: true,
  state: {
    name: 'John Doe',
    age: 30,
    email: 'johndoe@example.com'
  },
  getters: {
    fullName (state) {
      return state.name
    }
  },
  mutations: {
    setName (state, newName) {
      state.name = newName
    }
  },
  actions: {
    updateName ({ commit }, newName) {
      commit('setName', newName)
    }
  }
}
export default user

bookModule.js代码如下

const books = {
  namespaced: true,
  state: {
    name: 'Vue入门',
    price: 30, 
    author: 'John Doe'
  },
  getters: {
    totalMoney (state) {
      return state.price 
    }
  },
  mutations: {
    setName (state, newName) {
      state.name = newName
    }
  },
  actions: {
    updateName ({ commit }, newName) {
      commit('setName', newName)
    }
  }
}
export default books
  1. 在store文件夹下的index.js中使用如下方法将上面的两个module整合到一起引入
import { createStore } from 'vuex'
import userModule from './module/userModule.js'
import bookModule from './module/bookModule.js'
const store = createStore({
  modules:{
    userModule,
    bookModule
  }
})

export default store
  1. 使用Module:在上面第3步中,我们创建了userModule和 bookModule两个js文件,他们都定义了单独的state、mutations、actions、getters。我们可以通过 store 对象中的「模块命名空间」来访问它们

    在选项是API中,通过如下代码进行访问

    this.$store..state.userModule
    this.$store..state.bookModule
    

    在组合式 API 中,使用 useStore 来获取 store 对象,从而访问模块中的 state, mutation, action 或 getter

    import { useStore } from 'vuex'
    const store = useStore()
    const userModuleState = computed(() => store.state.userModule.stateName)
    // userModule mutation的使用
    const updateName = name => {
      store.commit('userModule/updateName', name)
    }
    

Vuex中的辅助函数

在组件中使用大量的$store访问和调用操作会导致代码缺乏可读性和可维护性。为此,Vuex提供了一些辅助函数来简化在Vue组件中访问和操作store中的state、getter、mutation和action的代码,这些函数包括mapState,mapGetters,mapMutations和mapActions

mapState

mapState用于将state映射到Vue组件的计算属性中。
示例代码如下:

// 在组件中使用 mapState
import { mapState } from 'vuex'

export default {
  computed: {
    ...mapState({
      count: state => state.count,
      message: state => state.message
    })
  }
}

mapGetters

mapGetters用于将getter映射到Vue组件的计算属性中。
示例代码如下:

// 在组件中使用 mapGetters
import { mapGetters } from 'vuex'

export default {
  computed: {
    ...mapGetters({
      doneTodos: 'doneTodos',
      doneTodosCount: 'doneTodosCount'
    })
  }
}

mapMutations

mapMutations用于将mutation映射到Vue组件的methods中。
示例代码如下:

// 在组件中使用 mapMutations
import { mapMutations } from 'vuex'

export default {
  methods: {
    ...mapMutations([
      'increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')`
      'add' // 将 `this.add()` 映射为 `this.$store.commit('add')`
    ])
  }
}

mapActions

mapActions用于将action映射到Vue组件的methods中。
示例代码如下:

// 在组件中使用 mapActions
import { mapActions } from 'vuex'

export default {
  methods: {
    ...mapActions([
      'incrementAsync', // 将 `this.incrementAsync()` 映射为 `this.$store.dispatch('incrementAsync')`
      'addAsync' // 将 `this.addAsync()` 映射为 `this.$store.dispatch('addAsync')`
    ])
  }
}

在选项式API中,上述函数都可以通过对象展开符...将计算属性和方法添加到组件中。

注意:
这里需要注意的是,当我们使用组合式API时,如在<script setup>语法糖中,我们无法使用上面介绍的辅助函数,因为这些辅助函数的底层是调用的this.$store,而在组合式API中,不存在this,所以上面的几个辅助函数在组合式API中无法使用

好了,关于vue中使用Vuex的相关特性和方法就聊到这里,喜欢的小伙伴点赞关注收藏哦!

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

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

相关文章

ARM基础(4):L1 Cache之I-Cache和D-cache详解

在上一篇文章ARM基础(3)&#xff1a;MPU内存保护单元详解及例子中&#xff0c;我介绍了MPU&#xff0c;我们知道MPU允许按区域修改一级Cache的属性&#xff0c;这个Cache一般为L1 Cache&#xff0c;它位于CPU的内部&#xff0c;用来加快指令和数据的访问速度。同时&#xff0c;…

chatgpt赋能python:如何在Python和Java之间进行整合

如何在Python和Java之间进行整合 在现在这个编程的时代里&#xff0c;使用一种编程语言或一种技术通常不能满足所有的需求。因此&#xff0c;当你需要在Python和Java之间进行整合时&#xff0c;这篇文章就为你介绍了一些解决方案。 为什么需要Python和Java进行整合 Python和…

redis 字典的实现

1.数据结构 节点数据结构 因为是基于开链法的哈希表实现&#xff0c;所以需要维护了一个next节点 typedef struct dictEntry {void *key;union {void *val;uint64_t u64;int64_t s64;double d;} v;struct dictEntry *next; } dictEntry; 复制 哈希表数据结构 其中size是当…

景区旅游多商户版小程序v14.3.1+前端

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 【新增】全新授权登录支持取消登录 【新增】商…

3.12生产者消费者模型 3.13条件变量 3.14信号量 C++实现生产者消费者模型

3.12生产者消费者模型 生产者消费者模型中的对象&#xff1a; 1、生产者 2、消费者 3、容器 若容器已满&#xff0c;生产者阻塞在这&#xff0c;通知消费者去消费&#xff1b;若容器已空&#xff0c;则消费者阻塞&#xff0c;通知生产者去生产。生产者可以有多个&#xff0c;消…

RK3588平台开发系列讲解(USB篇)Linux Android USB软件架构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、高通平台USB软件架构二、USB 设备侧软件组成2.1、OTG driver2.2、Device controller driver2.3、Gadget framework2.4、Function drivers三、USB 主机侧软件3.1、Host controller driver3.2、USB core3.3、USB PHY…

chatgpt赋能python:Python取消断点的方法

Python取消断点的方法 在Python开发过程中&#xff0c;我们经常需要设置断点来帮助我们调试代码。但是&#xff0c;有时候我们可能需要取消已设置的断点。本文将介绍如何取消Python中的断点。 1. 什么是断点 在Python中&#xff0c;断点是为了帮助调试代码而设置的一个标志。…

网络层:IPv4地址

网络层&#xff1a;IPv4地址 笔记来源&#xff1a; 湖科大教书匠&#xff1a;IPv4地址概述 湖科大教书匠&#xff1a;分类编址的IPv4地址 湖科大教书匠&#xff1a;划分子网的IPv4地址 湖科大教书匠&#xff1a;无分类编址的IPv4地址 IPv4地址就是给因特网(Internet)上的每一…

零售场景梳理和运筹优化工作经验总结

文章目录 亡羊补牢不为迟零售行业规模大卷出零售新高度运筹优化实践经验 亡羊补牢不为迟 由于工作岗位变动的缘故&#xff0c;暂时要告别零售场景了。当初自己没想太多就一头扎进了“新”零售这个场景&#xff0c;迄今为止都没有针对零售场景做一个通盘的梳理&#xff0c;现在…

御2pro,带屏遥控器航测设置

御2遥控器航测设置 0 前言1 遥控器设置2 航测软件设置3 航测设置 0 前言 无人机&#xff1a;御2 或者御2 pro&#xff0c;非变焦版本遥控器&#xff1a;大疆带屏控器 RM500 1 遥控器设置 默认的遥控器控制软件CONNECT只能航拍&#xff0c;无法航测&#xff0c;必须调节为航…

Docker常用基本命令

一、docker的基础命令 1、启动docker systemctl start docker 2、关闭docker systemctl stop docker 3、重启docker systemctl restart docker 4、设置docker开机自启动 systemctl enable docker 5 &#xff0c; 查看docker运行状态&#xff08;显示绿色代表正常启动…

类和对象(再谈构造函数)

文章目录 1.再谈构造函数1.1构造函数的赋值1.2初始化列表1.3 explicit关键字 2. static成员2.1概念2.2特性2.3例题 3 .友元3.1 友元函数3.2友元类 4.内部类5.匿名对象6.拷贝对象时编译器的一些优化 1.再谈构造函数 1.1构造函数的赋值 在创建对象时&#xff0c;编译器通过调用…

使用自签发CA证书为EMQX开启双向认证

文章目录 背景信息1、CA证书信任模型2、创建证书2.1 Root CA 证书创建2.2 emqx 服务端证书签发2.3 中间CA证书签发2.4 设备证书签发 3、配置EMQX服务端证书4、客户端使用TLS连接EMQX 背景信息 本文主要介绍了通过建立三层CA证书链&#xff0c;为EMQX集群提供PKI服务&#xff0c…

STM32基于库函数新建工程模板

基于库函数版本 准备资料&#xff1a; a) V3.5 固件库包&#xff1a;STM32F10x_StdPeriph_Lib_V3.5.0 这是 ST 官网下载的固件库完 整版&#xff0c;我们光盘目录&#xff1a; 软件资料\STM32 固件库使用参考资料\STM32F10x_StdPeriph_Lib_V3.5.0 我们官方论坛下载地址&#…

C++入门(嵌入式学习)

C入门学习 前言C概述C和C的区别 引用引用概念引用性质引用的应用 C输入和赋值string字符串函数提高函数的默认值默认值的注意事项函数的重载函数重载可能产生的问题扩充 内联函数 前言 C概述 C是一种通用的高级编程语言&#xff0c;它是由Bjarne Stroustrup于20世纪80年代初在…

论文笔记:MEASURING DISENTANGLEMENT: A REVIEW OF METRICS

0 摘要 学习解缠和表示数据中的变化因素是人工智能中的一个重要问题。虽然已经取得了许多关于学习这些表示的进展&#xff0c;但如何量化解缠仍然不清楚。 虽然存在一些度量标准&#xff0c;但对它们的隐含假设、真正衡量的内容以及限制了解甚少。因此&#xff0c;当比较不同的…

睡眠脑电中的神经跨频率耦合函数

导读 人类大脑是一个紧密连接的复杂系统。虽然其结构比较固定&#xff0c;但它可以实现很多不同的功能。其中一个重要的功能是自然睡眠过程&#xff0c;这个过程可以改变意识和随意肌肉活动。在神经层面上&#xff0c;这些改变会伴随着大脑连接的变化。为了揭示这种与睡眠相关…

推荐一个好用的开发工具百宝箱

随着科技不断发展&#xff0c;越来越多的工具在网络上应运而生&#xff0c;方便我们更加高效地完成各种任务。今天我要向大家介绍一款在线工具——码加在线工具 - 做更好的工具&#xff0c;它可以帮助你轻松完成许多繁琐、复杂的工作。 首先&#xff0c;码加在线工具 是一款非…

一维信号进行小波去噪(python)

目录 小波变换小波去噪的原理小波阈值去噪的三个主要方面pywt.threshold函数进行小波去噪对ecg信号进行小波阈值去噪关于阈值输出参考 小波变换 小波变换是一种信号的时间——尺度&#xff08;时间——频率&#xff09;分析方法&#xff0c;它具有多分辨分析的特点&#xff0c…

【模型评估】ROC(Receiver operating characteristic)与 AUC

前面&#xff0c;我们提到了混淆矩阵&#xff0c;以及根据混淆矩阵进一步计算得到的敏感度&#xff08;召回率&#xff09;、特异度、精确度、准确度、F1 Score等等。那他们的前提都是要首先确定一个截断阈值。 【模型评估】混淆矩阵&#xff08;confusion_matrix&#xff09;…