Vue探索之Vue2.x源码分析(二)
一.Virtual Dom
虚拟DOM是一种轻量级的抽象,它允许我们在Javascript中创建、更新和删除DOM元素。它是React等现代Javascript框架的核心概念之一。
Vue的虚拟dom是一种抽象层的概念,它使得Vue可以高效地更新Dom。虚拟Dom是通过Javascript对象来表示DOM结构的一种方法。当数据改变时,vue会对比新旧虚拟Dom之间的差异,然后只将需要变更的部分应用哦到真
二.diff算法
在vue中,diff算法是用来比较新旧虚拟节点,并找出最小的差异进而更新DOM的。这是Vue高效更新Dom的核心所在。
Vuede diff算法是基于snabbdom改进而来,并且做了优化以使用vue的用例和特性。
import Vue from 'vue';// 创建一个Vue实例
new Vue({el: '#app',data: {message: 'Hello Vue!',},// 模板中的内容会被转换成render函数,diff算法在这里被应用render(h) {return h('div', this.message);},
});// 更新Vue实例的数据
setTimeout(() => {app.$data.message = 'Hello World!';
}, 2000);
三.模板编译器原理
Vue模板编译器的核心是将Vue模板转换成可执行的Javascript代码。这个过程主要包括以下几个步骤:
1.解析:将末班字符串解析成抽象语法树(AST)
2.转换:将AST转换成可执行的代码
3.生成:生成可执行的代码字符串
四.常见指令工作原理
vue指令时vue.js框架中用于数据绑定、事件监听、插槽分发等的标记,它们以v-开头。Vue的指令工作原理通常包括以下几个步骤:
1.解析模板: Vue实例在创建时会解析模版,提取其中的指令
2.初始化数据观测: Vue会使用ES5的Object.defindeProperty为数据绑定getter和setter,以此来追踪数据变化
3.编译模板: Vue将模板中欧的指令和插值表达式转换成渲染函数,这个函数可以生成虚拟DOM
4.应用指令:当数据变化时,vue会重新渲染虚拟DOM并计算diff,然后应用必要的变化到DOM上
例如,v-if、v-for和 v-bind的简单实现可能如下:
// v-if 指令 function vIf (el, binding, vnode) {if (binding.value) {vnode.elm = el;vnode.context = this;vnode.data.keepAlive = truemountComponent(vnode);} else {unmountComponent(vnode);} }// v-for指令 function vFor (el, binding) {let value = bingding.value;let flag = document.createDocumentFragment()value.forEach(item => {let clone = el.cloneNode(true)clone.textContent = item.text;frag.appendChild(clone)})el.parentNode.replaceChild(frag, el); }// v-bind指令 function vBind(el, bingding) {for (let name in binding.value) {el.setAttribute(name, binding.value[name])} }
五.Vue组件化机制
vue.js使用组件化的方式来开发用户界面,每个Vue组件都是可以独立编写、单独使用、可复用的示例。
以下是一个简单的Vue组件的例子:
<template><div><h1>{{ title }}</h1><button @click="greet">Say hi</button></div> </tempalate><script> export default {data () {return {title: 'Hello World'}},methods: {greet(){alert(Hi there)}} } </script><style scoped> h1{color: #3498db; } </style>
在这个例子中,我么定义了一个带有标题和按钮的简单组件。点击按钮时,会弹出一个包含问候的警告框。<style scoped>表明该样式只会应用于当前组件的元素。
要在Vue应用中使用这个组件,你需要现在Vue实例中注册它,然后在模板中使用它。
import Vue from 'vue' import App from './App.vue' import MyComponent from './components/mycomponent.vue'Vue.component('my-component', MyComponent); new Vue({render: h = h(App) }).$mount(#app)
在App.vue中,你可以这样使用这个组件:
<template><div id="app"><my-component></my-component></div> </template><script>export default {// 可以在这里注册更多组件} </script>
六.Vue事件机制
Vue的事件机制主要是指组件间通信的一种方式,可以使用v-on指令或其简写形式@来监听和响应Dom事件
以下是一个简单的例子,展示了如何在Vue中使用事件:
<template><div><button @click="handleClick">点击我</button></div> </template><script> export default {methods: {handleClick () {console.log(按钮被点击了!)// 在这里可以执行其他逻辑}} } </script>
在这个例子中,我们创建了一个按钮,并使用@click指令坚挺了点击事件。当按钮被点击时,会触发handleClick方法,并在控制台输出信息。这就是vue 中的事件监听和事件处理。
七.Vue双向绑定原理
Vue的双向绑定是通过Object.defineProperty()实现的。Vue将响应式地将数据的getter和setter应用到数据上,当数据该改变时,视图会更新;当视图更新时,数据也会更新。
以下是一个简化版的实现实例:
function defineReactive (obj, key, val) {Object.defineProperty(obj, key, {enumerable: true,configurable: true,get: function reactiveGetter(){return val},set: function reactiveSetter(newVal){if (newVal === val) return;value = newVal;// 当数据更新时,可以执行一些逻辑,例如更新视图console.log('${key} has been updated to ${newVal}');}})
}function observe(data){if (typeof data !== 'object' || data === null) {return;}object.keys(data).forEach(key => {defineReactive(data, key, data[key]);})
}// 使用示例
const data = {name: 'Vue'}
observe(data);
data.name = "Vue.js" // 控制台输出name has been updated to Vue.js
八.slot插槽实现原理
插槽(Slot)使Web组件间通信的一种方式,可以理解为一种占位符,用于父组件向子组件传递内容。
以下是一个简单的示例,使用JavaScript定义一个带有插槽的web组件:
classs MyElement extednd HTMLElement {constructor() {super();// 创建Shadow Domconst shadow = this.attachShadow({mode: 'open'})//插槽的占位符const slot = document.createElement('slot');shadow.appendChild(slot)} }// 定义该组件的标签名 customElements.define('my-element', MyElement);
然后,在HTML中使用这个组件:
<my-element><p>这里是传递给插槽的内容</p> </my-element>
这个例子中,<my-element>标签内的内容会被插到<slot>占位符的位置。插槽是web组件设计中的一个核心概念,它使得开发者能够创建可复用的自定义标签,并能够灵活地插入或者替换其中的内容。
相关文章:
Vue探索之Vue2.x源码分析(二)
一.Virtual Dom 虚拟DOM是一种轻量级的抽象,它允许我们在Javascript中创建、更新和删除DOM元素。它是React等现代Javascript框架的核心概念之一。 Vue的虚拟dom是一种抽象层的概念,它使得Vue可以高效地更新Dom。虚拟Dom是通过Javascript对象来表示DOM结…...

人工智能分类算法概述
文章目录 人工智能主要分类算法决策树随机森林逻辑回归K-均值 总结 人工智能主要分类算法 人工智能分类算法是用于将数据划分为不同类别的算法。这些算法通过学习数据的特征和模式,将输入数据映射到相应的类别。分类算法在人工智能中具有广泛的应用,如图…...

理解 Golang 变量在内存分配中的规则
为什么有些变量在堆中分配、有些却在栈中分配? 我们先看来栈和堆的特点: 简单总结就是: 栈:函数局部变量,小数据 堆:大的局部变量,函数内部产生逃逸的变量,动态分配的数据&#x…...

《QT实用小工具·二十四》各种数学和数据的坐标演示图
1、概述 源码放在文章末尾 该项目实现了各种数学和数据的坐标演示图,下面是demo演示: 项目部分代码如下: #ifndef FRMMAIN_H #define FRMMAIN_H#include <QWidget> class QAbstractButton;namespace Ui { class frmMain; }class fr…...
【S32K3 MCAL配置】-3.1-CANFD配置-经典CAN切换CANFD(基于MCAL+FreeRTOS)
"><--返回「Autosar_MCAL高阶配置」专栏主页--> 目录(共5页精讲,基于评估板: NXP S32K312EVB-Q172,手把手教你S32K3从入门到精通) 实现的架构:基于MCAL层 前期准备工作:...

IEC101、IEC103、IEC104、Modbus报文解析工具
一、概述 国际电工委员会第57技术委员会(IEC TC57)1995年出版IEC 60870-5-101后,得到了广泛的应用。为适应网络传输,2000年IEC TC57又出版了IEC 60870-5-104:2000《远东设备及系统 第5-104部分:传输规约-采…...

node res.end返回json格式数据
使用 Node.js 内置 http 模块的createServer()方法创建一个新的HTTP服务器并返回json数据,代码如下: const http require(http);const hostname 127.0.0.1; const port 3000;const data [{ name: 测试1号, index: 0 },{ name: 测试2号, index: 1 },…...

产品开发流程
产品开发流程 时间:2024年04月10日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 产品开发流程_小蒋聊技术_免费在线阅读收听下载 - 喜马拉雅欢迎收听小蒋聊技术的类最新章节声音“产品开发流程”。时间:…...
Python蓝桥杯赛前总结
1.进制转换 (1) 2进制转换为其他进制 # 2转10 int(n, 2) # 2转8 oct(int(n, 2)) # 2转16 hex(int(n, 2)) (2) 8进制转换为其他进制 #8转10 int(n, 8) #8转2 bin(int(n, 8)) #8转16 hex(int(n, 8)) (3) 10进制转换为其他进制 #10转2 bin(n) #10转8 oct(n) #10转16 hex(n) …...

20240326-1-KNN面试题
KNN面试题 1.简述一下KNN算法的原理 KNN算法利用训练数据集对特征向量空间进行划分。KNN算法的核心思想是在一个含未知样本的空间,可以根据样本最近的k个样本的数据类型来确定未知样本的数据类型。 该算法涉及的3个主要因素是:k值选择,距离度…...

【论文速读】| MASTERKEY:大语言模型聊天机器人的自动化越狱
本次分享论文为:MASTERKEY: Automated Jailbreaking of Large Language Model Chatbots 基本信息 原文作者:Gelei Deng, Yi Liu, Yuekang Li, Kailong Wang, Ying Zhang, Zefeng Li, Haoyu Wang, Tianwei Zhang, Yang Liu 作者单位:南洋理工…...
jvm运行情况预估
相关系统 jvm优化原则-CSDN博客 执行下面指令 jstat gc -pid 能计算出一些关键数据,有了这些数据,先给JVM参数一些的初始的,比堆内存大小、年轻代大小 、Eden和Srivivor的比例,老年代的大小,大对象的阈值,…...

Day105:代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析
目录 代码审计-学前须知 Bluecms-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-2次注入审计分析 知识点: 1、PHP审计-原生态开发-SQL注入&语句监控 2、PHP审计-原生态开发-SQL注入&正则搜索 3、PHP审计-原生态开发-SQ…...

Python:如何对FY3D TSHS的数据集进行重投影并输出为TIFF文件以及批量镶嵌插值?
完整代码见 Github:https://github.com/ChaoQiezi/read_fy3d_tshs,由于代码中注释较为详细,因此博客中部分操作一笔带过。 01 FY3D的HDF转TIFF 1.1 数据集说明 FY3D TSHS数据集是二级产品(TSHS即MWTS/MWHS 融合大气温湿度廓线/稳定度指数/…...

CentOS 镜像下载
CentOS 镜像下载:https://www.centos.org/download/ 选择合适的架构,博主选择x86_64,表示CentOS7 64位系统x86架构,如下: 或者直接访问以下网站下载 清华大学开源软件镜像站:https://mirrors.tuna.tsin…...
yum和配置yum源
yum 以及配置yum 源。 文章目录 一、Linux 软件包管理器yum二、使用yum安装软件三、配置yum源四、yum源仓库五、lrzse 实现linux远端和本地 互传文件 一、Linux 软件包管理器yum (1)什么是yum? yum 是一个软件下载安装管理的一个软件包管理器,它就相当于我们手机…...
jQuery笔记 02
目录 01 jq中预定义动画的使用 02 jq中的自定义动画 03 jq的动画的停止 04 jq节点的增删改 05 属性节点的操作 06 jq中的值和内容的操作 07 jq中宽高的操作 08 jq中坐标的操作 01 jq中预定义动画的使用 jq的预定义动画: 1.显示隐藏动画 显示 : jq对象.show() 不传参数 表…...

基于Java+SpringBoot+Vue文学名著分享系统(源码+文档+部署+讲解)
一.系统概述 随着世界经济信息化、全球化的到来和互联网的飞速发展,推动了各行业的改革。若想达到安全,快捷的目的,就需要拥有信息化的组织和管理模式,建立一套合理、动态的、交互友好的、高效的文学名著分享系统。当前的信息管理…...

C/S医学检验LIS实验室信息管理系统源码 医院LIS源码
LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化,检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后,自动生成打印报告,通过网络存储在数据库中,使医生能够通过医生工作站方便、及时地…...

liunx环境变量学习总结
环境变量 在操作系统中,环境变量是一种特殊的变量,它们为运行的进程提供全局配置信息和系统环境设定。本文将介绍如何自定义、删除环境变量,特别是对重要环境变量PATH的管理和定制,以及与环境变量相关的函数使用。 自定义环境变…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...