ä½¿ç¨æ¨¡æ¿åææ§½
è¿ç¯æç« éè¿°äºå¦ä½ä½¿ç¨ <template> å <slot> å
ç´ å建ä¸ä¸ªå¯ä»¥ç¨æ¥çµæ´»å¡«å
Web ç»ä»¶çå½±å DOM çæ¨¡æ¿ã
å ³äºæ¨¡æ¿
å½ä½ å¿
é¡»å¨ç½é¡µä¸å¤ç¨ç¸åçæ è®°ç»ææ¶ï¼ä½¿ç¨æç§æ¨¡æ¿è䏿¯ä¸éåä¸éå°éå¤ç¸åçç»ææ¯ææä¹çã以åä¹å¯ä»¥å®ç°è¿ä¸ç¹ï¼ä½ HTML <template> å
ç´ ä½¿å¾è¿ä¸ªè¿ç¨æ´å ç®åãæ¤å
ç´ åå
¶å
容ä¸ä¼å¨ DOM 䏿¸²æï¼ä½ä»å¯ä½¿ç¨ JavaScript å¼ç¨å®ã
让æä»¬çä¸ä¸ªç®åç示ä¾ï¼
<template id="my-paragraph">
<p>æç段è½</p>
</template>
é¤éä½ ä½¿ç¨ JavaScript è·å对å®çå¼ç¨ï¼ç¶å使ç¨ç±»ä¼¼ä¸é¢ç代ç å°å ¶éå å° DOM ä¸ï¼å¦åå®ä¸ä¼åºç°å¨ä½ ç页é¢ä¸ï¼
let template = document.getElementById("my-paragraph");
let templateContent = template.content;
document.body.appendChild(templateContent);
è½ç¶æ¯ä¸ªç®åçä¾åï¼ä½ä½ å·²ç»å¯ä»¥å¼å§äºè§£å®æ¯å¤ä¹çæç¨äºã
å¨ Web Component ä¸ä½¿ç¨æ¨¡æ¿
æ¨¡æ¿æ¬èº«å°±å¾æç¨ï¼ä½ä¸ web ç»ä»¶ä¸èµ·ä½¿ç¨æææ´å¥½ã让æä»¬å®ä¹ä¸ä¸ªå为 <my-paragraph> ç web ç»ä»¶ï¼ä½¿ç¨æ¨¡æ¿ä½ä¸ºå
¶å½±å DOM çå
容ï¼
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));
}
},
);
è¿éè¦æ³¨æçå
³é®ç¹æ¯ï¼æä»¬å°æ¨¡çå
容çå
éæ·»å å°éè¿ Node.cloneNode() æ¹æ³å建çå½±åæ ¹ä¸
ç±äºæä»¬æ·»å äºæ¨¡æ¿çå
容å°å½±å DOMï¼æä»¬å¯ä»¥å¨æ¨¡æ¿ç <style> å
ç´ ä¸å
å«ä¸äºæ ·å¼ä¿¡æ¯ï¼ç¶åå°å
¶å°è£
å¨èªå®ä¹å
ç´ ä¸ã妿åªå°å®æ·»å å°ä¸ä¸ªæ åç DOM 䏿¯ä¸èµ·ä½ç¨çã
æ¯å¦ï¼
<template id="my-paragraph">
<style>
p {
color: white;
background-color: #666;
padding: 5px;
}
</style>
<p>æç段è½</p>
</template>
ç°å¨æä»¬å°å®æ·»å å°èªå·±ç HTML ææ¡£ä¸è¯è¯çï¼
<my-paragraph></my-paragraph>
ä½¿ç¨ææ§½å¢å çµæ´»åº¦
尽管å°è¿ä¸æ¥å·²ç»æºå¥½äºï¼ä½æ¯å
ç´ ä»æ§ä¸æ¯å¾çµæ´»ãæä»¬åªè½å¨é颿¾ç¤ºä¸ç¹ææ¬ï¼çè³æ²¡ææ®éæ®µè½æ ç¾æç¨ï¼æä»¬å¯ä»¥ä½¿ç¨ <slot> å
ç´ éè¿å£°æå¼çè¯æ³å¨æ¯ä¸ªå
ç´ å®ä¾ä¸æ¾ç¤ºä¸åçææ¬ã
ææ§½ç±å
¶ name 屿§æ è¯ï¼å¹¶ä¸å
è®¸ä½ å¨æ¨¡æ¿ä¸å®ä¹å ä½ç¬¦ï¼å½å¨æ è®°ä¸ä½¿ç¨è¯¥å
ç´ æ¶ï¼è¯¥å ä½ç¬¦å¯ä»¥å¡«å
æéçä»»ä½ HTML æ è®°çæ®µã
å æ¤ï¼å¦ææä»¬æ³æ·»å ä¸ä¸ªææ§½å°è¿ä¸ªç®åçä¾åä¸ï¼æä»¬ä¼å°æ¨¡æ¿ç段è½å ç´ æ¹æä¸é¢è¿æ ·ï¼
<p><slot name="my-text">æçé»è®¤ææ¬</slot></p>
妿卿 è®°ä¸å
å«å
ç´ æ¶æªå®ä¹ç¸å
³çææ§½å
å®¹ï¼æè
æµè§å¨ä¸æ¯æææ§½ï¼å <my-paragraph> ä»
å
å«åå¤å
容 "æçé»è®¤ææ¬"ã
è¦å®ä¹ææ§½å
å®¹ï¼æä»¬å¨ <my-paragraph> å
ç´ å
å
æ¬ä¸ä¸ª HTML ç»æï¼è¯¥ç»æå
·æ slot 屿§ï¼å
¶å¼çäºæä»¬è¦å¡«å
ç <slot> ç name 屿§çå¼ãåä¹å䏿 ·ï¼å®å¯ä»¥æ¯ä½ 忬¢çä»»ä½ä¸è¥¿ï¼ä¾å¦ï¼
<my-paragraph>
<span slot="my-text">让æä»¬ä½¿ç¨ä¸äºä¸åçææ¬ï¼</span>
</my-paragraph>
æè
<my-paragraph>
<ul slot="my-text">
<li>让æä»¬ä½¿ç¨ä¸äºä¸åçææ¬ï¼</li>
<li>In a list!</li>
</ul>
</my-paragraph>
夿³¨ï¼å¯ä»¥è¢«æå ¥å°æ§½ä¸çèç¹è¢«ç§°ä¸º Slotableï¼å·²ç»æå ¥å°æ§½ä¸çèç¹è¢«ç§°ä¸º slottedã
夿³¨ï¼æªå½åç <slot> å
ç´ å°å¡«å
èªå®ä¹å
ç´ ä¸ææä¸å« slot 屿§ç顶级åèç¹ãä¹å
æ¬ææ¬èç¹ã
è¿å°±æä»¬çç®åä¾åï¼å¦æä½ æ³ç»§ç»äºè§£ï¼ä½ å¯ä»¥å¨ GitHub 䏿¥çï¼å¦è§å¨çº¿è¿è¡ï¼ã
æ´æ·±å ¥ç示ä¾
ä¸ºäºæ´å¥½çç»æè¿ç¯æç« ï¼æä»¬æ¥çä¸ä¸ªä¸é£ä¹å¯»å¸¸ç示ä¾ã
ä¸é¢çä¸ç»ä»£ç çæ®µå±ç¤ºäºæä»¬å¦ä½èåä½¿ç¨ <slot> å <template> 以åä¸äº JavaScript æ¥å®ç°ï¼
- ä½¿ç¨ å
·åææ§½å¨å½±åæ ¹ä¸å建ä¸ä¸ª
<element-details>å ç´ ã - å°
<element-details>å ç´ è®¾è®¡æå¨ææ¡£ä¸ä½¿ç¨æ¶ï¼å®å°å ¶å½±åæ ¹ä¸çå 容å该å ç´ å é¨çå å®¹ç³ åå¨ä¸èµ·ââå³å ç´ å 容ä¸ççæ®µè¢«å¡«å å°å ç´ å½±åæ ¹çå ·åææ§½ ä¸ã
注æï¼ææ¯ä¸æ¥è®²è±ç¦» <template> ä½¿ç¨ <slot> 乿¯å¯ä»¥çãä¾å¦ï¼<slot> å¨ä¸ä¸ªå¸¸è§ç <div> å
ç´ éï¼ä»ç¶æå ä½ç¬¦çç¹æ§ï¼å°±åå¨å½±å DOM ä¸ä¸æ ·ï¼è¿æ ·æä»¬è½é¿å
éè¦å
è·å模æ¿å¯¹è±¡ç content 屿§å使ç¨å®ç麻ç¦ãç¶èè¿ä¸ªç¹æ§å¨å <template> å
ç´ ä¸æ·»å ææ§½æ¶æ´å å®ç¨ï¼å ä¸ºä½ ä¸å¤ªå¯è½åºäºä¸ä¸ªå·²æ¸²æçå
ç´ å®ä¹ä¸ä¸ªæ¨¡å¼ã
å¦å¤ï¼å°±ç®å®è¿æ²¡ææ¸²æï¼ä½¿ç¨ <template> æ¶ï¼å®¹å¨ä½ä¸ºæ¨¡æ¿çç®çå¨è¯ä¹ä¸åºè¯¥æ¸
æ°ãèä¸ <template> ä¸å¯ä»¥ç´æ¥æ·»å ä¸äºå¯¹è±¡ï¼å¦ <td>ï¼å½æ·»å å° <div> 䏿¶ä¼éèã
夿³¨ï¼ä½ å¯ä»¥å¨ element-details æ¥çè¿ä¸ªå®æ´çä¾åï¼å¦è§å¨çº¿è¿è¡ï¼ã
ä½¿ç¨ææ§½å建ä¸ä¸ªæ¨¡æ¿
é¦å
ï¼æä»¬å¨ <template> å
ç´ ä¸ä½¿ç¨ <slot> å
ç´ æ¥å建ä¸ä¸ªæ°çâelement-details-templateâææ¡£ç段ï¼å
¶ä¸å
å«ä¸äºå
·åææ§½ï¼
<template id="element-details-template">
<style>
details {
font-family: "Open Sans Light", Helvetica, Arial;
}
.name {
font-weight: bold;
color: #217ac0;
font-size: 120%;
}
h4 {
margin: 10px 0 -8px 0;
}
h4 span {
background: #217ac0;
padding: 2px 6px 2px 6px;
}
h4 span {
border: 1px solid #cee9f9;
border-radius: 4px;
}
h4 span {
color: white;
}
.attributes {
margin-left: 22px;
font-size: 90%;
}
.attributes p {
margin-left: 16px;
font-style: italic;
}
</style>
<details>
<summary>
<span>
<code class="name"
><<slot name="element-name">NEED NAME</slot>></code
>
<i class="desc"><slot name="description">NEED DESCRIPTION</slot></i>
</span>
</summary>
<div class="attributes">
<h4><span>Attributes</span></h4>
<slot name="attributes"><p>None</p></slot>
</div>
</details>
<hr />
</template>
ä¸é¢è¿ä¸ª <template> å
ç´ æå 个ç¹å¾ï¼
-
<template>æä¸ä¸ª<style>å ç´ ï¼é颿ä¸äºåªè½å¨å½å<template>ä¸åå»ºçææ¡£ç段èå´å çæç CSS æ ·å¼ -
<template>使ç¨<slot>åå ¶name屿§æ¥å建ä¸ä¸ªå ·åææ§½ï¼<slot name="element-name"><slot name="description"><slot name="attributes">
-
<template>å°å ·åææ§½å 裹å¨<details>å ç´ ä¸ã
ä» <template> ä¸å建ä¸ä¸ªæ°ç <element-details> å ç´
æ¥ä¸æ¥ï¼æä»¬å建ä¸ä¸ªå为 <element-details> çæ°èªå®ä¹å
ç´ ï¼ç¶åç¨ Element.attachShadow æ¥å°ä¸é¢éè¿ <template> å
ç´ åå»ºçææ¡£ç段ä½ä¸ºå½±åæ ¹éå å°å®ä¸é¢ï¼è¿ä½¿ç¨äºä¸æä»¬å¨ä¹åçç®å示ä¾ä¸çå°çå®å
¨ç¸åçæ¨¡å¼ã
customElements.define(
"element-details",
class extends HTMLElement {
constructor() {
super();
var template = document.getElementById(
"element-details-template",
).content;
const shadowRoot = this.attachShadow({ mode: "open" }).appendChild(
template.cloneNode(true),
);
}
},
);
ç»åå ·åææ§½ä½¿ç¨èªå®ä¹å ç´ <element-details>
ç°å¨è®©æä»¬æ£å¼å¨ææ¡£ä¸ä½¿ç¨ <element-details> å ç´ ï¼
<element-details>
<span slot="element-name">ææ§½</span>
<span slot="description"
>ç¨æ·å¯ä»¥ç¨èªå·±ç¼åçæ è®°å¡«å
è³ web ç»ä»¶ä¸çå ä½ç¬¦ï¼ä»èè¾¾å°ç»åä¸å DOM
æ çææã</span
>
<dl slot="attributes">
<dt>åç§°</dt>
<dd>ææ§½çåç§°</dd>
</dl>
</element-details>
<element-details>
<span slot="element-name">模æ¿</span>
<span slot="description"
>ä¸ç§ç¨äºä¿å客æ·ç«¯å
å®¹çæºå¶ï¼æ¤ç±»å
容ä¸ä¼å¨é¡µé¢å è½½æ¶åç°ï¼ä½éåå¯è½å¨è¿è¡æ¶ä½¿ç¨
JavaScript å®ä¾åã</span
>
</element-details>
å ³äºä»¥ä¸ä»£ç çæ®µï¼æ³¨æä»¥ä¸å ç¹ï¼
- 该代ç çæ®µæä¸¤ä¸ª
<element-details>å ç´ ï¼å®ä»¬é½ä½¿ç¨äºslot屿§æ¥å¼ç¨å为"element-name"å"description"ççå ·åææ§½ï¼å¹¶æå®ä»¬é½æ¾å¨å½±åæ ¹ä¸ã - åªæç¬¬ä¸ä¸ª
<element-details>å ç´ å¼ç¨äºå为"attributes"çå ·åææ§½ï¼è第äºä¸ª<element-details>æ ç¾æ²¡æå¼ç¨å为"attributes"çå ·åææ§½ã - 第ä¸ä¸ª
<element-details>å ç´ ä¸ç<dl>å ç´ ä½¿ç¨å å«åå ç´<dt>å<dd>ç<dl>å ç´ å¼ç¨äº"attributes"å ·åææ§½ã
æ·»å ä¸äºæç»çæ ·å¼
å¨å®æä¹åï¼æä»¬å¨ææ¡£ä¸ç» <dl> å <dt> 以å <dd> å
ç´ å¢å ä¸äº CSS æ ·å¼ã
dl {
margin-left: 6px;
}
dt {
font-weight: bold;
color: #217ac0;
font-size: 110%;
}
dt {
font-family: Consolas, "Liberation Mono", Courier;
}
dd {
margin-left: 16px;
}
ç»æ
æåï¼è®©æä»¬ææç代ç çæ®µç»åå¨ä¸èµ·ï¼ççæ¸²æçç»ææ¯ä»ä¹æ ·çã
å ³äºç»æè¯·æ³¨æä»¥ä¸å ç¹ï¼
- å³ä½¿
<element-details>å ç´ å¹¶æ²¡æç´æ¥ä½¿ç¨<details>å ç´ å ç´ ï¼ä½æ¯å¨æ¸²æçæ¶å使ç¨äº<details>å ç´ ï¼æ¯å ä¸ºå½±åæ ¹ä½¿å¾å®ä»¬è¢«å¡«å ã - 卿¸²æç
<details>ç»æä¸ï¼<element-details>å ç´ å¡«å äºå½±åæ ¹ä¸çå ·åææ§½ãæ¢è¨ä¹ï¼<element-details>ç DOM æ åå½±åæ ¹çå 容ç»åå¨äºä¸èµ·ã - 对äºè¿ä¸¤ä¸ª
<element-details>å ç´ ï¼Attributes æ é¢ä¼èªå¨ä»å½±åæ ¹ä¸æ·»å å°å为"attribute"çå ·åææ§½çåé¢ã - å 为第ä¸ä¸ª
<element-details>å ç´ ç<dl>å ç´ å°±æç¡®å¼ç¨äºå为"attributes"çå ·åææ§½ï¼æä»¥è¯¥<dl>å ç´ çå 容å°ä¼æ¿æ¢è¯¥å ç´ ä¸å为"attributes"çå ·åææ§½ã - å 为第äºä¸ª
<element-details>å ç´ æ²¡ææ¾å¼å¼ç¨å ¶å½±åæ ¹ä¸å为"attributes"çå ·åææ§½ï¼æä»¥å ç´ å å为"attributes"çå ·åææ§½çå 容å°ä¼ä½¿ç¨æ¨¡æ¿ä¸é»è®¤çå 容ã