码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • petite-vue源码剖析-优化手段template详解


    什么是<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-if、v-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-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

  • 相关阅读:
    docker方式安装redis-自定义redis配置文件
    软件测试/测试开发丨Web自动化—capability参数配置 学习笔记
    8.Docker MySQL 主从复制
    港陆证券:日线9连阴意味着什么?
    数字时代,VR虚拟展会打造全渠道同步营销新模式
    聚类分析、matlab\我国各地区普通高等教育发展状况分析、Q型、R型聚类
    springboot导入spring-boot-maven-plugin插件报错及打包项目到服务器上运行(手动导入加自动导入方法)-详细
    Git安装配置保姆级教程和Git创建仓库的基本原理和常用命令
    android 自动化测试的小知识点
    图文结合,手把手教你ubuntu18-live-server-amd64服务器版的安装、配置静态ip以及换源
  • 原文地址:https://www.cnblogs.com/fsjohnhuang/p/16011271.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号