渲染函数render

2023-11-09

节点、树以及虚拟 DOM

在深入渲染函数之前,了解一些浏览器的工作原理是很重要的。以下面这段 HTML 为例:

<div>
  <h1>My title</h1>
  Some text content
  <!-- TODO: Add tagline -->
</div>

  • 官网

当浏览器读到这些代码时,它会建立一个“DOM 节点”树来保持追踪所有内容,如同你会画一张家谱树来追踪家庭成员的发展一样。

image

节点

  • 官网

每个元素都是一个节点。每段文字也是一个节点。甚至注释也都是节点。一个节点就是页面的一个部分。

  • 什么是节点?

节点是元素+文字+注释的总称

虚拟 DOM

  • 官网

Vue 通过建立一个虚拟 DOM 来追踪自己要如何改变真实 DOM。请仔细看这行代码:

return createElement('h1', this.blogTitle)

createElement 到底会返回什么呢?其实不是一个实际的 DOM 元素。它更准确的名字可能是 createNodeDescription,因为它所包含的信息会告诉 Vue 页面上需要渲染什么样的节点,包括及其子节点的描述信息。我们把这样的节点描述为“虚拟节点 (virtual node)”,也常简写它为“VNode”。“虚拟 DOM”是我们对由 Vue 组件树建立起来的整个 VNode 树的称呼。

  • 什么是虚拟 DOM?

是对由 Vue 组件树建立起来的整个 VNode 树的称呼。虚拟节点是创建节点的描述

image

vue中render函数的作用

在vue脚手架的main.js文件中,render函数的作用是,将h创建的Node节点信息return返回给Vue.js底层处理文件中的beforeMount()生命周期钩子函数,让其将Node节点信息在界面中渲染出来

render函数返回一个VNode节点,这个节点由createElement函数创建。

render函数去创建子组件内容

render:(createElement)=>{
    var header = this.$slots.default/插槽名字
    return createElement('div',[createElement('header',header)])
}

// render函数参数一是createElement函数(一般约定简写成h)以及参数二上下文ctx,createElement这个函数,有三个参数。

createElement官方文档

++createElement官方文档++(参数一,参数二,参数三)

参数一:必选,可以是string,object,function
例如:
return h ('div') // 参数一,为string
return h ({template:"<div>内容</div>"}) // 参数一,为Object
var domFuc = function (){
  return { 
      template:'<div>内容</div>'
  }   
}// 参数一,为function

参数二为object,可选,但一定要是一个对象。
class:{},style:{},attrs:{},domProps:{
innerHTML: 'baz'} // DOM property,props:{},on:{},nativeOn:{},directives:{},scopedSlots:{},key:'myKey'
例如: 创建一个div,给他设置样式高度34px
render:(h)=>{
    return h('div',{
    props:{
    // props给div绑定属性值
        value:""
    }
    style:"{
    // 给div绑定样式
    height:'34px'
    }",
    on:{
    // on给div绑定事件
        click:function (){
          console.log('点击事件')  
        }
    },
    // 普通的 HTML attribute
 attrs: {
   id: 'foo'
 },
  // 作用域插槽的格式为
 // { name: props => VNode | Array<VNode> }
 scopedSlots: {
   default: props => createElement('span', props.text)
 },
 // 如果组件是其它组件的子组件,需为插槽指定名称
 slot: 'name-of-slot',
 // 其它特殊顶层 property
 key: 'myKey',
 ref: 'myRef',
 // 如果你在渲染函数中给多个元素都应用了相同的 ref 名,
 // 那么 `$refs.myRef` 会变成一个数组。
 refInFor: true
},
// DOM property
domProps: {
   innerHTML: 'baz'
 },
 // 事件监听器在 `on` 内,
 // 但不再支持如 `v-on:keyup.enter` 这样的修饰器。
 // 需要在处理函数中手动检查 keyCode。
 on: {
   click: this.clickHandler
 },
 // 仅用于组件,用于监听原生事件,而不是组件内部使用
 // `vm.$emit` 触发的事件。
 nativeOn: {
   click: this.nativeClickHandler
 },
 // 自定义指令。注意,你无法对 `binding` 中的 `oldValue`
 // 赋值,因为 Vue 已经自动为你进行了同步。
 directives: [
   {
     name: 'my-custom-directive',
     value: '2',
     expression: '1 + 1',
     arg: 'foo',
     modifiers: {
       bar: true
     }
   }
 ],
    })
}
参数三:代表子节点,可选,是string或者Array
例如:
return h('div',[h('h2','我是div子元素的文本内容'),h('h3','我是div的第二个子元素h3的文本')])

