【Vue3】Vuex状态管理

news2024/11/18 4:22:01

Vuex状态管理

      • 附:eslin中定义了不使用会报错
      • 认识应用状态管理
          • 什么是状态管理
          • 旧模式下的状态管理
      • Vuex的基本使用
          • 安装Vuex
          • 单一状态树
      • State
          • 使用vuex的方式(Vue3)
          • mapState辅助函数(Vue2)
      • Mutations
          • mutations的使用和携带参数(Vue2)
          • mutations使用常量定义名的写法(Vue2)
          • mutations的使用(Vue3)
      • Actions
          • actions的使用(Vue2)
          • 页面使用
          • 页面使用有点繁琐,提供辅助函数 (Vue2)
          • actions的使用映射(Vue3)
          • actions的默认使用方法Vue3)
          • actions的异步调用(Vue3)
      • Getters
          • 页面getters数据使用(Vue2)
      • Modules
          • 步骤一,建立子模块
          • 步骤二,主模块中导入子模块
          • 步骤三,页面中使用state中数据的时候,要加上子模块一层
          • 步骤四,页面中使用getters中数据的时候,不需要加上子模块一层,直接用
          • 子模块命名空间
          • 设置命名空间为true后,页面调用方式变化
          • module也可以修改或派发根组件哦!

附:eslin中定义了不使用会报错

  • 很不方便,去关闭它
    在这里插入图片描述

认识应用状态管理

什么是状态管理
  • 开发中,需要进行各种各样的数据处理。这些数据需要保存再我们应用中的某一个位置,对于他们的管理就是状态管理
旧模式下的状态管理
  • vue中的采用组件化的开发方式
  • 而在组件中我们定义data或者在setup中返回使用的数据。这些数据称之为state
  • 而在模板template中可以使用这些数据,模板被渲染为DOM,我们称为View
  • 在模块中产生的行为动作,处理这写行为事件的时候,有可能会修改state,这个行为事件称之为actions

Vuex的基本使用

  • 当对复杂的数据的状态管理的时候,会越来越庞大
  • 当程序复杂时候。本身的state之间也会互相影响,会变得难以控制
  • 解决方法:
  • 考虑将组件的内部状态抽离出来,以一个全局单例的方式来管理
  • 在这种模式下,组件树内构成一个巨大的视图View
  • 不管在树的哪个位置,任何组件都能随时获取状态或者触发行为
  • 通过定义和隔离状态管理各个概念,并且通过强制性的规则来维护视图和状态间的独立性
安装Vuex
npm install vuex
单一状态树
  • Vuex采用单一状态树
  • 用一个对象就包含了全部的应用层级的状态
  • 采用的是SSOT,也就是单一数据源,也就是只有一个store
  • 优势,单一状态树能够让我们最直接的方式找到某个状态的片段

State

  • 一般新建store文件夹,,创建index.js文件·
    在这里插入图片描述
  • main.js导入挂载
    在这里插入图片描述
使用vuex的方式(Vue3)
  • 可以改数据,官方不建议直接修改state,必须通过提交Mutations
    在这里插入图片描述

  • Mutations修改state修改
    在这里插入图片描述在这里插入图片描述

mapState辅助函数(Vue2)
  • Vue2中的计算属性的映射状态
  • 通过mapState辅助函数
    在这里插入图片描述

Mutations

  • 重要原则:mutations必须是同步函数
  • 这是因为devtool工具会记录mutation的日记
  • 每一条mutation被记录,devtools都需要捕捉到前一状态和后一状态的快照
  • 但是在mutation中执行异步操作,就无法追踪到数据变化
  • vue2中
  • 通过commit方法
    在这里插入图片描述
mutations的使用和携带参数(Vue2)
  • vue2中
  • 对象风格的提交方式
    在这里插入图片描述
    在这里插入图片描述
mutations使用常量定义名的写法(Vue2)
  • 步骤一:新建一个集中管理常量的地方,并导出
    在这里插入图片描述
  • 步骤二:vuex中导入并定义对应的方法
    在这里插入图片描述
  • 步骤三,页面使用
    在这里插入图片描述
