深圳网站建设zvge潮流印花图案设计网站

news/2025/9/28 5:54:18/文章来源:
深圳网站建设zvge,潮流印花图案设计网站,广告投放软件,html编辑器哪个好用Vue 是如何将一份模板转换为真实的 DOM 节点的#xff0c;又是如何高效地更新这些节点的呢#xff1f;我们接下来就将尝试通过深入研究 Vue 的内部渲染机制来解释这些问题。 1 虚拟 DOM templatediv idappthis is son component/div 又是如何高效地更新这些节点的呢我们接下来就将尝试通过深入研究 Vue 的内部渲染机制来解释这些问题。 1 虚拟 DOM templatediv idappthis is son component/div /template你可能已经听说过“虚拟 DOM”的概念了Vue 的渲染系统正是基于这个概念构建的。 虚拟 DOM (Virtual DOM简称 VDOM) 是一种编程概念虚拟 DOM 是一种编程模式而非一种具体的技术实现它允许开发者以声明式的方式描述他们的 UI 界面而无需直接操作真实的 DOM 结构。这种方式带来了显著的优点 虚拟 DOM 通过在内存中操作数据结构来模拟 DOM 的变化只有在必要时才将变更反映到真实的 DOM 上。这种方式通过减少直接对 DOM 的操作可以显著提高应用的性能因为 DOM 操作是昂贵的特别是在大型应用中。 Vue 的实现方式与 React 有所不同但同样采用了虚拟 DOM 的概念。Vue 的虚拟 DOM 实现被称为 VNodeVirtual Node它是 Vue 组件树的一个内存表示。当 Vue 组件的数据变化时Vue 会使用其高效的算法如 patch 算法来比较新旧 VNode 树并只更新实际 DOM 中需要改变的部分。 Vue 的这种设计方式不仅提高了性能还使得 Vue 的学习曲线相对平缓因为它允许开发者使用更加接近原生 JavaScript 的语法来编写应用而不是像 React 那样需要学习 JSX 或其他模板语言。 const vnode {type: div,props: {id: hello},children: [/* 更多 vnode */] }在前端开发中虚拟DOMVirtual DOM树是一种在内存中表示DOM树的数据结构用于优化真实DOM的更新过程。您提供的vnode对象(即一个纯 JavaScript 的对象 (一个“虚拟节点”))示例是一个典型的虚拟DOM节点VNode它代表了DOM树中的一个元素节点。下面是对这个vnode对象以及它所代表的虚拟DOM树的一个详细讲解。 虚拟DOM节点VNode type: 表示节点的类型通常是HTML标签名如div、span等或组件类型。在您的示例中type: div表示这是一个div元素。 props: 包含了节点的属性如id、class、style等。在您的示例中props: { id: hello }表示这个div元素有一个id属性其值为hello。 children: 表示该节点的子节点列表。这个列表可以包含更多的VNode对象从而构建出完整的DOM树结构。在您的示例中children数组被注释掉了但通常它会包含零个、一个或多个VNode对象这些对象可能是元素节点、文本节点或组件节点。 不过重要的是要理解虚拟 DOM 的核心概念和它的工作流程 创建Creation首先开发者使用 JavaScript 对象或 TypeScript 类型来声明虚拟 DOM 树。这些对象包含了足够的信息来创建对应的真实 DOM 元素如元素类型type、属性props、子节点children等。 挂载Mounting当应用首次加载时框架的渲染器会遍历这个虚拟 DOM 树并根据其中的信息构建出真实的 DOM 树然后将其挂载到页面的某个元素上通常是 body 或其他指定的容器元素。 更新Updating/Patching当应用的状态变化时框架会重新计算并生成一个新的虚拟 DOM 树。然后渲染器会比较新旧两棵虚拟 DOM 树之间的差异这通常是通过高效的算法实现的如 React 的 Diff 算法或 Vue 的 Patch 算法。一旦确定了差异渲染器就会只更新真实 DOM 中必要的部分以反映这些变化。 虚拟 DOM 的主要优势之一是它允许开发者以声明式的方式编写 UI同时框架负责优化 DOM 操作。由于 DOM 操作通常比 JavaScript 计算要慢得多因此减少不必要的 DOM 操作可以显著提高应用的性能。 2 渲染管线 从高层面的视角看Vue 组件挂载时会发生如下几件事 编译 Vue 模板被编译为渲染函数即用来返回虚拟 DOM 树的函数。这一步骤可以通过构建步骤提前完成也可以通过使用运行时编译器即时完成。 构建时编译在 Vue 项目中通常会使用构建工具如 Webpack配合 Vue Loader 来处理 .vue 文件。在这个过程中Vue Loader 会将模板部分编译成渲染函数Render Function这个过程是构建时完成的意味着在浏览器加载页面之前模板已经被转换成了 JavaScript 代码。 运行时编译运行时编译Runtime Compilation在Vue.js的上下文中指的是在浏览器端客户端直接将模板字符串编译成渲染函数的过程。这通常用于动态加载的组件或者在不使用构建工具的情况下。但是出于性能考虑推荐在生产环境中使用构建时编译。 运行时编译的详细解释 模板字符串的存在在Vue应用中尤其是当使用Vue的CDN版本或通过script typetext/x-template标签直接在HTML中定义模板时模板是以字符串的形式存在的。这些字符串需要被解析和转换成Vue能够理解的格式来渲染视图。 Vue的运行时编译器Vue.js提供了一个内置的运行时编译器它能够在浏览器端解析这些模板字符串并生成相应的渲染函数。这些渲染函数是高度优化的它们描述了如何基于组件的响应式状态来生成和更新DOM。 挂载 当 Vue 实例被创建并挂载到 DOM 上时Vue 会执行渲染函数来生成虚拟 DOM 树。然后Vue 的运行时渲染器会遍历这棵虚拟 DOM 树并基于它创建出真实的 DOM 节点并将这些节点插入到指定的挂载点通常是某个 HTML 元素。 响应式依赖追踪在挂载过程中Vue 的响应式系统会追踪渲染函数中用到的所有响应式数据。当这些数据发生变化时Vue 能够知道需要重新渲染组件。 更新当一个依赖发生变化后副作用会重新运行这时候会创建一个更新后的虚拟 DOM 树。运行时渲染器遍历这棵新树将它与旧树进行比较然后将必要的更新应用到真实 DOM 上去。 更新 当组件的响应式数据发生变化时Vue 的响应式系统会触发组件的重新渲染。这个过程会再次执行渲染函数生成一个更新后的虚拟 DOM 树。 虚拟 DOM 比较Vue 的运行时渲染器会比较新旧两棵虚拟 DOM 树通过高效的算法如 diff 算法来找出它们之间的差异。 DOM 更新基于比较结果Vue 会最小化地更新真实的 DOM以反映数据的最新状态。这通常意味着只有那些真正需要改变的 DOM 部分会被更新从而提高性能。 总结 Vue 的组件挂载和更新过程是一个高度优化的过程它利用虚拟 DOM 和响应式系统来确保数据的变化能够高效地反映到视图上。这个过程从模板编译开始经过挂载、更新等阶段最终实现了数据的双向绑定和视图的动态更新。 3 模板 vs. 渲染函数 Vue 模板会被预编译成虚拟 DOM 渲染函数。Vue 也提供了 API 使我们可以不使用模板编译直接手写渲染函数。在处理高度动态的逻辑时渲染函数相比于模板更加灵活因为你可以完全地使用 JavaScript 来构造你想要的 vnode。 Vue.js 的核心之一是其响应式系统和虚拟 DOM 渲染器。虽然 Vue.js 鼓励开发者使用声明式的模板语法来构建用户界面因为它更直观且易于理解但在某些情况下特别是当需要处理高度动态或复杂的逻辑时直接使用渲染函数Render Functions或 JSX如果通过 Babel 插件转换可能会更加灵活和强大。 4 带编译时信息的虚拟 DOM Vue.js 通过将编译器和运行时紧密耦合并利用编译时信息来优化虚拟 DOM 的更新过程从而在保持声明式写法和最终正确性的同时提高了性能和效率。这种混合解决方案使得 Vue 在处理复杂应用时既强大又高效。当然每种技术都有其优缺点选择哪种技术取决于项目的具体需求、团队的熟悉程度以及开发者的个人偏好。 编译时优化 Vue.js 的一个关键优势在于它能够在编译时即在代码被发送到浏览器之前对模板进行静态分析。这种分析允许 Vue 的编译器识别出哪些部分是静态的即不会随数据变化而变化的部分哪些部分是动态的。对于静态部分Vue 可以生成更高效的代码因为它们不需要在每次渲染时都重新计算或重新创建。 带编译时信息的虚拟 DOM Vue 通过在生成的渲染函数中嵌入编译时信息来进一步优化其运行时性能。这些信息可以帮助 Vue 的虚拟 DOM 算法更智能地处理更新减少不必要的比较和重新渲染。例如如果编译器能够确定某个 vnode 的子节点列表是静态的那么它就可以在渲染函数中生成一个标记来指示这一点。在运行时虚拟 DOM 算法就可以利用这个标记来跳过对这些子节点的比较从而节省时间和内存。 保留底层渲染函数的能力 尽管 Vue 提供了这些编译时优化但它仍然保留了用户直接使用底层渲染函数的能力。这意味着当模板语法不足以满足需求时开发者可以回退到更灵活的渲染函数或 JSX。这种灵活性是 Vue 设计哲学的一个重要方面它允许开发者根据项目的具体需求选择最合适的工具。 5 静态提升 在模板中常常有部分内容是不带任何动态绑定的 divdivfoo/div !-- 需提升 --divbar/div !-- 需提升 --div{{ dynamic }}/div /divimport { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock } from vueconst _hoisted_1 /*#__PURE__*/_createElementVNode(div, null, foo, -1 /* HOISTED */) const _hoisted_2 /*#__PURE__*/_createElementVNode(div, null, bar, -1 /* HOISTED */)export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createElementBlock(div, null, [_hoisted_1,_hoisted_2,_createElementVNode(div, null, _toDisplayString(_ctx.dynamic), 1 /* TEXT */)])) }// Check the console for the ASTfoo 和 bar 这两个 div 是完全静态的没有必要在重新渲染时再次创建和比对它们。Vue 编译器自动地会提升这部分 vnode 创建函数到这个模板的渲染函数之外并在每次渲染时都使用这份相同的 vnode渲染器知道新旧 vnode 在这部分是完全相同的所以会完全跳过对它们的差异比对。 此外当有足够多连续的静态元素时它们还会再被压缩为一个“静态 vnode”其中包含的是这些节点相应的纯 HTML 字符串。(示例)。这些静态节点会直接通过 innerHTML 来挂载。同时还会在初次挂载后缓存相应的 DOM 节点。如果这部分内容在应用中其他地方被重用那么将会使用原生的 cloneNode() 方法来克隆新的 DOM 节点这会非常高效。 6 更新类型标记 对于单个有动态绑定的元素来说我们可以在编译时推断出大量信息 !-- 仅含 class 绑定 -- div :class{ active }/div!-- 仅含 id 和 value 绑定 -- input :idid :valuevalue!-- 仅含文本子节点 -- div{{ dynamic }}/divimport { normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, Fragment as _Fragment, openBlock as _openBlock, createElementBlock as _createElementBlock } from vueexport function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(), _createElementBlock(_Fragment, null, [_createElementVNode(div, {class: _normalizeClass({ active: _ctx.active })}, null, 2 /* CLASS */),_createElementVNode(input, {id: _ctx.id,value: _ctx.value}, null, 8 /* PROPS */, [id, value]),_createElementVNode(div, null, _toDisplayString(_ctx.dynamic), 1 /* TEXT */)], 64 /* STABLE_FRAGMENT */)) }// Check the console for the AST

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

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