参考

++官网++

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

渲染函数render 的相关文章

  • 检测 jqGrid 单元格中的复选框事件

    我正在探索jqGrid在我学习 Javascript 和 jQuery 的过程中 我成功地把checkbox在网格单元中 太棒了 这是我所拥有的 myTable jqGrid colModel name cb index cb width
  • html 链接不起作用 href javascript 参数太长

    a href alt a 在 href 中我调用了一个 javascript 函数 change 第二个参数 n1387519869249 1196 n1387519906965 1368 n 是一个非常长的值 大约 5070 个字符 但在
  • 节点遗留 url.parse 已弃用,用什么代替?

    require url parse someurl com page 已被仅弃用 并且我们严格的 linter 对此不满意 我尝试用互联网建议的内容替换我们的代码中的它new URL someurl com page 在大多数情况下都有效
  • Brunch 源映射:在 Chrome 开发工具中未命中断点

    我正在使用 Brunch 中内置的默认源映射 我看到文件很好 但无法在源映射文件中命中断点 使用 Javascript 访问调试器debugger 有效 这让我相信早午餐方面出了问题 这是我的 brunch config js module
  • jQuery JSONP ajax,未设置身份验证标头

    我正在尝试使用以下设置向 google 联系人 API 发出 ajax 请求 ajax url https www opensocial googleusercontent com api people me all dataType js
  • JavaScript 画布内存问题

    我在用着getImageData putImageData在 HTML5 画布上能够操作图片 我的问题是浏览器似乎从来没有释放任何内存 http jonelf posterous com lite gc men for sent 直到我关闭
  • 图表.js.如何更改“标签”数组的字体样式?

    我从 Chart JS 库中获取了一个图表 截屏 https i stack imgur com DnuRq png var ctx document getElementById myChart var data labels HTML
  • 使用javascript滚动滚动条或鼠标滚轮后触发事件

    我想知道是否可以触发事件after使用滚动条或鼠标滚轮 或在触摸设备上滑动 时滚动页面 基本上 我想检测用户何时停止滚动 以便我可以进行 AJAX 加载 而不是在滚动时加载 看起来jQuery s scroll 每次用户滚动时都会触发 并且
  • 如何正确地将节点从引用传递到上下文?

    我正在尝试将节点从引用传递到上下文 但是因为我在第一次渲染后没有重新渲染 所以传递的节 点是null 我考虑了两种变体 但我认为它们不是最好的 To pass ref代替ref current 但在用例中 我将被迫使用类似的东西contex
  • 是否有任何理由使用 axios 而不是 ES6 fetch [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 研究了 axios 和 ES6 fetch 的文档 我发现两者非常相似 并且都受到 ajax 及其简写的强烈影响 axios 的主要优点是浏览器
  • 为什么Promise中的代码会同步执行? [复制]

    这个问题在这里已经有答案了 在我的项目中 我有一个很长时间运行的操作 所以我决定将其放入Promise因为我认为这样我就可以在里面的代码继续执行其他操作Promise正在跑步 调试的时候发现外面的代码Promise仅当里面的代码执行Prom
  • 为某个时刻添加持续时间 (moment.js)

    时刻版本 2 0 0 阅读文档后 http momentjs com docs manipulating add 我认为这很简单 Chrome 控制台 var timestring1 2013 05 09T00 00 00Z var tim
  • 如何使用 github 托管外部 CSS 文件?

    我将 css 上传到 github 然后转到网站上的文件并单击 raw 选项 我尝试将其添加到网页中 但 chrome 给出以下错误 资源解释为样式表 但使用 MIME 类型 text plain 进行传输 https raw github
  • 为什么浏览器允许onmousedown JS改变href?

    我很长时间以来都注意到 当您尝试复制链接位置或在 Facebook 上打开链接时 它会修改链接并将其传递给l php 例如 我可以被发送到 http www facebook com l php u http 3A 2F 2Fwww goo
  • 如何在数据表角度中基于 JSON 动态填充表值?

    我在用着Angular 数据表 https l lin github io angular datatables 我需要能够根据返回的数据动态创建表 换句话说 我不想指定列标题 Example json数据 id 2 city Baltim
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 如何让php页面从html页面接收ajax post

    我有一个非常简单的表单 其中有一个名字输入字段 我捕获了表单数据 并使用标准 jQuery 发布方法通过 ajax 将其传输到 PHP 页面 但是 我根本无法从 PHP 页面获得任何在服务器端捕获数据的响应 我不确定我做错了什么或缺少什么
  • jQuery:向左滑动和向右滑动

    我见过slideUp and slideDown在 jQuery 中 左右滑动的功能 方式怎么样 您可以使用 jQuery UI 中的附加效果来做到这一点 详情请参阅此处 http docs jquery com UI Effects Sl
  • 如何强制下载图片?

    我的页面上有一个动态生成的图像 如下所示 img src 我不想告诉我的用户右键单击图像并点击保存 而是想公开一个下载链接 单击该链接将提示下载图像 如何实现这一目标 最初我在 js 中尝试这样做 var path my image att
  • 突出显示单词并提取其附近文本的函数

    我有一个文本例如 Etiam porta semmalesuada magna mollis euismod 整数取数 ante venenatis dapibus posuere velit aliquet 埃蒂亚姆 门塔 塞姆 male

随机推荐

  • mathtype使用过程中出现MathType Error:too many windows are open.错误的解决方法。

    今天下午在写毕业论文的时候 中间有许多的公式 我用的是mathtype version6 9d 76 的 当使用了一段时间后 就会报如下的错误 解决办法如下 记住不用重新开机重启等 只需要把mathtype软件关闭后 在任务管理器的后台进程
  • linux 技能包【4】:yum源

    文章目录 一 配置yum源 客户端 1 1 本地yum源 1 2 网络yum源 阿里云 二 查看yum源 三 指定 yum 源 软件安装版本 四 指定软件安装版本 五 制作本地 yum 库 服务端 六 制作网络 yum 库 服务端 一 配置
  • 查看日志的常用Linux命令(持续更新)

    1 查询符合条件的行 grep 关键字1 文件名 log grep 关键字2 grep 关键字3 grep 如果要显示行号 可加参数 n grep n 关键字 文件名 log 如果要看到符合条件的行 以及其相邻的n行可以使用如下命令 gre
  • Linux(Ubuntu18.04)和Windows10 之间的局域网文件传输

    有的时候当你需要同时使用windows和Ubuntu时 存在两者之间的文件传输或者通信问题 大多数采用移动硬盘 U盘间接传输的方式 或者干脆使用虚拟机拖拽到同类型系统内的工具传输 有没有简单一点的方法轻松地把Windows文件放到Ubunt
  • 爱心代码(web前端)陈飞宇李峋同款【容易操作】

    文章目录 前言 一 效果图 二 操作步骤 第一步 第二步 第三步 第四步 第五步 第六步 源码 前言 最近随着电视剧 点燃我温暖你 的火热播出 剧中帅气学霸李洵的炫酷爱心代码也迅速火出了圈 爱心素材也异常火爆 我在这里整理了一份大家有需自取
  • rsync脚本+linux,rsync随机启动脚本,rsync脚本

    1 bin sh 2 3 BEGIN INIT INFO4 Provides rsyncd5 Required Start remote fs syslog6 Required Stop remote fs syslog7 Should S
  • mac上完成卸载IntelliJ IDEA 2019.3编辑器

    一 finder gt 应用程序 gt 直接删除idea 二 执行以下命令 rm rf Users 自己的用户名 Library Logs IntelliJIdea2019 3 rm rf Users 自己的用户名 Library Pref
  • 解析 slim.arg_scope

    def resnet arg scope weight decay 0 0001 is training True batch norm decay 0 997 batch norm epsilon 1e 5 batch norm scal
  • C++ 引用规则

    引用及其注意事项 1 引用没有定义 是一种关系型声明 声明它和原有某一变量 实体 的关系 古而类型与源类型保持一会 且不分配内存 与被引用的变量有相同的地址 2 声明的时候必须初始化 一经声明 不可变更 3 可对引用 再次引用 多次引用的结
  • [Leetcode] 76. 最小覆盖子串

    给你一个字符串 s 一个字符串 t 返回 s 中涵盖 t 所有字符的最小子串 如果 s 中不存在涵盖 t 所有字符的子串 则返回空字符串 注意 对于 t 中重复字符 我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量 如果 s 中存
  • 算法(公式法):判断是否完全平方数

    给定一个正整数 num 编写一个函数 如果 num 是一个完全平方数 则返回 True 否则返回 False 说明 不要使用任何内置的库函数 如 sqrt 示例 1 输入 16 输出 True 示例 2 输入 14 输出 False 利用公
  • Qt常用的快捷键

    alt enter 自动创建类定义的实现 F1 查看帮助 文档 F2 快速到变量声明 Shift F2 函数的声明和定义之间快速切换 F4 在 cpp 和 h 文件切换 Ctrl M 创建书签 Ctrl 切换书签 Alt M打开书签栏 Ct
  • SVN学习2020.8.9

    SVN账号密码一般是有一个配置管理员给配置的 文件夹绿色标志 代表和服务器文档是一致的 同步更新的 同步更新服务器信息 update 执行操作都先update 再做其他 先保证本地和服务器一致 先更新 上锁 再修改 再提交 解锁 如何把本地
  • 供应链金融与区块链01——论文阅读

    本文章仅用于记录本人学习过程 当作笔记来用 如有侵权请及时告知 谢谢 1 基于区块链技术的供应链金融体系优化研究 龙云安 但是由于 互联网 供应链 无法 及时跟进资金流和信息流 导致核心企业 供应链金 融平台和提供融资的商业银行无法及时掌控
  • 解决前端跨域的问题.Access to XMLHttpRequest at http://xxx.xxx from origin 'http://localhost:8000' has been bl

    1 前端浏览器报错如下 Access to XMLHttpRequest at http xxx xxx from origin http localhost 8000 has been blocked by CORS policy Res
  • Scratch 3.0源码 之 多语言实现

    文章目录 实现方式 初始版本 多语言版本 1 页面文件 2 配置文件 3 建立关联 语法说明 案例1 带HTML标签写法 建议写法 案例2 带超链接写法 建议写法 Scratch 3 0中各类显示文本默认是英文 如果不支持自己的语言 或者自
  • 红队隧道应用篇之Neo-reGeorg实现内网穿透(四)

    简介 reGeorg是一个能够实现内网穿透的工具 基于socks5协议 且能支持众多脚本 由于此工具使用率过高 导致容易被杀毒软件拦截 现有一个项目是由reGeorg修改而来 而且做了加密和免杀处理 这款工具的名字就叫Neo reGeorg
  • sqlServer 自定义函数-传入参数并返回动态表

    自定义函数 传入参数并返回动态表 create FUNCTION dbo v usrlist usr varchar 20 传入当前用户代码 返回动态表 表里面包含编码及名称两个字段 RETURNS tolist TABLE usrcode
  • 一般面试时会遇到的九大难题的对策解析

    终于接到面试通知书了 欣喜之余开始考虑即将面对的种种问题 所谓有备无患 您是否尝试过面试彩排 建议您现在就不妨试上一试 我想这会帮助你对其他问题的回答做准备 好啦面试开始 想象着考官已经坐在您的面前 问题1 为什么不谈谈你自己 分析 这是个
  • 渲染函数render

    文章目录 节点 树以及虚拟 DOM 树 节点 虚拟 DOM vue中render函数的作用 render函数去创建子组件内容 createElement官方文档 参考 节点 树以及虚拟 DOM 在深入渲染函数之前 了解一些浏览器的工作原理是