欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

打造原生JS组件系列(二):基于HTML的模板封装步骤详解

最编程 2024-02-20 10:16:32
...

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

写在前面

  • 前面一篇文章,我们提到了 web compontens 是一套原生 js 就已经支持组件封装的技术,它由三个主要技术组成:自定义元素,HTML 模板,影子 DOM
  • 我们在前面也已经介绍了自定义元素的使用,可能大家还没体会到它的好处
  • 接下来我们会了解 HTML 模板的使用,这两者结合起来也会有神奇的效果

HTML Template

  • 顾名思义,HTML 模板 就是一个 template 标签
  • 我们可以在 template 内部定义一段特定的标签结构,将其作为模板,应用到其他合适的地方
  • template 在被浏览器解析后不会被渲染在页面上,也就是不会增加额外的标签节点,vue 中的 template 就是这样做的
  • 话不多说,我们先写一段写 demo 体验一下
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <template>
      <h2>template demo</h2>
    </template>
  </body>
</html>
  • 正常情况下,大家的页面运行后,是这样的: image.png
  • 奇怪的事情发生了,为啥页面显示与我们的预期不一致呢?
  • 其实上面也提到了,是我们的使用方式不对
  • 查看 MDN 介绍,template 本身不会被渲染到页面上,所以需要我们先将 template 中的 content 取出来,然后放到页面上才行
  • 修正后的代码如下
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <template class="temp">
      <h2>template demo</h2>
    </template>
  </body>

  <script>
    // const templateDom = document.createElement("template");
    // templateDom.innerHTML = `
    //   <div>
    //     <h2>template demo</h2>
    //   </div>
    // `;

    const templateDom = document.querySelector(".temp");

    console.log(templateDom.content);

    document.body.append(templateDom.content);
  </script>
</html>
  • 效果如下 image.png
  • 方法一
    • 直接在页面定义 template 标签及其内部结构
    • 使用 querySelect api 获取到 template dom 元素
    • 取出 template 的 content,这个 content 就是我们想要显示的结构内容
    • 最后将 content 添加到页面上
  • 方法二
    • 通过 createElement api 创建一个 template 元素
    • 然后通过设置其 innerHTML 属性,添加我们特定的想要显示的内容
    • 然后依然通过获取 template 的 content
    • 最后将 content 添加到 页面上

小结

  • 上面的用法看似很鸡肋,都看不出什么厉害的地方,其实还有一个需要与 template 搭配使用效果更佳的 slot 标签
  • 提到 slot,使用过 vue 的小伙伴可能比较熟悉,就是:插槽
  • 强大的原生 JavaScript 早就实现了 插槽 了,甚至是 具名插槽
  • 下面一篇文章我们将来介绍 template 与 slot 的组合使用

最后

  • 今天的分享就到这里,欢迎大家在评论区留言讨论
  • 如果觉得文章写的还不错的话,希望大家不要吝惜点赞,大家的鼓励是我分享的最大动力 ????