相关文章

哪些网站做国际贸易比较好2024舆情信息范例8篇

学习使用js/jquery获取指定class名称的三种方式 简介一、获取元素的class名称1、通过原生JS获取元素的class名称2、通过Jquery获取元素的class名称 二、应用1、样式修改2、动画效果实现 简介 在开发网页时,我们经常需要通过JS获取元素的class名称进行一些操作&…

常德网站开发网页设计图片横排代码

目录 3.2 YOLOv5框架的分析 3.3改进算法的基本思想 3.4改进聚类算法 3.5重构损失函数模型和NMS算法<

重庆大渡口营销型网站建设价格上海 企业

准备工作&#xff1a; ubuntu 16.04系统;ROS kinetic版本;ROS包turtlebot,导航包rbx1,模拟器arbotix&#xff0c;可视化rviz 1、安装ubuntu 16.04系统与安装ROS kinetic版本自行百度安装。一下链接可作为参考。 http://blog.csdn.net/weicao1990/article/details/52575314 2…

网站做信息流做实验网站

微博现在日活达到了 2 亿&#xff0c;微博广告是微博最重要且稳定的收入来源&#xff0c;没有之一&#xff0c;所以微博广告系统的稳定性是我们广告运维所有工作中的重中之重。 作者&#xff1a;孙燕来源 微博现在日活达到了 2 亿&#xff0c;微博广告是微博最重要且稳定的收入…

