vuex的深入学习[基于vuex3]----篇(一)

news2025/1/17 3:41:33

vuex的深入学习[基于vuex3]----篇(一)

vuex框架的核心流程[基于vuex3]

在这里插入图片描述

  • Vue Components: Vue组件,html页面上,负责接受用户操作等交互行为,执行dispatch方法触发action进行回应
  • dispatch:操作行为触发方法,是唯一能执行action的方法
  • actions:操作行为处理模块,负责处理Vue Components接收到 所有交互行为,包括同步异步操作,支持多个同名方法,按照注册的顺序进行触发,向后台api请求的操作就在这个模块中进行,包括触发其他action以及提交mutation的操作,这个模块提供了promise的封装,以及支持action的链式触发
  • commit: 状态改变提交操作方法,对mutation方法进行提交,是唯一能执行mutation的方法
  • mutations: 状态改变操作方法,是vuex中修改state的唯一方法,其他修改方式再严格模式下会发生错误,该方法只能进行同步操作,而且方法名只能唯一,操作之中会有一些hook暴露出来,以及state的监控
  • state: 页面中状态管理容器对象,集中存储Vue components中的data对象的零散数据,全局唯一,以及进行统一的状态管理,页面显示所需要的数据从爱对象中进行读取,利用vue的颗粒度数据响应机制来进行高效的状态更新
  • getters: state对象读取方法,图中没有单独列出该模块,应该被包含在了render中,vue components通过该方法读取全局state对象。
    vue组件接受交互行为,调用dispatch方法触发action相关处理,如果页面状态需要进行改变,则调用commit方法提交mutation修改state,通过getters获取到state新值,重新渲染Vue components,页面随之更新

目录结构

在这里插入图片描述

在这里插入图片描述

*module: 提供module对象与module对象树的创建功能
*plugins: 提供开发辅助插件
*helpers.js: 提供action,mutations以及getters的查找API
*index.js: 源码程序的主入口,提供store的各module构建安装
*mixin.js: 提供了store在vue实例上的装载注入 // 在vuex3中
*utils.js: 提供了工具方法比如find, deepCopy, forEachValue以及assert等方法

index.js

import { Store, install } from './store'
import { mapState, mapMutations, mapGetters, mapActions, createNamespacedHelpers } from './helpers'
export default {
  Store,
  install,
  version: '__VERSION__',
  mapState,
  mapMutations,
  mapGetters,
  mapActions,
  createNamespacedHelpers
}
  • vue安装插件,通过vue.use()执行,该函数会调用插件暴露出来的install方法,然后将vue传递进来
  • install方法引用于store.js文件

store.js

判断如果处于浏览器环境下而且加载过vue,则执行install方法

if (!Vue && typeof window !== 'undefined' && window.Vue) {
    install(window.Vue)
}

install方法将vuex装载到vue对象上。

// vue插件安装函数,在vue.use的时候,将调用该方法
export function install (_Vue) {
  if (Vue && _Vue === Vue) {
//当执行环境不是production时候,在控制台中重复安装的报错
    if (process.env.NODE_ENV !== 'production') {
      console.error(
        '[vuex] already installed. Vue.use(Vuex) should be called only once.'
      )
    }
    return
  }
//用本地的变量保存外部传入的vue类
  Vue = _Vue
//向vue的各个组件中注入vuex实例,共享一个$store变量
  applyMixin(Vue)
}
  • 获取vue实例,判断vuex是否加载过,通过变量vue,保存vue调用install的方法,传入的vue类
  • 调用applyMixin()方法

mixin.js

export default function (Vue) {
  const version = Number(Vue.version.split('.')[0])

  if (version >= 2) {
    Vue.mixin({ beforeCreate: vuexInit })
  } else {
    // override init and inject vuex init procedure
    // for 1.x backwards compatibility.
    const _init = Vue.prototype._init
    Vue.prototype._init = function (options = {}) {
      options.init = options.init
        ? [vuexInit].concat(options.init)
        : vuexInit
      _init.call(this, options)
    }
  }

  /**
   * Vuex init hook, injected into each instances init hooks list.
   */

  function vuexInit () {
    const options = this.$options
    // store injection
    if (options.store) {
      this.$store = typeof options.store === 'function'
        ? options.store()
        : options.store
    } else if (options.parent && options.parent.$store) {
      this.$store = options.parent.$store
    }
  }
}

