vue diff算法与虚拟dom知识整理(3) 了解h函数和虚拟节点概念 实现虚拟节点上dom树

news2024/11/17 13:38:50

虚拟dom之前我们也有了基本的了解
简单说 就是用js数据结构来描述html的dom结构树

首先 为什么要用虚拟dom啊?
官方给出的回答是 diff最小量精细化算法是发生在虚拟dom上的
也就是 我们之前说的 节点与节点比较 并不是发生在html元素上的 而是发生在js中的虚拟dom上的
在这里插入图片描述
就是 当节点发生变化 或者 节点依赖数据发生变化时 对比哪里不一样 才能知道怎么更新 惊动的地方最少 且 也能完成更新的目的
这个比较的过程被叫做 diff算法 而这个过程 是在js部分 对这些虚拟dom节点进行的

那我 我们现在就要想 dom是如何变为虚拟dom的呢?

但这个知识 属于模板编译原理范畴 这里 因为时间问题就不去讲解了

我们需要知道 虚拟dom是通过什么渲染的 那么 提示通过 h函数渲染的

h这个 没有什么太大含义 就是作者在编写代码时给一个函数命的名 所以 以后我们如果要做开源或者技术栈 命名规范还是挺重要的 后面别人去参考你的代码 也会反向推导你函数的命名

h函数的作用 是用来产生虚拟节点
例如 我们这样去调用h函数

h('a',{props: {href: 'https://blog.csdn.net/weixin_45966674?type=blog'}}'测试标签')

那么 这个函数 就会帮我们创建出一个这样的虚拟节点

{
    'sel': 'a'
    "data": {
        props: {
            href:'https://blog.csdn.net/weixin_45966674?type=blog'
        }
    },
    "text": '测试标签'
}

也可以把他看成这样

<a href= "https://blog.csdn.net/weixin_45966674?type=blog">测试标签</a>

那么 我们对应看一下 也就是说 h标签的第一个参数 是你要创建一个什么标签
字符串类型
例如 “div” “p” “h1” 等等
第二个参数是一个对象
这里 首先 我们外面一个对象 {}
然后里面要先有一个字段props
这个就代表属性 它里面有时一个 json对象 对应键值就是标签属性
例如

{
    props: {
        href: "链接",
        name: "name值"
    }
}

第三个不用讲 就是标签中的内容

然后 我们这样就声明出了一个虚拟dom节点
又叫 vnode
其中v对应单词 virtual 意思就是 虚拟的
node就是节点 虚拟节点

首先 h就是来声明一个 虚拟的dom节点 至于怎么将dom节点转到h上变成虚拟dom节点 这里 涉及到模板编译原理 时间问题 就不特意去说了 后续我会更文讲解 这里 我们就好好把虚拟dom玩明白

虚拟节点主要会有以下几个属性
在这里插入图片描述
children 是它的子节点 子元素 为 undefined 表示没有子集
data 就是我们刚才看到的 他身上带的标签属性
elm 对应这个元素真正的dom节点 如果为 undefined 表示这个节点还没有上dom树
key 表示节点的唯一标识 特别是 我们在vue开发中循环渲染元素时 就需要在标签上加个key属性 用来区分
sel 代表用了一个什么标签 就是我们h的第一个参数 “标签名 例如 div”
text 表示文字

好 我们别光说不练
我们打开上文中 创建的案例
找到 src下的index.js
将引包之外的代码都给他干掉
在这里插入图片描述
然后将 src下的 index.js 代码改成这样

import {
    init,
    classModule,
    propsModule,
    styleModule,
    eventListenersModule,
    h,
  } from "snabbdom";
 
  //创建虚拟节点
  var vonm = h("a",{props: {
    href: "https://blog.csdn.net/weixin_45966674?type=blog"
  }},
  "测试虚拟dom");
  console.log(vonm);

这里 我们须知 h函数还没有那么强 他不会真的在html的dom树上加一个节点 他只是在js中创建了一个虚拟dom节点
h函数还没有那么强大 然后 我们启动项目
打开控制台 我们用 console.log 输出的这个h生成的虚拟节点就在这里了
在这里插入图片描述
我们来简单看看他的几个属性
在这里插入图片描述
这样可那种 像一个json一样 看着就有点没什么感觉
那么 我们让他上一下页面dom树

这个时候 我们要创建一个 patch 函数

后续 我会更文 这个会比较快 去讲述patch函数 它是diff算法的一个核心函数
非常有用
本文先不讲 后续马上更文去讲