网站提交有没有个人网站

开源数据科学平台Anaconda简介 零、时光宝盒 最近&#xff0c;某金融行业女性选择以跳楼的形式结束自己的生命&#xff0c;这件不幸的事情成了热门话题&#xff0c;各种猜测的都有&#xff0c;有些人评论的话真的很过分。我想起前段时间看到的&#xff0c;有个女学生跳江&#…

婚恋网站建设项目创业计划书茂名制作网站软件

GSEP 1级样题 闰年统计 题目描述 小明刚刚学习了如何判断平年和闰年&#xff0c;他想知道两个年份之间&#xff08;包含起始年份和终止年份&#xff09;有几个闰年。你能帮帮他吗&#xff1f; 输入格式 输入一行&#xff0c;包含两个整数&#xff0c;分别表示起始年份和终止…

泰州公司做网站wordpress 设置显示中文

一.数据集制作 1.标注软件&#xff1a;roLabelImg roLabelImg是基于labelImg改进的&#xff0c;是用来标注为VOC格式的数据&#xff0c;但是在labelImg的基础上增加了能够使标注的框进行旋转的功能。 2.数据格式转换 2.1 xml转txt # 文件名称 &#xff1a;roxml_to_dota.p…

网站建设业务介绍绵阳企业网站建设

