第二十五节——Vuex--历史遗留

news2025/1/12 8:57:29

文档地址

Vuex 是什么? | Vuex

version

V4.x

一、概念

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。一个状态自管理应用包含以下几个部分:

  • 状态,驱动应用的数据源;
  • 视图,以声明方式将状态映射到视图;
  • 操作,响应在视图上的用户输入导致的状态变化。

以下是一个表示“单向数据流”理念的简单示意:

二、目的

1、思考以下问题

如果你的项目里有很多页面(组件/视图),页面之间存在多级的嵌套关系,此时,这些页面假如都需要共享一个状态的时候,此时就会产生以下两个问题:

  • 多个视图依赖同一个状态
  • 来自不同视图的行为需要变更同一个状态

2、目前能想到的解决方案

对于第一个问题,假如是多级嵌套关系,你可以使用父子组件传参进行解决,虽有些麻烦,但好在可以解决;对于兄弟组件或者关系更复杂组件之间,就很难办了,虽然可以通过各种各样的办法解决,可实在很不优雅,而且等项目做大了,代码就会变成屎山,实在令人心烦。

对于第二个问题,你可以通过父子组件直接引用,或者通过事件来变更或者同步状态的多份拷贝,这种模式很脆弱,往往使得代码难以维护,而且同样会让代码变成屎山

3、vuex出场

把各个组件都需要依赖的同一个状态抽取出来,在全局使用单例模式进行管理。

在这种模式下,任何组件都可以直接访问到这个状态,或者当状态发生改变时,所有的组件都获得更新。

这就是 Vuex 背后的基本思想,借鉴了 Flux、Redux。与其他模式不同的是,Vuex 是专门为 Vue 设计的状态管理库,以利用 Vue.js 的细粒度数据响应机制来进行高效的状态更新

三、安装

npm install vuex

四、名词概念

1、state

Vuex 使用单一状态树——是的,用一个对象就包含了全部的应用层级状态。至此它便作为一个“唯一数据源 (SSOT)”而存在。这也意味着,每个应用将仅仅包含一个 store 实例。单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快照

2、getter

计算属性,可以理解成和页面中的计算属性用法一致

3、Mutation

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type)和一个回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数。注意:mutation是同步的

4、Action

类似于mutation,但是它是异步的。不能直接修改state

5、Module

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分

代码演示

使用vuex在页面中实现num++

在src下创建store目录,并添加index.js文件

/**
 * 从vuex 中引入 createStore
 */
import { createStore } from 'vuex'

// 创建一个新的 store 实例
const store = createStore({
  /**
   * state 是一个方法,存放状态的地方
   * @returns 
   */
  state () {
    /**
     * return的就是当前的状态
     */
    return {
      num: 0
    }
  },

  /**
   * 同步修改state
   */
  mutations: {
    /**
     * 接收的第一个参数是当前的state
     * 第二个参数是传过来的参数
     * @param {*} state 
     */
    add (state, name) {
      console.log(name)
      state.num++
    }
  },
  actions: {
    /**
     * 第一个参数是context 也就是当前上下文
     * 比如可以直接获取state、使用commit调用等
     * 
     * 第二个参数是页面传过来的参数
     * @param {} context 
     */
    asyncAdd (context, name) {
      console.log(name)
      /**
       * 使用commit 调用 mutations里面的方法改变数据
       * 第一个参数是方法名
       * 第二个是要传的参数
       */
      context.commit('add', name)
    }
  }
})

export default store

在入口文件引入,并用use挂载

import { createApp } from "vue";
// import App from './App.vue'
// import LearnEvent from './learn-event.vue'
import LearnComponent from "./learn-component.vue";
// 引入要定义的全局组件
import GlobalComponent from "./components/globalComponent.vue";
import LearnParent from './learn-parent.vue'
import LearnSlot from './learn-slot.vue'
import LearnLife from './learn-life.vue'
import router from './router'
import LearnRouter from './learn-router.vue'
import vuex from './store'

