什么是<template>元素?

<template>是2013年定稿用于提供一种更统一、功能更强大的模板本存放方式。具体表现为

  1. 通过<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>
  2. <template>以及其子节点均不可视

  3. <template>下的img元素的src属性即使有值也不会发出资源请求

  4. <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>

首次渲染过程如下:

  1. 将通过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>
  2. 解析子节点<template v-if="status === 'offline'"></template>

    1. 进入directives/if.ts识别附着v-ifv-else的元素,并将它们从DOM树中移除
    2. 根据条件表达式status === 'offline'对以离线节点(Dettached Node)<template v-else></template>为基础创建块对象(Block)
    <div v-scope="App">
    </div>
  3. 在块对象的构造函数中会识别<template>元素,并通过content.cloneNode方法复制<template>的子节点作为模板,进行后续解析处理

    <div v-scope="App">
    </div>
  4. 最后directives/if.ts里会将块对象插入父节点中且位于锚点元素前面

    <div v-scope="App">
    <span> ONLINE </span>
    </div>

小结

  1. 这里利用的是<template>元素本身的特性实现在线解析用户不可见(你看不到我,你看不到我:D),和避免如<img src="logo.png">发送无效请求的问题;
  2. 由于<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-ifv-for,因此不会为其创建新的块对象进行处理,最后得到的UI就是这样的:

<div v-scope="App">
<template>
<div>Hello</div>
</template>
</div>

用于无法看到文字Hello。

总结

通过本篇内容的介绍,我们记得<template>必须搭配v-ifv-for使用哦!

后面我们将探索@vue/reactivity在petite-vue的使用,敬请期待。

尊重原创,转载请注明来自:https://www.cnblogs.com/fsjohnhuang/p/16011271.html 肥仔John

petite-vue源码剖析-优化手段template详解的更多相关文章

  1. object -c OOP , 源码组织 ,Foundation 框架 详解1

     object -c  OOP ,  源码组织  ,Foundation 框架 详解1 1.1 So what is OOP? OOP is a way of constructing softwar ...

  2. vuex 源码解析(三) getter属性详解

    有时候我们需要从store中的state中派生出一些状态,例如: <div id="app"> <p>{{reverseMessage}}</p> ...

  3. guava-retrying 源码解析(停止策略详解)

    一.停止策略相关类 1.停止策略接口:StopStrategy接口,只有一个抽象方法 // 是否应该停止重试.不同的停止策略有不同的实现.boolean shouldStop(Attempt fail ...

  4. guava-retrying 源码解析(等待策略详解)

    一.等待策略相关类: 1.等待策略接口:WaitStrategy接口 该接口只有一个方法,就是返回尝试失败之后,下一次尝试之前的等待时间.long computeSleepTime(Attempt f ...

  5. Laravel源码分析--Laravel生命周期详解

    一.XDEBUG调试 这里我们需要用到php的 xdebug 拓展,所以需要小伙伴们自己去装一下,因为我这里用的是docker,所以就简单介绍下在docker中使用xdebug的注意点. 1.在php ...

  6. 死磕 java并发包之AtomicStampedReference源码分析(ABA问题详解)

    问题 (1)什么是ABA? (2)ABA的危害? (3)ABA的解决方法? (4)AtomicStampedReference是什么? (5)AtomicStampedReference是怎么解决AB ...

  7. jQuery 源码解析(三) pushStack方法 详解

    该函数用于创建一个新的jQuery对象,然后将一个DOM元素集合加入到jQuery栈中,最后返回该jQuery对象,有三个参数,如下: elems Array类型 将要压入 jQuery 栈的数组元素 ...

  8. spring源码分析之spring-web http详解

    spring-web是spring webmvc的基础,它的功能如下: 1. 封装http协议中client端/server端的request请求和response响应及格式的转换,如json,rss ...

  9. spring源码分析之spring-jms模块详解

    0 概述 spring提供了一个jms集成框架,这个框架如spring 集成jdbc api一样,简化了jms api的使用. jms可以简单的分成两个功能区,消息的生产和消息的消费.JmsTempl ...

随机推荐

  1. GFS 分布式文件系统

    GFS 分布式文件系统 1.GlusterFS概述 : GlusterFS简介  a) GlusterFS是一-个开源的分布式文件系统. 由存储服务器.客户端以及NFS/Samba存储网关(可选,根据 ...

  2. JS IndexOf移除符合规则的一项

    RemoveItem: function (val) { var index = selectedUsers.indexOf(val); if (index > -1) { selectedUs ...

  3. Azure AD Domain Service(二)为域服务中的机器配置 Azure File Share 磁盘共享

    一,引言 Azure File Share 是支持两种认证方式的! 1)Active Directory 2)Storage account key 记得上次分析的 "Azure File ...

  4. 在公司内部网络如何搭建Python+selenium自动化测试环境

    在公司内部安装Python+selenium测试环境,由于不能连外网所以不能使用pip命令进行安装,经过多次尝试终于安装成功,现总结如下分享给大家,也希望跟大家一起学习和交流自动化网页测试时遇到的问题 ...

  5. spring mvc通过客户端传值,controller获取Sort对象

    之前客户端需要根据需求按不同的排序方式查看数据,按照一种约定排序,比如1代表时间升序,2代表时间降序,3,4这种形式,然后后台根据这些值创建Sort对象. 后来发现完全多此一举,可以根据特定的方式,直 ...

  6. 《PHP程序员面试笔试宝典》——如何应对面试官的“激将法”语言?

    如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> "激将法"是面试官用以淘汰求职者的一种惯用方法,它是指面试官采用怀疑.尖锐或咄咄逼人的交流方式来对求 ...

  7. Solution -「洛谷 P5827」点双连通图计数

    \(\mathcal{Description}\)   link.   求有 \(n\) 个结点的点双连通图的个数,对 \(998244353\) 取模.   \(n\le10^5\). \(\mat ...

  8. Solution -「JSOI2008」「洛谷 P4208」最小生成树计数

    \(\mathcal{Description}\)   link.   给定带权简单无向图,求其最小生成树个数.   顶点数 \(n\le10^2\),边数 \(m\le10^3\),相同边权的边数不 ...

  9. Solution Set -「ARC 107」

    「ARC 107A」Simple Math   Link.   答案为: \[\frac{a(a+1)\cdot b(b+1)\cdot c(c+1)}{8} \] 「ARC 107B」Quadrup ...

  10. Linux常用命令在Ubuntu 16下(个人笔记)

    可以通过 tab键来补全提示命令或者目录,终端命令的格式: 命令 [-选项,多个选项可以结合写] [参数] , 大多数情况可以通过 ctrl c 退出命令 磁盘管理 pwd 查看当前所在目录 即:pr ...