作为管理者&#xff0c;一谈到生产管理&#xff0c;你可能会想到很多生产过程中的问题&#xff1a; 产量无法实时统计&#xff1b; 计划不能跟踪进度&#xff1b; 质量追溯无法实现...... 等等一系列核心问题。 结合这些核心痛点&#xff0c;分享一套符合现在生产的智能化解决…

网站搭建教学wordpress做ip统计

一、MySQL的日常备份方案&#xff1a;全备增量备份&#xff1a;1、周日凌晨三点进行全备&#xff1b;2、周一到周日增量备份。不是往常的周日全备份&#xff0c;周一到周六增量备份&#xff0c;这样如果周日数据库在完全备份前出问题&#xff0c;恢复完成后&#xff0c;会少周日…

怎样做网站的当前位置栏关于建设网站的报告书

Java加密的常用的加密算法类型有三种 1单向加密&#xff1a; 也就是不可逆的加密&#xff0c;例如MD5,SHA,HMAC 2对称加密&#xff1a; 也就是加密方和解密方利用同一个秘钥对数据进行加密和解密&#xff0c;例如DES&#xff0c;PBE等等 3非对称加密&#xff1a; 非对称加…

珠海网站设计培训班济南网络seo公司

FID 在互联网高速发展的时代&#xff0c;用户体验已成为企业竞争的关键所在。网页性能作为用户体验的重要组成部分&#xff0c;直接影响着用户的满意度和工作效率。First Input Delay&#xff08;FID&#xff09;作为衡量网页性能的重要指标&#xff0c;越来越受到业界关注。今…