mutations的使用(Vue3)

在这里插入图片描述

<template>
  <div class="app">
    <h3>当前vuex的值:{{ $store.state.num }}</h3>
    <h3>当前vuex的值:{{ $store.state.num1 }}</h3>

    <button @click="setnum">修改vuex值</button>
    <button @click="getnum">mutations修改vuex值</button>
  </div>
</template>
<script setup>
import { useStore } from "vuex";
const store = useStore();
function setnum(){
  store.commit('setrenum')
}
function getnum(){
  store.commit('Textnum',{name:"乞力马扎罗"})
}
</script>

Actions

actions的使用(Vue2)
  • actions提交的是mutation,而不是直接变更状态
  • actions可以包含任意异步操作
  • (参数context)
  • context是一个和store实例具有相同的方法和属性的context对象
  • 故。可以从其中获取到commit方法来提交mutation
  • 也。可以通过context.state和context.getters来获取state和getters
  • 修改对象
    在这里插入图片描述
页面使用
  • vue2中,获取
getnum() {
    this.$store.dispatch("getnumAct");
},
  • 修改对象
 setnum() {
      let obj ={
        name:"乞力马扎罗",
        type:1,
      }
     this.$store.dispatch("setnumAct",obj);
    },
页面使用有点繁琐,提供辅助函数 (Vue2)

在这里插入图片描述

actions的使用映射(Vue3)
<template>
  <div class="app">
    <h3>当前vuex的值:{{ $store.state.num }}</h3>
    <h3>当前vuex的值:{{ $store.state.num1 }}</h3>

    <button @click="setnumAct({ name: 'qqq' })">修改vuex值</button>
    <button @click="getnumAct">Actions修改vuex值</button>
  </div>
</template>
<script setup>
import { mapActions, useStore } from "vuex";
const store = useStore();

// const { getnumAct, setnumAct } = mapActions(["setnumAct", "getnumAct"]);
// 直接使用是使用不了的,因为这个方法里面本身是this.$store这样的方式的,setup里面不支持

// 解决方法
// 循环,通过bind,将store绑定在store身上
const actions = mapActions(["setnumAct", "getnumAct"]);
const newobject = {};
Object.keys(actions).forEach(key => {
  newobject[key] = actions[key].bind({ $store: store });
});
const { getnumAct, setnumAct } = newobject;
</script>
actions的默认使用方法Vue3)
<template>
  <div class="app">
    <h3>当前vuex的值:{{ $store.state.num }}</h3>
    <h3>当前vuex的值:{{ $store.state.num1 }}</h3>

    <button @click="setnum">修改vuex值</button>
    <button @click="getnumAct">Actions修改vuex值</button>
  </div>
</template>
<script setup>
import { mapActions, useStore } from "vuex";
const store = useStore();
//
function setnum() {
  store.dispatch("setnumAct", { name: "qqq" });
}
//
function getnum() {
  store.dispatch("getnumAct");
}
</script>
actions的异步调用(Vue3)
  • 目的知道action是什么时候结束的
 actions: {
     getnumAct(context) {
         return new Promise((resolve, reject) => {
             resolve()
         })
     }
  }

在这里插入图片描述

Getters

  • 某些属性我们可能需要经过变化后来使用,这个时候需要getters
  • 参数一,state获得state定义的数据
  • 参数二,代表其他getters,可以调用getters中的其他getters
    在这里插入图片描述
页面getters数据使用(Vue2)
  • Vue2中
  • 方式一:页面直接调用
  • 方式二:通过mapGetters辅助函数调用
    在这里插入图片描述
  • vue3中的setup中 通过toRefs (Vue3)
<script setup>
import { toRefs } from "vue";
import { useStore } from "vuex";

const store = useStore();

const {addnum} =toRefs(store.getters)
</script>
  • 方式二:通过computed属性(Vue3)
<script setup>
import { computed } from "vue";
import { useStore } from "vuex";

const store = useStore();

const {addnum} =computed(()=>store.getters.num)
</script>

