petite-vue源码剖析-优化手段template详解
什么是<template>元素?
<template>是2013年定稿用于提供一种更统一、功能更强大的模板本存放方式。具体表现为
通过
<template>元素属性content获取已实例化的HTML元素(不是字符串而已)<template id="tpl">
<div>a</div>
<div>b</div>
</template>
<script>
const tpl = document.getElementById('tpl')
tpl.content // document-fragment
tpl.content.children[0].outerHTML // <div>a</div>
</script>
<template>以及其子节点均不可视<template>下的img元素的src属性即使有值也不会发出资源请求<template>下的script和css规则均不会解析和执行
更多信息请查看:《HTML语义化:HTML5新标签——template》
v-if搭配<template>
<div v-scope="App"></div>
<script type="module">
import { createApp } from 'https://unpkg.com/petite-vue?module'
createApp({
App: {
$template: `
<template v-if="status === 'offline'">
<span> OFFLINE </span>
</template>
<template v-else>
<span> ONLINE </span>
</template>
`,
}
status: 'online'
}).mount('[v-scope]')
</script>
首次渲染过程如下:
将通过walk.ts中的
resolveTemplate方法将App.$template渲染到DOM树上<div v-scope="App">
<template v-if="status === 'offline'">
<span> OFFLINE </span>
</template>
<template v-else>
<span> ONLINE </span>
</template>
</div>
解析子节点
<template v-if="status === 'offline'"></template>- 进入directives/if.ts识别附着
v-if、v-else的元素,并将它们从DOM树中移除 - 根据条件表达式
status === 'offline'对以离线节点(Dettached Node)<template v-else></template>为基础创建块对象(Block)
<div v-scope="App">
</div>
- 进入directives/if.ts识别附着
在块对象的构造函数中会识别
<template>元素,并通过content.cloneNode方法复制<template>的子节点作为模板,进行后续解析处理<div v-scope="App">
</div>
最后directives/if.ts里会将块对象插入父节点中且位于锚点元素前面
<div v-scope="App">
<span> ONLINE </span>
</div>
小结
- 这里利用的是
<template>元素本身的特性实现在线解析用户不可见(你看不到我,你看不到我:D),和避免如<img src="logo.png">发送无效请求的问题; - 由于
<template>是在block.ts中处理获取模板,因此v-for搭配<template>的原理和v-if是一致的。
错误使用
虽然<template>能帮助我们优化用户体验和性能,但有些时候也会让我们掉到坑里面,下面一起绕过这些坑吧!
<div v-scope="App"></div>
<script type="module">
import { createApp } from 'https://unpkg.com/petite-vue?module'
createApp({
App: {
$template: `
<template>
<div>Hello</div>
</template>
`,
}
status: 'online'
}).mount('[v-scope]')
</script>
根块对象对应的是<div v-scope="App"></div>,而<template>由于没有附加v-if或v-for,因此不会为其创建新的块对象进行处理,最后得到的UI就是这样的:
<div v-scope="App">
<template>
<div>Hello</div>
</template>
</div>
用于无法看到文字Hello。
总结
通过本篇内容的介绍,我们记得<template>必须搭配v-if或v-for使用哦!
后面我们将探索@vue/reactivity在petite-vue的使用,敬请期待。
尊重原创,转载请注明来自:https://www.cnblogs.com/fsjohnhuang/p/16011271.html 肥仔John
petite-vue源码剖析-优化手段template详解的更多相关文章
- object -c OOP , 源码组织 ,Foundation 框架 详解1
object -c OOP , 源码组织 ,Foundation 框架 详解1 1.1 So what is OOP? OOP is a way of constructing softwar ...
- vuex 源码解析(三) getter属性详解
有时候我们需要从store中的state中派生出一些状态,例如: <div id="app"> <p>{{reverseMessage}}</p> ...
- guava-retrying 源码解析(停止策略详解)
一.停止策略相关类 1.停止策略接口:StopStrategy接口,只有一个抽象方法 // 是否应该停止重试.不同的停止策略有不同的实现.boolean shouldStop(Attempt fail ...
- guava-retrying 源码解析(等待策略详解)
一.等待策略相关类: 1.等待策略接口:WaitStrategy接口 该接口只有一个方法,就是返回尝试失败之后,下一次尝试之前的等待时间.long computeSleepTime(Attempt f ...
- Laravel源码分析--Laravel生命周期详解
一.XDEBUG调试 这里我们需要用到php的 xdebug 拓展,所以需要小伙伴们自己去装一下,因为我这里用的是docker,所以就简单介绍下在docker中使用xdebug的注意点. 1.在php ...
- 死磕 java并发包之AtomicStampedReference源码分析(ABA问题详解)
问题 (1)什么是ABA? (2)ABA的危害? (3)ABA的解决方法? (4)AtomicStampedReference是什么? (5)AtomicStampedReference是怎么解决AB ...
- jQuery 源码解析(三) pushStack方法 详解
该函数用于创建一个新的jQuery对象,然后将一个DOM元素集合加入到jQuery栈中,最后返回该jQuery对象,有三个参数,如下: elems Array类型 将要压入 jQuery 栈的数组元素 ...
- spring源码分析之spring-web http详解
spring-web是spring webmvc的基础,它的功能如下: 1. 封装http协议中client端/server端的request请求和response响应及格式的转换,如json,rss ...
- spring源码分析之spring-jms模块详解
0 概述 spring提供了一个jms集成框架,这个框架如spring 集成jdbc api一样,简化了jms api的使用. jms可以简单的分成两个功能区,消息的生产和消息的消费.JmsTempl ...
随机推荐
- NSInvocation的基本使用
//封装invacation可以调用多个参数的方法 -(void)invacation { //1.创建一个MethodSignature,签名中保存了方法的名称,参数和返回值 //这个方法属于谁,那 ...
- IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET
感谢大佬:https://www.cnblogs.com/sixindev/p/4723590.html 下面这些内容不了解也可以进行开发,深入了解一下还是收益良多 区别 TCP.UDP.HTTP.S ...
- uniapp 使用iconfont图标
步骤一 新建项目 步骤二 导入需要的图标,然后下载图标代码 步骤三 打开下载的压缩文件中的iconfont.css 步骤四 复制粘贴到项目中 步骤四在项目中使用 use in page
- CSS解决父级边框坍塌的问题
1. 浮动元素后面增加空的div 首先在父级标签内添加如下<div>标签 <div id="clear"></div> 然后在CSS中对该标签进 ...
- postman项目接口文档和登录步骤原理
培训内容 实训项目:非常果岭-发现模块接口测试,单接口.流程脚本编写: 使用工具:postman 培训方式 1)postman使用说明 2)项目接口文档和登录步骤原理 一.首先了解postman使 ...
- 以鶸ice为例,手撸一个解释器(一)明确目标
代码地址 # HelloWorld.ice print("hello, world") 前言(废话) 其实从开始学习编译原理到现在已经有快半年的时间了,但是其间常常不能坚持看下去龙 ...
- Solution -「HDU 5498」Tree
\(\mathcal{Description}\) link. 给定一个 \(n\) 个结点 \(m\) 条边的无向图,\(q\) 次操作每次随机选出一条边.问 \(q\) 条边去重后构成生成 ...
- Solution -「CF 1023F」Mobile Phone Network
\(\mathcal{Description}\) Link. 有一个 \(n\) 个结点的图,并给定 \(m_1\) 条无向带权黑边,\(m_2\) 条无向无权白边.你需要为每条白边指定边权 ...
- Redis 中常见的集群部署方案
Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...
- 树莓派安装docker并使用docker图形化工具portainer
配置环境 系统:Raspbian 11(64位) 设备:树莓派4B 一.安装docker 1.安装 curl -fsSL https://get.docker.com -o get-docker.sh ...