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

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._initVue.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 injectionif (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 injectionif (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.mzph.cn/diannao/32721.shtml

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

相关文章

Day8 —— 大数据技术之HBase

HBase快速入门系列 HBase的概述什么是HBase?主要特点和功能包括使用场景 HBase的架构HBase部署与启动HBase基本操作前提条件数据库操作表操作数据的CRUD操作 HBase的不足 HBase的概述 什么是HBase? HBase 是一个开源的、分布式的、面向列的 NoSQL 数据…

线性卷积(相关)和圆周卷积(相关)以及FFT之间的关系(AEC举例)

时域自适应滤波算法中的线性卷积和线性相关运算量较大,导致计算复杂度升高,我们更愿意把这两个信号变换到频域,通过频域相乘的方式来取代时域复杂度相当高的卷积或相关运算。 预备知识:线性卷积(相关)和圆…

Hive表连接----内连接,全连接,左连接,右连接

数据准备:员工表,部门表 建表语句:12个员工,3个部门 create table emp(id int,name string,deptno int )clustered by (id) into 2 buckets row format delimited fields terminated by ",";truncate table emp;in…

示例:WPF中使用IsAsync的方式绑定数据来优化用户体验

一、目的:开发过程中,有时需要绑定大量数据,比如弹出一个窗口,窗口中包含一个ListBox绑定了大量数据,这时会出现点击按钮后出现假死卡顿影响用户体验,这理通过用IsAsync的方式将窗口优先弹出来再加载数据 二…

WHAT - 高性能和内存安全的 Rust(二)

目录 1. 所有权(Ownership)2. 借用(Borrowing)不可变借用可变借用 3. 可变性(Mutability)4. 作用域(Scope)综合示例 了解 Rust 的所有权(ownership)、借用&am…

跨平台免费流程图(思维导图)制作工具 draw.io v24.6.3(可离线)

在当今快节奏的工作环境中,有效地传达复杂信息和工作流程至关重要。流程图和思维导图是两种强大的视觉工具,它们帮助我们清晰地表达想法,理解复杂的系统,并协作完成项目。可以帮助我们清晰地展示信息和逻辑关系。然而,…

MySQL学习笔记-进阶篇-锁

概述 概念 全局锁 表级锁 介绍 表锁 读锁 只允许加锁客户端读操作禁止写操作。允许其他客户端的读操作,阻塞其他客户端的写操作。 lock tables xxx read unlock tables; 写锁 允许加锁客户端的读写操作。既阻塞其他客户端的读,又阻塞其他客…

告别繁琐邀请码,Xinstall助你轻松搭建高效App推广体系!

随着互联网流量的不断变迁,App推广和运营面临着前所未有的挑战。如何快速搭建起满足用户需求的运营体系,成为众多企业亟待解决的问题。在这个背景下,Xinstall凭借其强大的功能和灵活的解决方案,成为了App推广的得力助手。 一、传…

【Redis】

Redis 常见面试题 认识 Redis 什么是 Redis? 我们直接看 Redis 官方是怎么介绍自己的。 Redis 官方的介绍原版是英文的,我翻译成了中文后截图的,所以有些文字读起来会比较拗口,没关系,我会把里面比较重要的特性抽出来…

Centos7.9系统对于文件和文件夹的常用命令操作说明

一、背景描述 在我们的日常工作和生活中,会遇到需要连接Linux服务器操作的情况,最常遇到的一些操作就是文件和文件夹的操作,将这些常用操作记录一下,方便后续的使用。 二、文件常用操作指令 Linux下的指令可以通过按下【tab】键进…

SpringBoot使用spring.factories加载默认配置

在日常开发过程中,发布一些产品或者框架时,会遇到某些功能需要一些配置才能正常运行,这时我们需要的提供默认配置项,同时用户也能覆盖进行个性化 创建Initializer public class FrameContextInitializer implements Application…

VUE 组件之间的传值

通过做过的项目,目前学到几种组件之间的传值方法,留个笔记,才发现,其实不管是组件之间,还是父子组件之间,传值方法挺多的呢。 (1)模板引用 defineExpose 官网简介:模板…

5.3 Python len()函数:获取字符串长度或字节数

Python len()函数详解:获取字符串长度或字节数 Python 中,要想知道一个字符串有多少个字符(获得字符串长度),或者一个字符串占用多少个字节,可以使用 len 函数。 len 函数的基本语法格式为: …

ElasticSearch7.17.19集群搭建+Kibana

下载 1、下载elasticSearch 官网:https://www.elastic.co/cn/downloads/elasticsearch解压 tar -zxvf elasticsearch-7.17.19-linux-x86_64.tar### 修改用户组,es不允许root用户启动 chown es:es elaticsearch### 修改elasticsearch.yml # 所有节点名…

Unity - DrawCall

CPU 向 GPU 发送指令来渲染一个或多个物体的过程。每个 DrawCall 都会触发 GPU 执行一次绘制操作,包括设置渲染状态、传递顶点数据和纹理等。DrawCall 的增加会导致渲染性能下降 合批:将多个物体合并为一个批次进行渲染。其中分为静态合批和动态合批。 …

ConcurrentModificationException (异常通常是由于在一个线程遍历集合的同时,另一个线程修改了集合),解决方案如下

ArrayList 不是线程安全的集合。如果多个线程可能同时访问和修改ArrayList,可以考虑以下几种方法来解决这个问题:1、使用线程安全的集合: 使用 CopyOnWriteArrayList 或者 Collections.synchronizedList 包装的 ArrayList。 代码如下: private final BlockingQueue<List…

如何从docker容器中导入或者导出文件

在Docker中&#xff0c;从容器中导入或导出文件通常可以通过以下几种方法实现&#xff1a; 从容器中导出文件 使用 docker cp 命令 这是最直接的方法&#xff0c;可以从容器内部复制文件到宿主机的文件系统&#xff1a; docker cp <容器ID或容器名称>:<容器内的文…

双指针算法专题(移动零 复写零 快乐数)

目录 前言 1. 移动零 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;一般思路 &#xff08;3&#xff09;双指针解法 2. 复写零 &#xff08;1&#xff09;题目及示例 &#xff08;2&#xff09;一般解法 &#xff08;3&#xff09;双指针解法 3. 快…

在Mac OS上使用Visual Studio Code创建C++ Qt的Hello World应用

引言 Qt是一个跨平台的应用程序和用户界面框架&#xff0c;而Visual Studio Code是一个功能强大的编辑器&#xff0c;两者结合可以极大地提升开发效率。本文将指导你在Mac OS上使用Visual Studio Code创建一个简单的Qt Hello World窗口应用。 环境准备 确保你的MacBook OS运行…

Effective C++ 改善程序与设计的55个具体做法笔记与心得 5

五. 实现 26. 尽可能延后变量定义式的出现时间 请注意: ‌‌‌‌  尽可能延后变量定义式的出现&#xff0c;这样做可增加程序的清晰度并改善程序效率。 解释&#xff1a; 增加程序的清晰度&#xff1a;这样可以让读者在第一时间内更好地理解变量的用途。变量定义在第一次使…