web component
custom element
可以建立自己的客製化元素。
由CustomElementRegistry
來產生自己客製的元件。註冊新元件
1
2
3
4
5// CustomElementRegistry.define('component-name', class, [extend property])
CustomElementRegistry.define('word-count', WordCount, {
extends: 'p'
})參數1
元件名稱(必須使用 kebab-case)
參數2
封裝元件行為的 class
參數3option
繼承的 property,可以繼承內置的元素Life Cycle
custom element 有自己的 life cycle。包含 connectedCallback、attributeChangedCallback
connectedCallback
再每一次 custom element append 進有 document-connected 的 element 時觸發。會在 element 的 content 尚未完全 parsed 的時候觸發。只要 element 不是 connect 狀態,
connectedCallback
就會在觸發。可以用 Node.isConnected 確認。disconnectedCallback
相對於connectCallback
adoptedCallback
custom element 每次移到新的 document 時觸發。
attributeChangedCallback
概述
custom element 通常有 2 種形式。
Autonomous custom elements。完全獨立的 element
不繼承任何其他元素。1
2<pop-info>
document.createElement('popup-info')Customized built-in elements。繼承已存在的 html element
1
2<p is="word-count">
document.createElement('p', { is: 'word-count' })shadow DOM
shadow DOM 是 web component 封裝 style, html structure.. 的關鍵。所謂的 DOM(Document Object Model)。一種樹狀的節點結構。在標記語言中,代表各種不同的元素與文字。
1
2
3
4
5
6
7
8
9
10
11
12<html>
<head>
<meta charset="utf-8">
<title>Simple DOM example</title>
</head>
<body>
<section>
<img src="dinosaur.png" alt="A red Tyrannosaurus Rex: A two legged dinosaur standing upright like a human, with small arms, and a large head with lots of sharp teeth.">
<p>Here we will add a link to the <a href="https://www.mozilla.org/">Mozilla homepage</a></p>
</section>
</body>
</html>下面是 shadow DOM 的相關術語
- shadow host: 一般的 DOM,shadow DOM is attach to
- shadow tree: 在shadow DOM 裡的 DOM Tree
- shadow boundary: shadow DOM 的結束,DOM 的開始
- shadow root: shadow tree 的根節點
shadow DOM 的優點就是,在 shadow DOM 裡的樣式,不會影響外面的 DOM。但可以在外面是直接影響裡面的 shadow DOM(也可以不)
其實 shadow DOM 並不是很新的技術,html 5 的 video 就是 shadow DOM 的實作。你會發現影片有很多的元件,播放控制項拉等等,可是無法從外部控制。
MODE
如果設定 `{ mode: 'closed' }`,即表示沒辦法透過 js 取得 `myCustomElem.shadowRoot`。表示沒有辦法透過外層直接改變 shadow DOM 的內容。
- html template
使用 web component 可以解決的缺點
- 假設要使用別人的 library 可能需要先載入對方套件裡用的 jQuery、css…
- css 的 scope 問題。
- 相容性:各 framework 的 component 無法共用。如果要把舊專案移植到 React 的話,也是要花一些時間調整。
其他
React 的主旨在於 state 跟 view 的管理方式。
而 web components 在於整理元件的封裝,包含 scoped css 等。
並不是每一個 elemebt 都有 attachShadow 可以使用。
問題
- shadow DOM 解決了 css 的問題,也把所有功能都封裝起來。可是,要如何更好寫 html。
Ans: html Template
REF
https://blog.techbridge.cc/2017/01/06/web-components/
shadow DOM
https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM
https://blog.revillweb.com/open-vs-closed-shadow-dom-9f3d7427d1af
html tempalte
https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_templates_and_slots