将模板与HTML自定义元素一起使用

bjg*_*222 5 javascript html5 web-component html5-template custom-element

我刚刚开始学习HTML自定义元素,并且通过阅读一系列介绍,教程和文档,我认为我对它的工作方式有很好的了解,但是我对使用或不使用正确方法有一个哲学问题该<template>标签。

自定义元素使您能够封装新功能,简化HTML文档的结构,并允许您简单地插入<my-custom-element>...</my-custom-element>标记而不是<div class="my-custom-element"><span class="part1">...</span><span class="part2">...</span></div>

然后,元素的类定义将设置该元素的结构和功能。然后,一堆教程描述了如何使用<template>...</template><slot>...</slot>设置自定义元素的内容。然后,您必须将模板代码包含在要使用该元素的每个HTML文档中,而不是在自定义元素类的构造函数中进行设置。这是否与自定义元素以使它们更易于移植的方式帮助简化和封装功能这一事实背道而驰?还是我误解了模板在文档中的正确用法和/或位置?

从SO来看,我能找到的最接近解决这个问题的方法是:

如何使用Vanilla JS淘汰自包含自定义元素中的模板?

但是答案本质上都绕在一起,说“不要使用<template>”,因此并不能真正消除我的困惑。

Sup*_*arp 7

实际上,<template>元素可以通过HTML Imports以及定义自定义元素的Javascript代码从另一个文档中导入:

<link rel="import" src="my-custom-element.html">
...
<custom-element></custom-element>
Run Code Online (Sandbox Code Playgroud)

因此,不必将其包含在每个HTML文档中。这篇文章显示了一个最小的例子。

HTML导入仅在Chrome和Opera中实现。如果您想在Firefox和Safari中使用它们,则需要使用HTML Imports polyfill

另一方面,目前,Mozilla和Apple并不打算在各自的浏览器中本地实现HTML导入。因此,他们建议使用纯Javascript模块(带有import<script src="...">)定义自定义元素,并改用模板文字字符串,这提供了一些优势(变量,函数),但有时在IDE中进行编码(由于其字符串表示形式)更加复杂。

也许将来所有浏览器都将采用标准的HTML模块,并将<template>重新成为人们关注的焦点...

请注意,如果没有HTML导入,您仍然可以使用以下命令导入一些HTML文档fetch()

fetch( "template.html" )
    .then( stream => stream.text() )
    .then( text => 
        customElements.define( "c-e", class extends HTMLElement {
            constructor() {
                super()
                this.attachShadow( { mode: 'open'} )
                    .innerHTML = text
            }
        } )
    )
Run Code Online (Sandbox Code Playgroud)

更新2019

Chrome 73之后将不再原生支持 HTML导入。然后,您应该使用上面列出的其他解决方案(polyfill,备用模块加载器JS import或使用进行直接下载fetch)。

  • HTML导入是正确的解决方案……直到9月Google宣布将弃用该功能(/sf/ask/3695402931/)。实际上,我当时提倡HTML导入(使用polyfill),但现在... :-(作为开发人员和设计师,我认为使用HTML文档作为模板比使用模板文字更好,但是Google尤其是Mozilla和Apple的人似乎还有其他兴趣...有些人的位置不对:2018年,世界上第一个平台还没有导入功能,您能相信吗? (8认同)