我们将src下的index.js代码修改如下

import {
    init,
    classModule,
    propsModule,
    styleModule,
    eventListenersModule,
    h,
  } from "snabbdom";

  //创建patch函数
  const patch = init([
    classModule,
    propsModule,
    styleModule,
    eventListenersModule
  ]);
 
  //创建虚拟节点
  var vonm = h("a",{props: {
    href: "https://blog.csdn.net/weixin_45966674?type=blog"
  }},
  "测试虚拟dom");
  console.log(vonm);

  //让虚拟节点上树
  const container = document.getElementById('container');
  patch(container,vonm);

这里 用init 传一个数组 里面是其他所有依赖 一个patch就出来了 具体的patch我后面会出文去讲 这篇 我们先弄明白h和虚拟节点
然后 我们需要获取到一个节点
通过document.getElementById获取到id为container的节点
然后第一个参数是要挂载的节点 第二个参数则是虚拟dom节点
再次运行项目 我们的虚拟节点就上去成了真的节点
在这里插入图片描述
而我 我们的超链接点击之后 是真的能跳转的
我们的标签属性都是自然生效
但每次 我们点击都是在当前界面打开

学了html伙伴们都知道怎么解决
我们将src下的index.js改成这样

import {
    init,
    classModule,
    propsModule,
    styleModule,
    eventListenersModule,
    h,
  } from "snabbdom";

  //创建patch函数
  const patch = init([
    classModule,
    propsModule,
    styleModule,
    eventListenersModule
  ]);
 
  //创建虚拟节点
  var vonm = h("a",{props: {
    href: "https://blog.csdn.net/weixin_45966674?type=blog",
    target: "_blank"
  }},
  "测试虚拟dom");
  console.log(vonm);

  //让虚拟节点上树
  const container = document.getElementById('container');
  patch(container,vonm);

在props上加一个属性 target: “_blank”
这样 就在另一个界面打开了

这里 需要知道的是 我们一个节点 只能让一个虚拟dom上树 不过 你可以内嵌
我们后续下一文就会将
那么 我就先溜了 后续答应大家的会在一段时间后更新

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

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

相关文章

【C++学习】类和对象--多态【待补充】

多态的基本语法 多态是C面向对象三大特性之一 静态多态&#xff1a; 函数重载和运算符重载属于静态多态&#xff0c;复用函数名&#xff08;函数地址早绑定&#xff0c;编译阶段确定函数地址&#xff09; 动态多态&#xff1a; 派生类和虚函数实现运行时多态&#xff08;函数地…

centos7.6 yum 安装mysql

目录 1. 删 mariadb / 自带MySQL 2 安装wget命名 3 下载并安装MySQL官方的 Yum Repository 4 使用yum安装mysql 5 启动 6 获取密码 7 登录 -> 没有获取到 就直接按回车 不输入 8 设置密码 及权限 --> root 账号所有语句报错 9 参考 1. 删 mariadb / 自带MySQL…

《计算机网络——自顶向下方法》精炼——2.7.2(TCP套接字编程)

“学习的敌人是自己的满足。” —— 叶圣陶 文章目录 TCP套接字编程TCP套接字编程概述客户进程服务器进程 TCP套接字编程 TCP套接字编程概述 TCP是一个面向连接的运输层协议&#xff0c;因此可以分为发起连接的阶段和传输阶段。 发起连接时&#xff0c;客户进程创建一个客户…

【LeetCode】221.最大正方形

221.最大正方形&#xff08;中等&#xff09; 题解 对于在矩阵内搜索正方形或长方形的题型&#xff0c;一种常见的做法是&#xff1a;定义一个二维 dp 数组&#xff0c;其中 dp[i][j] 表示满足题目条件的、以&#xff08;i,j&#xff09;为右下角的正方形或长方形属性。在本题中…

【备战蓝桥杯国赛-国赛真题】费用报销

题目链接&#xff1a;https://www.dotcpp.com/oj/problem2696.html 思路 读完题&#xff0c;再看一眼数据范围&#xff0c;这道题的做法也就确定了——DP。 DP的题目往往很容易辨识出来&#xff0c;所以我们就往DP上想了&#xff0c;第一要素是选出的所有票据里面&#xff0c…

【LeetCode】64. 最小路径和

64. 最小路径和&#xff08;中等&#xff09; 方法一&#xff1a;常规动态规划 思路 定义一个二维 dp 数组&#xff0c;其中 dp[i][j]表示从左上角开始到&#xff08;i, j&#xff09;位置的最优路径的数字和。因为每次都只能向下或者向右移动&#xff0c;所以很容易发现 dp数组…

