vue2-vuex

news/2025/2/28 22:58:34/文章来源:https://www.cnblogs.com/Mickey-7/p/18563142

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

应用场景:

  • 多个组件依赖于同一状态、共享数据
  • 来自不同组件的行为需要变更同一状态
  • vuex

vuex原理

image-20241122100314789

每一个 Vuex 应用的核心就是 store,里面又包括:

  1. State(状态):用于数据的存储(对象类型数据),是store中唯一数据源
  2. Actions(行为):类似于mutation,用于提交mutation来改变状态,而不直接变更状态,可以包含任意异步事件
  3. Mutations(转变):类似函数,改变state数据的唯一途径,且不能用于处理异步事件,Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type)和一个回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方
  4. Getter(数据加工):如vue中的计算属性一样,基于state数据的二次包装,常用于数据的筛选和多个数据的相关计算
  5. Module:类似于命名空间,用于项目中将各个模块的状态分开定义和操作,便于维护

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块

vuex环境

  1. 安装vuex

    vue2:使用vuex3版本

    vue3:使用vuex4版本

    # 安装3版本npm i vuex@3    
    
  2. 创建Store

    创建store文件夹,下面创建index.js (官方推荐) or 创建vuex文件夹,创建store.js文件,自定义写法

    import Vue from "vue"
    import Vuex from "vuex"// 使用vuex插件,使用之后,创建vm的时候,可以传入store配置项
    // new Vuex.Store 必须使用了Vuex之后,否则报错
    // 如果在main.js 使用 然后引包,脚手架会先执行所以import代码再执行其他代码 也会报错
    Vue.use(Vuex)// 定义actions-用于响应组件中的动作(mutations)
    const actions = {}// 定义mutations-用于操作数据(state)
    const mutations = {}// 定义state,用于存储数据
    const state = {}// 创建Store
    const store = new Vuex.Store({actions,mutations,state
    })// 暴露store
    export  default store
    

  3. 配置store

    // main.jsimport  store from "./store"new Vue({render: h => h(App),store // 配置导入的store,在vm和vc身上可以通过.$store访问}).$mount('#app')
    

基本使用