Modules

  • 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象,当应用变得非常复杂的时候,store对象会变得非常复杂
  • 为了解决上面问题,Vuex允许我们将store分割成模块(modules)
  • 每个模块拥有自己的state,mutation,action,getter,甚至是嵌套子模块
步骤一,建立子模块
  • 可以新建一个专门存放子模块的地方

在这里插入图片描述

步骤二,主模块中导入子模块

在这里插入图片描述

步骤三,页面中使用state中数据的时候,要加上子模块一层

在这里插入图片描述

步骤四,页面中使用getters中数据的时候,不需要加上子模块一层,直接用
<h3>当前vuex的值:{{ $store.state.home.num1 }}</h3>
<h3>当前vuex的getters值:{{ $store.getters.addnum }}</h3>
子模块命名空间
  • 注意,子模块中的mutation和getters和actions最终会合并在主模块中,命名不可和其他模块重复
  • 也就是说,默认情况下。模块内部的action和mutation和getters仍然是注册在全局的命名空间中的
  • 这样使多个模块能够对同一个action或mutation或getters作出响应
  • 如果我们希望模块具有更高的封装性和复用性,可以添加namespaced:true的方式使其成为带命名空间的模块
    在这里插入图片描述
设置命名空间为true后,页面调用方式变化

在这里插入图片描述

module也可以修改或派发根组件哦!

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

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

相关文章

前向传播与反向传播涉及到的知识点

目录 引入&#xff1a; 一、神经网络&#xff08;NN&#xff09;复杂度 空间复杂度 时间复杂度 二、学习率 三、指数衰减学习率——解决lr的选择 1.总结经验 2.公式引入 四、激活函数 1.简单模型&#xff1a;最初的理解 2.激活函数MP模型 3.优秀的激活函数的特点 4.…

广州华锐视点:VR技术在航天教育的应用优势

VR技术在航天教育中的应用可以带来许多创新和优势&#xff0c;为学生和公众提供更加生动、沉浸式的航天科学学习体验。以下是VR技术在航天教育中的几个主要应用方面&#xff1a; 航天探索模拟&#xff1a;VR技术可以模拟航天探索的场景&#xff0c;让学生和公众身临其境地感受航…

FFmpeg<第一篇>:环境配置

1、官网地址 http://ffmpeg.org/download.html2、linux下载ffmpeg 下载&#xff1a; wget https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2解压&#xff1a; tar xvf ffmpeg-snapshot.tar.bz23、FFmpeg ./configure编译参数汇总 解压 ffmpeg-snapshot.tar.bz2 之后&…

Vulnhub: DriftingBlues: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.215 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.215 80端口首页源码 访问noteforkingfish.txt&#xff0c;发现为Ook!加密的密文 解密后提示需要用户eric和修改hosts文件&…

【Python编程】将同一种图片分类到同一文件夹中

一、数据结构如下&#xff1a; 二、编程工具&#xff1a;Jupyter-Notebook 三、代码&#xff1a; import os import cv2 import shutilpath0os.getcwd()\\apple\\RGB path1os.getcwd()\\apple\\tof_confidence path2os.getcwd()\\apple\\tof_depth path3os.getcwd()\\apple\\…

教你写出高质量函数,简单又实用

在编写函数时&#xff0c;程序员通常需要遵循以下步骤进行&#xff1a; 1、确定最佳的设计逻辑是编写函数时应该考虑的重要因素。这些因素包括设计合理的数据结构、算法和逻辑封装&#xff0c;并且还要考虑到用户的安全因素。挑战在于确保所设计的方案既满足客户需求&#xff…

药品不良反应数据库有哪些?记住这个就够用了

药品不良反应数据库的作用是收集、记录和分析药品使用过程中可能出现的不良反应信息。这些数据库通常由医药监管机构、医药数据公司、医疗机构和科研机构等建立和维护&#xff0c;在监测和评估药品的安全性、发现和确认新的不良反应、支持药品监管决策、提供医学信息和警示等方…

【局部活动轮廓】使用水平集方法实现局部活动轮廓方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