wordpress站内seofreenom怎么做网站

随着科技的进步&#xff0c;如今我们可以通过屏幕录制软件来记录我们的电脑屏幕活动。无论是为了分享游戏精彩瞬间&#xff0c;还是为了制作教程或演示&#xff0c;录屏都成为了许多人的需求。可是你知道怎样录屏才是最好的吗&#xff1f;接下来&#xff0c;本文将为您介绍三种…

做减肥餐的网站wordpress可选模式主题

运行的时候提示无法查找或打开PDB文件 解决办法&#xff08;注意&#xff1a;必须使用管理员身份运行VS&#xff09; 第一步 打开调试窗口的选项 第二步 调试——>常规——>勾选启用源服务器支持 它会弹出警告窗口&#xff0c;点“是”即可 第三步 调试——>符号——…

吴中公司网站建设找哪家html5网站怎么做

程序所属分类&#xff1a;图形图像处理开发工具&#xff1a;matlab文件大小&#xff1a;7964KB下载次数&#xff1a;29上传日期&#xff1a;2017-07-21 11:48:16上 传 者&#xff1a;long1219说明&#xff1a; PIVlab - 时间分辨粒子图像测速(PIV)工具&#xff1a;一种基于GUI…

张家港外贸网站制作山东省住房和城乡建设厅职称评审

Kubernetes项目在过去几年中发展迅速&#xff0c;并且作为容器编排和管理解决方案的领导者而备受尊重。有了这个地位&#xff0c;Kubernetes开发者有责任提供经过充分测试&#xff0c;易于维护&#xff0c;高性能和可扩展的API和工具。在即将到来的每个发布周期中&#xff0c;大…

深圳做网站网络公司有哪些做的网站 只显示代码

一、python中的变量及引用1.1 python中的不可变类型&#xff1a;数字(num)、字符串(str)、元组(tuple)、布尔值(bool<True,False>) 接下来我们讲完后你就懂了为什么它们是不可变对象了。 都知道python中一切都是对象&#xff0c;而变量就是这些对象的引用&#xff0c;什么…

建设商务网站过程vscode的网站开发配置

这次使用sublimepython进行pygame的游戏开发&#xff0c;目的是学习使用python的基本操作和常用模块 添加一个文件夹到工程 最小系统 1.导入使用的模块 2.初始化&#xff1a;pygame.init函数包含了各个子模块的初始化&#xff0c;可以重复调用 3.pygame.display.set_mode返…

山东省住房建设厅网站首页重庆做网站建设哪里好

目录 一、行为型模式 1.1、模板方法模式 1.1.1、概念 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 一句话概括行为型模式 行为型模式&#xff1a;类或对象间如何交互、如何划分职责&#xff0c;从而更好的完成任务. 1.1、模板方法模式 1.1.1、概念 …

鲜花商城网站建设连锁网站开发

最近看抖音上有很多各种视频表白生成的直播而且直播间人很多&#xff0c;于是就思考如何实现的视频内的文字图片内容替换的呢 &#xff0c;答案需要用到类似与逗拍一样的视频DIY的功能&#xff0c;苦于我是java&#xff0c;百度了半天没有办法和思路&#xff0c;总不能为了一个…