createApp(LearnRouter)
  // 使用use 方法 把我们路由挂载到vue上
  .use(router)
  // 使用 use 把vuex挂载到实例上
  .use(vuex)
  .mount("#app");

页面中使用

<template>
  <div>
    {{$store.state.num}}
    <button @click="add">+1</button>
    <button @click="asyncAdd">action</button>
  </div>
</template>
<script>
export default {

  methods: {
    add () {
      /**
       * 使用this.$store.commit方法调用mutations里面的方法
       * 第一个参数是方法名
       * 第二个参数是要传的参数
       */
      this.$store.commit('add', '张三')
    },

    asyncAdd () {
      /**
       * 使用 dispatch 调用 action里面的方法
       */
      this.$store.dispatch('asyncAdd', '李四')
    }
  }

}
</script>

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

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

相关文章

大数据Doris(二十一):数据导入演示

文章目录 数据导入演示 一、启动zookeeper集群(三台节点都启动) 二、启动hdfs集群

计算机网络——物理层-传输方式(串行传输、并行传输,同步传输、异步传输,单工、半双工和全双工通信)

目录 串行传输和并行传输 同步传输和异步传输 单工、半双工和全双工通信 串行传输和并行传输 串行传输是指数据是一个比特一个比特依次发送的。因此在发送端和接收端之间&#xff0c;只需要一条数据传输线路即可。 并行传输是指一次发送n个比特&#xff0c;而不是一个比特&…

图论13-最小生成树-Kruskal算法+Prim算法

文章目录 1 最小生成树2 最小生成树Kruskal算法的实现2.1 算法思想2.2 算法实现2.2.1 如果图不联通&#xff0c;直接返回空&#xff0c;该图没有mst2.2.2 获得图中的所有边&#xff0c;并且进行排序2.2.2.1 Edge类要实现Comparable接口&#xff0c;并重写compareTo方法 2.2.3 取…

强化学习中蒙特卡罗方法

一、蒙特卡洛方法 这里将介绍一个学习方法和发现最优策略的方法&#xff0c;用于估计价值函数。与前文不同&#xff0c;这里我们不假设完全了解环境。蒙特卡罗方法只需要经验——来自实际或模拟与环境的交互的样本序列的状态、动作和奖励。从实际经验中学习是引人注目的&#x…

如何使用pngPackerGUI_V2.0,将png图片打包成plist的工具

pngPackerGUI_V2.0&#xff0c;此软件是在pngpacker_V1.1软件基础之后&#xff0c;开发的界面化操作软件&#xff0c;方便不太懂命令行的小白快捷上手使用。 具体的使用步骤如下&#xff1a; 1.下载并解压缩软件&#xff0c;得到如下目录&#xff0c;双击打开 pngPackerGUI.e…

SFTP远程终端访问

远程终端访问 当服务器部署好以后&#xff0c;除了直接在服务器上操作&#xff0c;还可以通过网络进行远程连接访问CentOS 7默认支持SSH(Secure Shell, 安全Shell 协议),该协议通过高强度的加密算法提高了数据在网络传输中的安全性&#xff0c;可有效防止中间人攻击(Man-in-th…

AI绘画神器DALLE 3的解码器:一步生成的扩散模型之Consistency Models

前言 关于为何写此文&#xff0c;说来同样话长啊&#xff0c;历程如下 我司LLM项目团队于23年11月份在给一些B端客户做文生图的应用时&#xff0c;对比了各种同类工具&#xff0c;发现DALLE 3确实强&#xff0c;加之也要在论文100课上讲DALLE三代的三篇论文&#xff0c;故此文…

web:[网鼎杯 2018]Fakebook

题目 点进页面&#xff0c;页面显示为 查看源代码 用dirsearch扫一下&#xff0c;看一下有什么敏感信息泄露 扫出另一个flag.php和robots.txt&#xff0c;访问flag.php回显内容为空 请求robots.txt 网页提示/user.php.bak&#xff0c;直接访问会自动下载.bak备份文件 进行代码…

Flink在汽车行业的应用【面试加分系列】