汽车行业V模型开发详解

在新能源汽车开发过程中&#xff0c;通常会采用V模型&#xff08;V-Model&#xff09;进行系统开发。V模型是一种基于需求分析、体系架构设计、硬件和软件开发、集成测试以及产品验证的系统工程方法。 下面简要介绍新能源汽车V模型开发的主要阶段&#xff1a; V模型开发&…

encrypted勒索病毒攻击nas服务器,服务器中了勒索病毒解密数据恢复

近年来&#xff0c;勒索病毒的攻击技术不断升级&#xff0c;各种加密型的病毒不断出现&#xff0c;给我们工作和生活带来了很大困扰。其中&#xff0c;encrypted勒索病毒攻击NAS网络存储设备已经变得越来越常见。而这次我们将为大家探讨如何预防encrypted勒索病毒攻击NAS服务器…

springboot+vue教师人事档案管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的教师人事档案管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1…

架构集群部署

这是一个简单的集群框架 192.168.142.10做负载均衡&#xff08;主&#xff09; 192.168.142.20&#xff08;副&#xff09; 先做keepalive 两台nginx做七层反向代理&#xff08;动静分离&#xff09; 192.168.142.30 192.168.142.40 部署tomcat做多实例部署 192.168.14…

linux驱动开发 - 11_Linux 下的驱动分离与分层

文章目录 11. Linux 下的驱动分离与分层1 驱动的分隔与分离2 驱动的分层 11. Linux 下的驱动分离与分层 1 驱动的分隔与分离 linux是一个成熟、复杂、庞大的操作系统&#xff0c;代码的重用性很重要&#xff0c;不然会在linux内核存在大量的无意义重复的代码。尤其的驱动程序…

进阶Spring(2)-BeanFactory和ApplicationContext实现

&#x1f3e0;个人主页&#xff1a;阿杰的博客 &#x1f4aa;个人简介&#xff1a;大家好&#xff0c;我是阿杰&#xff0c;一个正在努力让自己变得更好的男人&#x1f468; 目前状况&#x1f389;&#xff1a;24届毕业生&#xff0c;奋斗在找实习的路上&#x1f31f; &#x1…

[Data structure]单链表常见算法题

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现 ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注一…

Hibernate(二)——Springboot整合Hibernate

在了解了Hibernate后&#xff0c;进一步将Hibernate和Springboot整合。 目录 引入依赖配置文件代码BeanDao层Service层Controller层 测试JpaRepository接口 引入依赖 <!--引入hibernate--> <dependency><groupId>org.springframework.boot</groupId>…

【大数据处理与可视化】四、数据预处理

【大数据处理与可视化】四、数据预处理 实验目的实验内容实验步骤一、案例——预处理部分地区信息1、导包2、读取文件3、检查并删除重复数据北京天津&#xff08;无重复数据&#xff09; 4、检查缺失值北京&#xff08;无缺失值&#xff09;天津&#xff08;向前填充&#xff0…

10分钟学会搭建sovits第一篇

So-vits-svc 基于端到端架构的VITS和soft-vc&#xff0c;用户只需准备几十分钟到几个小时不等的语音或歌声数据&#xff0c;就能制作&#xff08;训练&#xff09;属于自己的 AI 声库 &#xff08;前提是你的显卡足够给力&#xff09;&#xff0c;将一段语音或歌声转换为你想要…

简易时钟-QT学习

1 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> //绘制事件 #include <QPainter> //画家类 #include <QPaintDevice> #include <cmath> // #include <QPainterPath> #include <QTime> //时间类…

基于蜣螂算法的无人机航迹规划-附代码

基于蜣螂算法的无人机航迹规划 文章目录 基于蜣螂算法的无人机航迹规划1.蜣螂搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用蜣螂算法来优化无人机航迹规划。 1.蜣螂搜索算法 …

【LeetCode】646. 最长数对链

646. 最长数对链&#xff08;中等&#xff09; 思路 这道题和 300. 最长递增子序列 类似&#xff0c;我们可以定义 dp 数组&#xff0c;其中 dp[i] 表示以 i 结尾的子序列的性质。在处理好每个位置后&#xff0c;统计一遍各个位置的结果即可得到题目要求的结果。 但是题目中强…

ElasticSearch(二)简介

1. 简介 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。 它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性&#xff0c;能使数据在生产环境变得更有价值。 Elasticsearch 的实现原理主要分为以下几个步骤&#xf…