具体安装Vuex的函数

  1. 获取vue版本,根据不同的vue版本,进行不同的注入操作
    • vue2.0以上的,在vue的beforeCreate生命钩子中,执行安装函数,用了vue.mixin()混入的语法
    • 这里是通过mixin混合的方式,调用者是install传入的根vue实例,这里使用的是全局混合
    • 根据vue全局混合的定义,后续所有子组件都讲进行同样的混合
    • 所有子组件,在beforeCreate阶段都将调用vuexInit()方法
  2. 低于2.0版本的时候,没有声明周期钩子,只能将代码插入到vue的init中调用

vuexInit()方法

function vuexInit () {
    const options = this.$options
    // store injection
    if (options.store) {
        this.$store = typeof options.store === 'function'
        ? options.store()
        : options.store
    } else if (options.parent && options.parent.$store) {
        this.$store = options.parent.$store
    }
}
  1. 获取配置文件
  2. 这里的this,是vue实例,因为这个函数在vue的beforeCreate钩子中调用的,调用者是Vue实例
  3. this.$options中,是new Vue根实例的时候,传递的
  4. 如果有this.$options.store,则表示是Vue跟实例,因为store是在new Vue的时候传递进去的变量
import Vue from "vue"
import store from "./store"
new Vue({
    el: "#app",
    store,
    render: h => (APP)
})

如果有this.$options.store,如果传递的是函数,则调用该函数,则调用该函数,函数和vue的data是一样的,通过工厂模式,当多实例复用一个配置文件的时候。

export default() => {
    return new Vuex.Store({
        state,
        getters,
        actions,
        mutations,
        modules: {
            age: {
                state: {
                    vale: 19
                }
            }
        }
    })
}

如果没有options.store,证明调用本函数是vue的子组件,不是根实例,这是通过options.store,证明该函数调用的是vue的子组件,不是根vue实例,这是通过options.parent找到父组件的索引

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

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

相关文章

MySQL表解锁

查看锁信息 show full processlist 如果一个表被锁定了,会有一个 “Waiting for table metadata lock” 的提示,表明该表正在等待锁定。 解锁表 删除state上有值的事务 kill query 事务id 表解锁完成

Adobe Acrobat 编辑器软件下载安装,Acrobat 轻松编辑和管理各种PDF文件

Adobe Acrobat,它凭借卓越的功能和丰富的工具,为用户提供了一个全面的解决方案,用于查看、创建、编辑和管理各种PDF文件。 作为一款专业的PDF阅读器,Adobe Acrobat能够轻松打开并展示各种格式的PDF文档,无论是文字、图…

坎德拉candela3d光伏电站三维设计软件【无标题】

Candela3D 是一款基于 SketchUp(草图大师)开发的新一代光伏电站三维设计软件。它适用于复杂地形、平坦地形光伏电站的建设项目,同时适用于可研、初设、施工图、项目运营等阶段。这款软件具有多项功能,例如: • 能够突…

AcWing算法基础课笔记——求组合数3

求组合数Ⅲ 20万组数据, 1 ≤ b ≤ a ≤ 1 0 18 , 1 ≤ p ≤ 1 0 5 1 \le b \le a \le 10^{18}, 1\le p \le 10 ^5 1≤b≤a≤1018,1≤p≤105,使用卢卡斯定理。 卢卡斯定理: C a b ≡ C a m o d p b m o d p C a / p b / p ( m o d p ) C_a…

ASP.NETMVC-简单例子-从数据库构建Model+HTML帮助器

环境: win10,.NET Framework 4.6.1 参考: ASP.NET MVC 简介 | 菜鸟教程 https://www.runoob.com/aspnet/mvc-intro.html ASP.NET MVC HTML 帮助器 | 菜鸟教程 https://www.runoob.com/aspnet/mvc-htmlhelpers.html 上一篇: ASP.…

VS Code SSH 远程连接服务器及坑点解决

背景 Linux服务器重装了一下,IP没有变化,结果VS Code再重连的时候就各种问题,导致把整个流程全部走了一遍,留个经验帖以备查看 SSH 首先确保Windows安装了ssh,通过cmd下ssh命令查看是否安装了。 没安装,…