很多同学问我为什么要发这些大数据前沿汇报&#xff1f; 一方面是自己学习完后觉得非常好&#xff0c;然后总结发出来方便大家阅读&#xff1b;另外一方面&#xff0c;看这些汇报对你的面试帮助会很大&#xff0c;特别是面试前可以看看即将面试公司在大数据前沿的发展动向&…

DevOps平台两种实现模式

我们需要一个DevOps平台 要讨论DevOps平台的实现模式&#xff0c;似乎就必须讨论它们的概念定义。然而&#xff0c;当大家要讨论它们的定义时&#xff0c;就像在讨论薛定谔的猫。 A公司认为它不过是自动化执行Shell脚本的平台&#xff0c;有些人认为它是一场运动&#xff0c;另…

代码随想录算法训练营|动态规划三十八天~四十三天

动态规划五部曲&#xff1a; 1、确定dp数组以及下标的含义 2、确定递推公式 3、dp数组如何初始化 4、确定遍历顺序 5、举例推导dp数组 三十八天 斐波那契数 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; public class Solution {public int MonotoneIncre…

训练日志刷屏使我痛苦,我开发了VLog

训练日志刷屏使我痛苦&#xff0c;我开发了VLog&#xff0c;可以在任意训练代码中轻松使用~ 例如&#xff0c;通过callback嵌入到lightgbm/catboost/transformers/ultralytics&#xff0c;乃至keras库的训练代码流程中~ before: after&#xff1a; 为什么不用tensorboard或者wa…

Linux的make和Makefile

目录 一、 介绍二、快速使用三、依赖关系和依赖方法四、语法 一、 介绍 1、makefile带来的好处就是——“自动化编译”&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0c;极大的提高了软件开发的效率。 2、make是一个命令工具&…

dcat admin 各种问题

样式问题 如何根据条件给表格数据栏添加背景色 use Illuminate\Support\Collection;protected function grid(){return Grid::make(new BookArticle(), function (Grid $grid) {... 其他代码// Collection的完整路径&#xff1a;Illuminate\Support\Collection;$grid->row…

火星加载WMTS服务

这是正常的加载瓦片 http://192.168.1.23:8008/geoserver/mars3d/gwc/service/wmts?tilematrixEPSG%3A4326%3A7&layermars3d%3Abuffer&style&tilerow46&tilecol197&tilematrixsetEPSG%3A4326&formatimage%2Fpng&serviceWMTS&version1.0.0&…

超详细介绍对极几何和立体视觉及 Python 和 C++实现

您是否想过为什么戴着特殊的 3D 眼镜观看电影时可以体验到美妙的 3D 效果?或者为什么闭上一只眼睛很难接住板球?这一切都与立体视觉有关,立体视觉是我们用双眼感知深度的能力。这篇文章使用 OpenCV 和立体视觉为计算机提供这种感知深度的能力。代码以 Python 和 C++ 形式提供…

迷雾系统-1 地图及其区块

创建UGUI地图,每块地块&#xff08;Image&#xff09;上添加AreaNode脚本&#xff0c;根据PolygonCollider2D可视化编辑碰撞体形状&#xff0c;并以此生成Mesh Mc_AreaNode脚本&#xff1a; private GameObject _objPrefab; //创建的Mesh预制体private float _canvasPosZ;pr…

[N-133]基于springboot,vue小说网站

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plus 本项…

【Java面向对象编程(中)】- 探索封装的秘密

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:Java学习系列专栏&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 回顾 封装​编辑 为什么进行封装 ​​编辑​ 如何调用私有的变量 ​​编辑​ 1.get set方法(当形参和成员变量不同名时)​…

LeetCode | 138. 随机链表的复制

LeetCode | 138. 随机链表的复制 OJ链接 思路&#xff1a; 题目要求我们拷贝一个带next指针与random随机访问指针的链表。 如果只拷贝一个只带next的指针&#xff0c;直接遍历目标链表依次拷贝每个节点的信息就可以了~~ 拷贝节点插入到原节点的后面处理copy节点的randomcop…