Skip to content

Template

当需要重复使用相同的 HTML 结构时,可以使用 <template> 元素。<template> 元素中的内容不会渲染到 DOM 中,但可以通过 JavaScript 引用。template 的常用场景是与自定义元素搭配使用:

下面通过 <template> 定义一个 <p>

html
<template id="my-paragraph">
  <p>My paragraph</p>
</template>

template 中的内容插入到 shadown DOM 中:

js
customElements.define(
  'my-paragraph',
  class extends HTMLElement {
    constructor() {
      super()
      let template = document.getElementById('my-paragraph')
      let templateContent = template.content

      const shadowRoot = this.attachShadow({ mode: 'open' })
      shadowRoot.appendChild(templateContent.cloneNode(true))
    }
  }
)

样式定义

当想添加样式信息的时候,可以在 <template> 使用 <style> 元素:

html
<template id="my-paragraph">
  <style>
    p {
      color: white;
      background-color: #666;
      padding: 5px;
    }
  </style>
  <p>My paragraph</p>
</template>

slot

到目前为止,自定义元素的内容是固定的,如果想让 <my-paragraph> 元素可以像 <p> 元素一样可以展示自定义的内容,则可以使用 <slot> 元素。不同的 slot 通过 name 属性来区别。另外 slot 还可以定义占位符,当没有传入内容的时候,则展示占位符内容。

在 template 中定义 slot:

html
<template id="my-paragraph">
  <p><slot name="my-text">My default text</slot></p>
</template>

使用自定义元素的时候通过 slot 定义内容:

html
<my-paragraph>
  <span slot="my-text">My custom text</span>
</my-paragraph>

<slot> 是可以不定义 name 属性的,这样的 <slot> 会被自定义元素顶层没有 slot 属性的子节点填充。