【STM32】STM32通过I2C实现温湿度采集与显示

目录 一、I2C总线通信协议 1.I2C通信特征 2.I2C总线协议 3.软件I2C和硬件I2C 二、stm32通过I2C实现温湿度(AHT20)采集 1.stm32cube配置 RCC配置: SYS配置: I2C1配置: USART1配置: GPIO配置&#…

图片覆盖攻击

点击劫持的本质是一种视觉欺骗。顺着这个思路,还有一些攻击方法也可以起到类似的作 用,比如图片覆盖。 一名叫 sven.vetsch 的安全研究者最先提出了这种 Cross Site Image Overlaying 攻击,简称 XSIO。sven.vetsch 通过调整图片的 style 使得…

中国港口年鉴(2000-2023年)

数据年限:2000-2023(齐全) 数据格式:pdf、excel 数据内容: 一、记述和反映了中国大陆江、海、河港口在深化改革、调整结构、整合资源、开拓经营、加快建设等方面所取得的成就和发展进程,香港特别行政区、澳…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-25使用块的网络VGG

25使用块的网络VGG import torch from torch import nn import liliPytorch as lp import matplotlib.pyplot as plt# 定义VGG块 # num_convs: 卷积层的数量 # in_channels: 输入通道的数量 # out_channels: 输出通道的数量 def vgg_block(num_convs, in_channels, out_channel…

MyBatis映射器:一对多关联查询

大家好,我是王有志,一个分享硬核 Java 技术的金融摸鱼侠,欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 在学习完上一篇文章《MyBatis映射器:一对一关联查询》后,相信你已经掌握了如何在 MyBatis 映射器…

天气冷电脑不能启动找不到硬盘

https://diy.zol.com.cn/2004/0611/101994.shtml

es的检索-DSL语法和Java-RestClient实现

基本语法: GET /索引库名/_search {"query": {"查询类型": {"查询条件"}} }RestClient的导入在RestClient操作索引库和文档有介绍 查询所有: # 查询所有 GET /test/_search {"query": {"match_all"…

Linux操作系统段式存储管理、 段页式存储管理

1、段式存储管理 1.1分段 进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址。内存分配规则:以段为单位进行分配…

【高考选专业 | 家长篇】2024,计算机何去何从?小P老师带你看

目录 2024年,计算机相关专业还值得选择吗?1.行业竞争现状2.专业前景分析 2024年,计算机相关专业还值得选择吗? 随着2024年高考落幕,数百万高三学生又将面临人生中的重要抉择:选择大学专业。有人欢喜&#x…

2024最新版:C++用Vcpkg搭配VS2022安装matplotlib-cpp库

matplotlib-cpp是一个用于在C中使用matplotlib绘图库的头文件库。它提供了一个简单的接口,使得在C中创建和显示图形变得更加容易。这个库的灵感来自于Python的matplotlib库,它使得在C中进行数据可视化变得更加便捷。 matplotlib-cpp允许在C中使用类似Py…

linux使用docker部署kafka集群

1、拉取kafka docker pull wurstmeister/kafka docker pull wurstmeister/zookeeper 2、创建网络 docker network create app-kafka 3、启动zookeeper docker run -d \--name zookeeper \-p 2181:2181 \--network app-kafka \--restart always \wurstmeister/zookeeper …

Java基础的重点知识-06-String、Arrays、Math、static关键字

文章目录 String类(java.lang)static关键字Arrays类(java.uitl)Math类(java.lang) String类(java.lang) java.lang.String 类代表字符串。 特征: 字符串不变:字符串的值在创建后不能被更改。因为String对象是不可变的&#xff…

【2024德国签证】资金证明详解|从线上开户到签证申请超详细指南!

保证金介绍 1.什么是德国保证金(自保金 Sperrkonto)? 来自非欧洲国家的国际学生必须提供经济资金证明,以证明你能支持你在德国的生活和学习。 保证金用途:非欧盟国家的公民,需要签证来德国,必…

安徽理工大学2计算机考研情况,招收计算机专业的学院和联培都不少!

安徽理工大学(Anhui University of Science and Technology),位于淮南市,是安徽省和应急管理部共建高校,安徽省高等教育振兴计划“地方特色高水平大学”建设高校,安徽省高峰学科建设计划特别支持高校&#…