会员管理系统实战开发教程04-会员开卡

我们已经用3篇篇幅介绍了会员管理的功能&#xff0c;接着就要开发会员的业务。通常我们开通会员之后需要给会员开通会员卡&#xff0c;一个会员可以有多张会员卡。 在数据源设计的时候&#xff0c;像这种一个会员有多张会员卡的&#xff0c;我们称之为一对多的关系&#xff0c…

Sentinel流量控制与熔断降级

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

Levels - 场景参考:山脉景观(Landscape Mountains)

一些从前的笔记的归档&#xff0c;记录了一些UE4资产的相关信息&#xff1b; 山脉景观&#xff08;Landscape Mountains&#xff09;&#xff1a; 项目的地形材质比较复杂&#xff0c;有几个比较重要的大效果功能&#xff0c;一个是沉积岩的效果&#xff1a; 沉积岩效果的功能…

聊聊NFC技术

目录 1.什么是NFC 2.NFC技术的原理 3.NFC技术的应用 4.NFC技术对生活的影响 1.什么是NFC NFC&#xff08;Near Field Communication&#xff09;是一种短距离无线通信技术&#xff0c;可在10厘米以内进行点对点的数据传输。它是基于RFID&#xff08;Radio Frequency Identif…

基于OpenCV实战(基础知识二)

目录 简介 1.ROI区域 2.边界填充 3.数值计算 4.图像融合 简介 OpenCV是一个流行的开源计算机视觉库&#xff0c;由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包&#xff0c;可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。Ope…

IDEA 出现问题:.gitgnore忽略文件失效解决方案

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作者&#x1f3c6; ❤️技术活&#xff0c;该赏 ❤️点赞…

光惯混合动作捕捉系统:开启空间定位全新时代

在当今的技术前沿&#xff0c;光惯混合动作捕捉系统正在崭露头角&#xff0c;成为定位技术的新标杆&#xff0c;更是一项生活中不可或缺的实用工具。它是一个集光学与惯性测量技术于一体的全新定位解决方案&#xff0c;巧妙地融合了光学与惯性测量的优势&#xff0c;以其突破性…

Mars3d的历史版本api文档下载地址

说明&#xff1a; 1.我们一直在进步迭代新功能升级产品打造服务&#xff0c;但是鉴于目前依然有很多老的项目无法升级&#xff0c;需要维护。现提供历史版本的api文档供大家学习参考 2.建议跟随官网同步升级新版本&#xff0c;新功能更多&#xff0c;更值得大家快速上手。 3…

【速成】蓝桥杯嵌入式省一教程:(十一)UART串口通信

与I2C、SPI一样&#xff0c;UART是一种通信协议&#xff0c;设备之间依靠Rx(Receive)与Tx(Transmit)两条线进行数据传输。一个单片机通常内置有多个UART&#xff0c;而这些UART通常都与单片机上的USB接口连接在一起&#xff0c;因此只需要将单片机通过数据线与电脑相连&#xf…

CK-GW06-E03与汇川PLC的EtherNet/IP通信

准备阶段&#xff1a; CK-GWO6-E03网关POE交换机网线汇川PLC编程软件汇川AC801-0221-U0R0型号PLC 1.打开汇川PLC编程软件lnoProShop(V1.6.2)SP2 新建工程&#xff0c;选择对应的PLC型号&#xff0c;编程语言选择为“结构化文本&#xff08;ST&#xff09;语言”&#xff0c;然…

数据库连接池druid 的jar包官网下载-最新版下载

进入官网Central Repository: com/alibaba/druid 往下滑 找到最新版点击进入 找到该jar包 点击即可下载

树状表格父节点选择 - 在Vue.js中实现仅选择父节点的树状表格功能

功能介绍 本文介绍了如何在Vue.js框架下实现一个树状表格&#xff0c;其中只支持选择父节点的复选框。通过这个功能&#xff0c;用户可以方便地选择表格中的父节点&#xff0c;而无需关心子节点的选择。代码示例和详细的实现步骤将展示如何使用Vue.js的相关特性和组件实现这个功…