gpt4 book ai didi

web-component - HTML 模板与在 Web 组件中定义 HTML

转载 作者:行者123 更新时间:2023-12-05 01:32:59 24 4
gpt4 key购买 nike

当您可以简单地在 Web 组件 (shadowRoot.innerHTML) 中定义 HTML 时,我似乎无法理解或找出为什么您应该将 HTML 模板与 Web 组件一起使用。

创建模板并将其克隆到 Web 组件中有什么好处?我可以看出如果两个 Web 组件共享相同的 HTML 是有原因的,但除此之外我不知道。

我是否缺少一些基本重要的东西?

最佳答案

是的,太多的博客都这样做了document.createElement("template")哪里有.innerHTML将做同样的事情......而且代码更少......而且速度更快。

请注意,模板与自定义元素 API 或 shadowDOM 无关。
3 种 Web 组件 技术中的每一种都可以单独使用。

模板

当您想在 HTML 文档中存储可重复使用的内容时,模板非常有用,因为它不会被解析。

在过去我们会使用 <div hidden>并祈祷它的内容不会影响页面的其余部分。

就像过去一样,您可以阅读 Template.innerHTML 并使用 String 值做任何您想做的事情。

更现代的方法是克隆模板,请注意 .content属性是必需的,您会得到一个 Document-Fragment 值作为返回。

<template id="MY-TEMPLATE">
<article>
...
</article>
</template>

document.getElementById("MY-TEMPLATE").content.cloneNode(true)

模板和 shadowDOM

当您拥有带有 shadowDOM 的自定义元素时,模板非常适合定义 shadowDOM 内容。

为什么这么多开发者想做 HTML-in-JS 和 CSS-in-JS 我不明白。
如果您有 HTML 文档,请将内容存储在那里,这样更容易编辑。

<template id="MY-ELEMENT">
<style>
/* style shadowDOM here */
</style>
<slot></slot>
</template>

所有你的 MY-ELEMENT 需要做的是:

super()  // or this when done in the connectedCallback
.attachShadow({mode: 'open'})
.append(document.getElementById(this.nodeName).content.cloneNode(true))

性能

包含 HTML 内容的 innerHTML 字符串将针对每次使用进行解析。

一个模板被解析一次,因此可以节省 CPU 周期,当您多次使用同一模板时

用法

我个人的偏好是在 <TEMPLATEs> 中保留尽可能多的 HTML(和 CSS)尽可能在 HTML 中。只有当我不希望我的组件不可配置时,我才在 JS 中使用 static HTML,使用 .innerHTML , 不是 .createElement("template")为了代码简洁而不是(次要)性能提升

只有在需要尽快加载/执行的 SDWC(自毁 Web 组件)中,我才将所有内容包含在组件中:

customElements.define('my-head',class extends HTMLElement{
connectedCallback(){
// generate <HEAD> content, <SCRIPTS> and <STYLE> CSS-in-JS here

this.remove();

}
});

关于web-component - HTML 模板与在 Web 组件中定义 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65038637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com