1.初始化数据
// 定义state,用于存储数据
// 数据被mutations修改
const state = {// 定义一个countcount: 0
}
2. 配置actions
// 定义actions-用于响应组件中的动作(mutations)
// 该对象中的方法用于commit响应mutations中的方法操作数据
// 该对象被dispatch触发
const actions = {// 定义add方法// context:上下文对象,包含commit、dispatch、getter、state、roomGetter、rootState // value是调用方传递的值  add: function (context, value) {// 将数据提交到ADD方法(mutations中定义的),此时不会直接修改数据// 可以通过context.dispatch触发其他actionscontext.commit("ADD", value)}
}
3. 配置mutations
// 定义mutations-用于操作数据(state)
// 该对象被actions中的commit and 其他地方的commit触发
const mutations = {ADD(state, value) {// state是数据对象,包含getter、setter等// value是调用方传递的值// 通过数据对象操作数据,此时会直接修改值state.count += value}}
4.操作store.js
methods: {increment(){// 触发回调的时候 调用$store.dispatch,调用actions里的add方法,参数是n// actions相当于一个中转,如果参数需要做其他逻辑处理调用dispatchthis.$store.dispatch("add",this.n)// 也可以直接操作this.$store.commit("ADD",this.n),调用mutations里的ADD方法// 如果不需要其他逻辑处理,直接修改数据调用committhis.$store.commit("ADD",this.n)}
5.模版中访问
<!-- 模版中直接通过$store访问 -->
{{$store.state.count}}

getters配置项

getters的功能类似于 Vue 组件中的计算属性。它们都是用于对已有的数据(在 Vuex 中是state)进行计算或者过滤后返回一个新的值

  1. 定义getters

    // 用于将state中的数据进行加工
    const getters = {// 定义一个doubleCount属性doubleCount(state){// state 是数据对象return state.count * 2}
    }const store = new Vuex.Store({actions,mutations,state,getters
    })
  2. 使用getters

    this.getters.doubleCount
    
    <!-- 模版中使用 -->
    {{$store.getters.doubleCount}}
    

store中的map方法

mapState

用于帮助我们映射state中的数据为计算属性

   ```js

import {mapState} from "vuex";

computed: {
// 对象写法 等同于 count(){{return this.$store.state.count}}
// 如果要修改state中的值 可以写箭头函数返回
...mapState({count: "count", count2: (state)=> state.count * 2}),
// 数组写法

// 等同于 count(){return this.$store.state.count}
// 相当于把stage中的数据以同名的方式映射到计算属性中
...mapState(["count"])

}
```

mapGetters

用于帮助我们映射getters中的数据为计算属性

      ```js

import {mapGetters} from "vuex"

computed: {
// 数组写法 doubleCount(){ return this.$store.getters.doubleCount}
...mapGetters(["doubleCount"]),
// 对象写法 doubleCount(){ return this.$store.getters.doubleCount}
...mapGetters({doubleCount: "doubleCount"})

}
```

mapActions

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

import {mapActions} from 'vuex'methods: {//  等同于 addCount(){this.$store.dispatch("add",value)}// 这里的value 需要在使用此回调函数的地方绑定 @click="addCount(要传递的参数)"// 如果不在使用的地方绑定,则ADD方法内部收到的value 是点击事件...mapActions({addCount: "add"}),// 数组写法,原理与mapState一致...mapActions(["add"]),},
mapMutations

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

import {mapMutations} from 'vuex'methods: {//  等同于 increment(){this.$store.commit("ADD",value)}// 这里的value 需要在使用此回调函数的地方绑定 @click="increment(要传递的参数)"// 如果不在使用的地方绑定,则increment方法内部收到的value 是点击事件...mapMutations({increment: "ADD"}),// 数组写法,原理与mapState一致...mapMutations(["ADD"]),},

vuex模块化&命名空间

当 Vue 应用规模变大时,store中的状态(state)、变更操作(mutations)、异步操作(actions)和获取器(getters)也会变得复杂繁多。Vuex 模块化允许将store分割成多个模块,每个模块都有自己独立的statemutationsactionsgetters,就像有多个小的 Vuex store一样。

模块化使得代码结构更加清晰,便于团队开发和维护。不同的功能模块可以有各自独立的状态管理逻辑,例如一个电商应用中,可以有用户模块、商品模块、订单模块等,每个模块管理自己相关的状态和操作

模块化
  • 包含多个 module ,一个 module 是一个 store 的配置对象 与一个组件(包含有共享数据)对应
  1. 定义模块

    // 自定义一个对象,里面包含vuex的对方方法
    const sumOptions = {actions: {},mutations:{},state:{},getters:{sum:10}}// 自定义一个对象,里面包含vuex的对方方法
    const countOptions = {actions: {},mutations:{},state:{count:20}}//创建并暴露store
    export default new Vuex.Store({// 模块配置modules: {// store里面有一个sum模块,对应的是sumOptions对象里面的方法sumModules: sumOptions,// store里面有一个count模块,对应的是countOptions对象里面的方法countModules: countOptions}})
    
  2. 使用模块store数据

    {{$store.state.sumModules.sum}}
    
    this.$store.state.sumModules.sum
    
  3. 通过map方法映射模块对象访问

        // 映射的是模块对象...mapState(["sumModules","countModules"])
    
    <!--在模版中可以使用 {{模块名.属性访问}}-->
    {{sumModules.sum}}
    
命名空间

可以开启模块的命名空间,使用map方法的时候通过指定模块名字和属性、方法名字进行映射

  1. 通过namespaced开启命名空间

    const sumOptions = {namespaced:true, // 开启命名空间actions: {},mutations:{},state:{sum:10},}
    
  2. 读取指定模块的数据

    // 使用map读取
    // new store的时候指定的模块名、要映射的属性,其他map方法方法映射同理
    ...mapState("sumModules",["sum"])
    // {{sum}}
    
    // 自己直接读取  state.模块名.属性名
    this.$store.state.sumModules.sum
    
  3. 读取getters数据

    // 使用map读取
    // 模块名,[要映射的数据]
    ...mapGetters('countAbout',['bigSum'])
    
    // 直接读取  模块名/属性名
    this.$store.getters['sumModules/doubleSum']
    
  4. commit和dispatch

    // 直接读取
    //  模块名/方法名,参数
    this.$store.commit("sumModules/ADD",100)
    this.$store.dispatch("sumModules/add",100)
    
    // 使用map映射   模块名  [要映射的方法]
    ...mapMutations('sumModules',{setSum:'ADD'}),...mapActions('sumModules',{commitSum:'add'})// 传参原理与未开启命名空间原理一致
    
模块化推荐设计
  • store 文件夹:在项目的根目录下创建一个专门的store文件夹,用于存放所有与 Vuex 相关的代码。这个文件夹是整个 Vuex 模块管理的核心区域。
  • 模块文件夹:在store文件夹内,为每个主要的功能模块创建一个单独的文件夹。例如,如果是一个电商应用,可以有user模块文件夹、product模块文件夹、order模块文件夹等。每个模块文件夹用于存放该模块相关的statemutationsactionsgetters的定义文件,export暴露给外部
  • index中用于注册vuex插件、new vuex对象、导入所有模块,统一管理

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

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

相关文章

一文读懂基线扫描和漏洞扫描的区别

在网络安全领域,基线扫描和漏洞扫描是两种常见的安全评估手段。它们都旨在保护企业免受网络威胁,但它们的作用、方法和目的各有不同。本文将为您详细解析这两种扫描技术的区别。 一、基线扫描 基线扫描是一种评估系统配置是否符合特定安全标准的扫描技术。它通常用于确保系统…

【AutoCAD Mechanical 2024机械版下载与安装教程】

‌‌‌AutoCAD Mechanical与基础版AutoCAD的主要区别在于其专业领域和功能扩展: 应用领域和功能扩展 AutoCAD Mechanical是专门为制造业设计的,主要用于加速机械设计流程。它包含了AutoCAD的所有基础功能,并增加了许多专门用于机械工程设计的工具,如自动生成机械构件、标注…

性能测试指标

一、吞吐量吞吐量、带宽、并发量的区别吞吐量在网络中:指网络、设备、端口或其他设备在单位时间内成功地传输数据的数量,通常比bit/byte为单位,它代表了网络设备实际传输数据的速率(在现实情况种可能受网络拥堵、设备性能的影响) 在性能测试中:可以用事务数量(TPS)或请…

Nuxt.js 应用中的 webpack:compile 事件钩子

title: Nuxt.js 应用中的 webpack:compile 事件钩子 date: 2024/11/22 updated: 2024/11/22 author: cmdragon excerpt: webpack:compile 钩子是 Nuxt.js 和 Webpack 集成中的一个重要部分,它允许开发者在实际编译过程开始之前执行一些自定义逻辑。通过这一钩子,您可以获取…

PTA题目集4~6的总结性Blog

前言 本次的三个作业,由答题判题程序- 4、家居强电电路模拟程序- 1、家居强电电路模拟程序 -2组成。 答题判题程序-4是对前三次判题程序的最后升级,设计多个子类继承于基础题类来实现对每种题型的判断和计算分值;而家居强电电路模拟程序-1则是对输入的各个设备在串联关系中的…

你能想到固态硬盘能导致SQL Server localdb 2019不能启动?

问题 有一段时间没用了VS2022了,今天把它升级到17.12,然后打开项目发现localdb不能用了,启动不起来。 Win11 24H2 SQL Server LocalDb 2019 Visual Studio 2022 17.12C:\Windows\System32>sqllocaldb delete localDB1 LocalDB instance "localDB1" deleted.C:\…

Flutter app - testing

1. 在flutter_test中,setUp, tearDown是什么含义?在 `flutter_test` 中,`setUp` 和 `tearDown` 是两个用于管理测试前后状态的回调函数。它们的目的是在每个测试执行前后进行必要的初始化和清理工作。### 1. **setUp**`setUp` 是在每个测试函数执行之前调用的。它通常用于初…

[72] (多校联训) A层冲刺NOIP2024模拟赛25

flowchart TBA(图)style A color:#ffffff,fill:#00c0c0,stroke:#ffffff 用了 bitset,复杂度比较悬以及完全没用到题目里提示的 __builtin_popcountll(),所以有点心里没底 最重要的是最后三分钟拍子挂了,给我吓一跳,后来检查发现是 Linux 莫名其妙的问题,答案文件没更新 首…

vxe-upload 上传图片显示进度

官网:https://vxeui.com/ <template><div><vxe-upload v-model="imgList" mode="image" multiple show-progress :upload-method="uploadMethod"></vxe-upload></div> </template><script> import a…

触控触感IC原厂/抗干扰18按键触摸触控芯片VK3618I SSOP28,工作电流典型值600uA

产品品牌:永嘉微电/VINKA 产品型号:VK3618I 封装形式:SSOP28 概述 VK3618I具有18个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较 高的集成度,仅需极少的外部组件便可实现触摸按键的检测。 提供了2组I2C输出功能,1个INT中断输出脚,2组I2C脚和INT可并联…

vxe-select 下拉列表使用虚拟滚动加载上万选项列表

官网:https://vxeui.com 正常使用下拉框加载上万列表选项非常卡,使用虚拟滚的的下拉框之后就可以毫秒加载 50万行下拉选项<template><div><p><vxe-button @click="loadData(100)">加载1百条</vxe-button><vxe-button @click=&quo…

[微服务] 为 gRPC 服务添加 JWT 认证,使用 Apifox 客户端进行测试

gRPC 测试客户端 Apifox = Postman + Swagger + Mock + JMeterhttps://apifox.com/为何使用 gRPC? 相较于 REST 使用 gRPC 服务具有以下优势: 性能方面高效的通信协议gRPC 基于 HTTP/2 协议,而 RESTful API 通常基于 HTTP/1.1。HTTP/2 支持多路复用,能在一个 TCP 连接上同时…