精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

十分鐘帶你入門 Web Components

開發(fā) 前端
Web Components 本身不是一個(gè)單獨(dú)的規(guī)范,而是由一組 DOM API 和 HTML 規(guī)范所組成,用于創(chuàng)建可復(fù)用的自定義名字的 HTML 標(biāo)簽,并且可以直接在你的 Web 應(yīng)用中使用。

什么是 web components

組件封裝,是我們前端一直在探討的話題。但現(xiàn)在我們的組件庫,更多的是基于某個(gè)框架去實(shí)現(xiàn),比如 Vue 的 ElementUI,React 的 ANTD。這種組件的缺點(diǎn)就是對外部框架的依賴,你必須基于 Vue 或者 React 才能使用,假如某一天項(xiàng)目遷移又得重新書寫一套。

那能不能基于原生的 HTML/CSS/JS 就能封裝的組件規(guī)范呢?那就是 Web Components。

Web Components 本身不是一個(gè)單獨(dú)的規(guī)范,而是由一組 DOM API 和 HTML 規(guī)范所組成,用于創(chuàng)建可復(fù)用的自定義名字的 HTML 標(biāo)簽,并且可以直接在你的 Web 應(yīng)用中使用。

組件的定義以及核心目標(biāo)

我認(rèn)為組件就是內(nèi)部抽象封裝了一定的邏輯功能,并暴露相關(guān)接口給外部調(diào)用。

它能夠完成以下的功能:

  • 復(fù)用:組件將會作為一種復(fù)用單元,被用在多處。
  • 解耦:組件本身隔離了變化,組件開發(fā)者和業(yè)務(wù)開發(fā)者可以根據(jù)組件的約定各自獨(dú)立開發(fā)和測試。
  • 封裝:組件屏蔽了內(nèi)部的細(xì)節(jié),組件的使用者可以只關(guān)心組件的屬性和事件和方法。
  • 抽象:組件通過屬性和事件、方法等基礎(chǔ)設(shè)施提供了一種描述??UI?? 的統(tǒng)一模式,降低了使用者學(xué)習(xí)的心智成本。

那 Web Components 怎么做到以上幾點(diǎn)的呢?

Web Components 的核心概念

主要有以下幾點(diǎn):

  • Custom elements(自定義元素):一組 JavaScript API,允許您定義 custom elements 及其行為,然后可以在您的用戶界面中按照需要使用它們。
  • Shadow DOM(影子 DOM):一組 JavaScript API,用于將封裝的“影子”DOM 樹附加到元素(與主文檔 DOM 分開呈現(xiàn))并控制其關(guān)聯(lián)的功能。通過這種方式,您可以保持元素的功能私有,這樣它們就可以被腳本化和樣式化,而不用擔(dān)心與文檔的其他部分發(fā)生沖突。
  • HTML templates(HTML 模板):<template>? 和<slot> 元素使您可以編寫不在呈現(xiàn)頁面中顯示的標(biāo)記模板。然后它們可以作為自定義元素結(jié)構(gòu)的基礎(chǔ)被多次重用。

我們接下來通過封裝一個(gè) user-card Web Components 組件實(shí)戰(zhàn)說明一下。本文 Demo 地址[1]。

HTML 模板

我們先定義好它的 HTML 和 CSS。

<template id="userCardTemplate">
<style>
:host {
display: flex;
align-items: center;
// 省略部分代碼...
}
// 省略很多的CSS 代碼
</style>

<img class="image" />
<div class="container">
<slot name="name"></slot>
<slot name="email"></slot>
<button class="button">Follow Gopal</button>
</div>
</template>

這里留意幾點(diǎn):

  • template 可以理解成普通的 div,只是這個(gè)元素內(nèi)的所有內(nèi)容不會直接展示到界面上。
  • template 標(biāo)簽中可以直接插入 style 標(biāo)簽在,模板內(nèi)部定義樣式。其中:host? 偽類用來定義shadow-root 的樣式,也就是包裹這個(gè)模板的標(biāo)簽的樣式。
  • 留意占位符。該占位符可以在后期使用自己的標(biāo)記語言填充,后面我們會提到。它的使用跟 Vue 的插槽是一樣的。應(yīng)該說 Vue 借鑒了它的實(shí)現(xiàn)。

Custom elements(自定義元素)

使用 CustomElementRegistry.define() 方法注冊您的新自定義元素 ,并向其傳遞要定義的元素名稱、指定元素功能的類、以及可選的其所繼承自的元素。

  • 自定義元素的名稱,一個(gè) DOMString 標(biāo)準(zhǔn)的字符串,為了防止自定義元素的沖突,必須是一個(gè)帶短橫線連接的名稱(e.g. custom-tag)。這個(gè)也是 Vue 自定義組件命名推薦的使用方式。
  • constructor。自定義元素構(gòu)造器,包含組件的生命周期的定義。
  • 擴(kuò)展參數(shù)(可選),該參數(shù)類型為一個(gè)對象,且需要包含 extends 屬性,用于指定創(chuàng)建的元素繼承自哪一個(gè)內(nèi)置元素(e.g. { extends: 'p' })。

代碼如下:

class UserCard extends HTMLElement {
constructor() {
// 必須調(diào)用 super();
super();
// 創(chuàng)建一個(gè) shadow 節(jié)點(diǎn),創(chuàng)建的其他元素應(yīng)附著在該節(jié)點(diǎn)上
var shadow = this.attachShadow({ mode: "closed" });
// 獲取到模板實(shí)例
var templateElem = document.getElementById("userCardTemplate");
// 進(jìn)行拷貝,因?yàn)轫撁嫔系哪0宀⒉皇且淮涡缘模赡芷渌慕M件也要引用
var content = templateElem.content.cloneNode(true);
// this.getAttribute 可以獲取到組件的傳參
content
.querySelector("img")
.setAttribute("src", this.getAttribute("image"));
// 添加到 shadow dom
shadow.appendChild(content);
}
}
// 注冊自定義元素
window.customElements.define("user-card", UserCard);

這里需要留意這個(gè)點(diǎn):

  • Class 類必須調(diào)用 super()。
  • 獲取到模板之后,需要通過 clone() 方法進(jìn)行拷貝,因?yàn)轫撁嫔系哪0宀⒉皇且淮涡缘模赡芷渌慕M件也要引用。
  • this.getAttribute 可以獲取到組件的傳參。

定義好之后,我們就可以直接使用 user-card? 這個(gè)自定義元素了,并且可以傳遞屬性給組件,并且能夠通過 slot? 標(biāo)簽指定 name 屬性,使用上面 HTML 模板中我們定義好的占位符。

<user-card
image="https://p3-passport.byteacctimg.com/img/user-avatar/a0383600d66ccc81b3396b75cf3a95ea~300x300.image"
>
<p slot="name" class="name">Gopal</p>
<p slot="email" class="email">1172597655@qq.com</p>
</user-card>

最終的組件效果如下:

圖片

Shadow DOM

上面的 Demo 中其實(shí)已經(jīng)使用了,我們可以在任意一個(gè)節(jié)點(diǎn)內(nèi)部創(chuàng)建一個(gè) Shadow DOM?,在獲取元素實(shí)例后,調(diào)用 Element.attachShadow()? 方法,就能將一個(gè)新的 shadow-root 附加到該元素上。

該方法接受一個(gè)對象,且只有一個(gè) mode 屬性,值為 open 或 closed,表示 Shadow DOM 內(nèi)的節(jié)點(diǎn)是否能被外部獲取。

上面我們設(shè)置為 closed。

圖片

假如改成 open,結(jié)果如下:

圖片

面臨的挑戰(zhàn)

雖然 Web Components 提出來已經(jīng)很久了,但是普及的程度遠(yuǎn)遠(yuǎn)沒有 Vue、React 這些框架的組件庫。其主要的問題是,Vue、React 這些框架幫助我們解決了一些視圖渲染的邏輯,比如 React,使用 JSX 和 Css module,我們只需要關(guān)心數(shù)據(jù)狀態(tài),不需要像 Web Components 一樣需要更多的關(guān)注 HTML 模板,也就帶來了更多的靈活和便利。

總結(jié)與思考

精讀《Web Components 的困境》[2]的總結(jié)中提到:

Web Components 作為瀏覽器底層特性不應(yīng)該拿出來和 React,vue 這類應(yīng)用層框架相比較。Web Components 的方向以及提供的價(jià)值都不會跟 應(yīng)用框架一致。而 Web Components 作為未來的 Web 組件標(biāo)準(zhǔn),它在任何生態(tài)中都可以運(yùn)行良好。我倒是更加期待應(yīng)用層去基于 Web Components 去做更多的實(shí)現(xiàn),讓組件超越框架存在,可以在不同技術(shù)棧中使用。

確實(shí) React 和 Web Components 也是可以共存的,React 官方文檔也提到:

為了解決不同的問題而生。Web Components 為可復(fù)用組件提供了強(qiáng)大的封裝,而 React 則提供了聲明式的解決方案,使 DOM 與數(shù)據(jù)保持同步。兩者旨在互補(bǔ)。作為開發(fā)人員,可以自由選擇在 Web Components 中使用 React,或者在 React 中使用 Web Components,或者兩者共存。

至于應(yīng)用層去基于 Web Components 去做更多的實(shí)現(xiàn),我覺得這是一個(gè)很理想的狀態(tài),畢竟要 React、Vue 基于 Web Components 去封裝它們的實(shí)現(xiàn),那就需要 Web Components 做更多靈活的規(guī)范和標(biāo)準(zhǔn),期待這一天的到來吧。

參考

  • 精讀《Web Components 的困境》[3]
  • Web Components MDN[4]
  • Web Components 上手指南[5]

參考資料

[1]Demo 地址: https://codepen.io/gpingfeng/pen/zYRMagp。

[2]精讀《Web Components 的困境》: https://juejin.cn/post/6844903494885851149。

[3]精讀《Web Components 的困境》: https://juejin.cn/post/6844903494885851149。

[4]Web Components MDN: https://developer.mozilla.org/zh-CN/docs/Web/Web_Components。

[5]Web Components 上手指南: https://segmentfault.com/a/1190000039269731。

責(zé)任編輯:姜華 來源: 前端雜貨鋪
相關(guān)推薦

2020-12-17 06:48:21

SQLkafkaMySQL

2024-11-07 16:09:53

2012-07-10 01:22:32

PythonPython教程

2024-10-25 15:56:20

2024-12-13 15:29:57

SpringSpringBeanJava

2019-04-01 14:59:56

負(fù)載均衡服務(wù)器網(wǎng)絡(luò)

2020-09-27 14:41:37

C語言編程語言計(jì)算機(jī)

2023-06-07 08:27:10

Docker容器

2020-12-09 16:41:22

LinuxIT開發(fā)

2024-06-19 09:58:29

2021-09-07 09:40:20

Spark大數(shù)據(jù)引擎

2023-04-12 11:18:51

甘特圖前端

2024-05-13 09:28:43

Flink SQL大數(shù)據(jù)

2015-09-06 09:22:24

框架搭建快速高效app

2023-11-30 10:21:48

虛擬列表虛擬列表工具庫

2023-08-15 15:50:42

2009-10-09 14:45:29

VB程序

2019-09-16 09:14:51

2022-08-26 09:01:07

CSSFlex 布局

2023-07-15 18:26:51

LinuxABI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

免费黄视频在线观看| 日韩精品无码一区二区三区| 欧美人与禽zozzo禽性配| 91综合久久爱com| 色综合中文字幕国产| 午夜精品一区二区在线观看| av官网在线观看| 亚洲一区成人| 美女扒开尿口让男人操亚洲视频网站| 国产婷婷在线观看| 色猫猫成人app| 亚洲午夜久久久久久久久电影网| 欧美一级二级三级| 精品国产999久久久免费| 久久精品九九| 欧美成人精品在线观看| 99久久精品免费视频| jizz性欧美23| 欧美日韩精品一区视频| 成人综合视频在线| av在线免费观看网址| 久久久99久久精品欧美| 成人激情视频免费在线| 天堂网视频在线| 国模吧视频一区| 俺去了亚洲欧美日韩| 亚洲第一成人网站| 草莓视频一区二区三区| 欧美一区日本一区韩国一区| 亚洲成熟丰满熟妇高潮xxxxx| 手机av免费在线| 亚洲欧洲国产日韩| 五月天亚洲综合情| 丰满岳乱妇国产精品一区| 奇米四色…亚洲| 国产不卡精品视男人的天堂| 欧美成人aaaaⅴ片在线看| 女主播福利一区| 色噜噜狠狠狠综合曰曰曰| 亚洲专区区免费| 高清日韩欧美| 日韩精品专区在线影院重磅| 91亚洲精品久久久蜜桃借种| 欧美××××黑人××性爽| 岛国av一区二区| 日韩 欧美 视频| 国产内射老熟女aaaa| 丰满大乳国产精品| 国产精品888| 91在线看www| 一级日韩一级欧美| 蜜臀精品久久久久久蜜臀| 日本精品视频在线播放| 成人毛片在线播放| 香蕉视频成人在线观看| 清纯唯美亚洲综合| 日韩欧美成人一区二区三区| 日韩一级欧洲| 91成品人片a无限观看| 亚洲国产成人精品激情在线| 一本色道久久综合亚洲精品不卡| 性欧美在线看片a免费观看 | 久久老女人爱爱| 老牛影视免费一区二区| 麻豆app在线观看| 久久精品免费在线观看| 神马影院午夜我不卡| 在线观看免费黄视频| 国产精品久久毛片av大全日韩| 一区二区在线观| 久久黄色美女电影| 一区二区国产视频| xxxx18hd亚洲hd捆绑| 中文一区一区三区高中清不卡免费 | 久久日韩精品| 精华区一区二区三区| 中文字幕巨乱亚洲| 久久精品在线免费视频| 2001个疯子在线观看| 日本丰满少妇一区二区三区| 孩娇小videos精品| 亚洲日本视频在线| 日韩大陆欧美高清视频区| 欧美激情亚洲色图| 中文字幕免费精品| 91福利视频网| 一级特黄色大片| www.亚洲色图.com| 婷婷久久五月天| 在线看女人毛片| 日韩欧美在线看| 亚洲综合在线一区二区| 日韩精品丝袜美腿| 久久激情视频免费观看| 99视频在线看| 卡一卡二国产精品 | 污色网站在线观看| 无人区乱码一区二区三区| 日韩乱码在线视频| tube国产麻豆| 天堂va蜜桃一区二区三区漫画版| 91在线直播亚洲| 日本一区视频| 亚洲国产中文字幕| 日韩肉感妇bbwbbwbbw| 97超碰成人| xxxxx91麻豆| 毛片毛片女人毛片毛片| 国产乱人伦精品一区二区在线观看 | 国产三级漂亮女教师| 99r国产精品| 午夜啪啪福利视频| 日韩天堂在线| 亚洲国产日韩欧美综合久久| 亚洲人与黑人屁股眼交| 久久久国产亚洲精品| 粉嫩av免费一区二区三区| 高h视频在线| 黑人巨大精品欧美一区二区三区 | 久久香蕉精品香蕉| 免费av一区二区| 在线观看免费视频a| 91免费观看国产| 国产日韩亚洲欧美在线| 成人影院网站ww555久久精品| 亚洲男人的天堂在线播放| 精品爆乳一区二区三区无码av| 日本午夜一区二区| 蜜桃av噜噜一区二区三| av影院在线免费观看| 日韩精品中文字幕一区二区三区| 国产精品视频在| 视频在线观看91| 欧美精品国产精品久久久| free性欧美| 精品久久久久一区二区国产| 成人免费毛片东京热| 激情综合一区二区三区| 亚洲一区二区三区加勒比| av高清一区| 亚洲天堂av图片| 亚洲精品久久久久久久蜜桃| 久久这里只有精品首页| 欧美精品自拍视频| 精品精品国产毛片在线看| 久久久久久久久久久网站| 亚洲av无码一区二区三区dv| 亚洲免费电影在线| 永久av免费在线观看| 我不卡手机影院| 成人羞羞国产免费| 国产精品va在线观看视色| 在线观看91av| 中文字幕av免费在线观看| 国产成人自拍高清视频在线免费播放| 国产盗摄视频在线观看| 欧美影院视频| 久久久久久久久久久免费精品 | 亚洲午夜av久久乱码| 男操女视频网站| 国产精品青草综合久久久久99| 最新天堂中文在线| 中文字幕一区二区精品区| 成人av免费在线看| 午夜裸体女人视频网站在线观看| 亚洲免费高清视频| 最近中文字幕免费观看| 国产精品久久久99| 一级黄色大片免费看| 中文久久精品| 区一区二区三区中文字幕| 国产一区高清| 欧美精品在线网站| 偷拍25位美女撒尿视频在线观看| 色综合久久88色综合天天| 日韩精品久久久久久久的张开腿让| 九九视频精品免费| av网站手机在线观看| 国产一区二区三区电影在线观看 | 性一交一乱一伧老太| 婷婷开心激情综合| 黄色av免费播放| 高清不卡在线观看av| av无码精品一区二区三区| 欧美激情偷拍自拍| 国产欧美日韩综合精品二区| 最新欧美电影| 精品少妇v888av| 黄色av网址在线免费观看| 欧美久久久久免费| 五月婷婷激情网| 成人欧美一区二区三区1314| 中文文字幕文字幕高清| 捆绑调教一区二区三区| 狠狠干 狠狠操| 天天做天天爱天天综合网| 精品无人乱码一区二区三区的优势 | 一区二区三区四区在线观看国产日韩| 国产女人水真多18毛片18精品 | 91高跟黑色丝袜呻吟在线观看| 99riav视频在线观看| 中文字幕综合在线| 无码精品视频一区二区三区 | 亚洲精品一区二区18漫画| 男女精品网站| 成人免费网站入口| 欧美a级成人淫片免费看| 久久99导航| 深夜福利一区| 国产欧美日韩精品在线观看| 欧美裸体视频| 欧美高清不卡在线| 幼a在线观看| 亚洲欧美日韩在线高清直播| 亚洲精品一区二区三区不卡| 欧美日韩国产影片| 色av性av丰满av| 偷拍一区二区三区| 欧美片一区二区| 亚洲欧美国产三级| 亚洲少妇xxx| 中文字幕第一区第二区| 丰满少妇一区二区| av中文字幕亚洲| 色悠悠在线视频| 国产成人免费视频一区| 亚洲精品永久视频| 久久狠狠亚洲综合| 国产小视频精品| 日韩影院精彩在线| 久久久久久久久久久久久国产精品| 伊人精品成人久久综合软件| 美女av免费观看| 欧美精品色网| 久久男人资源站| 欧美1级日本1级| 国产91视频一区| 亚洲特级毛片| 欧美一级视频在线播放| 亚洲午夜极品| 国产黄色片免费在线观看| 亚洲二区精品| 3d动漫一区二区三区| 国产一级久久| 欧美成人xxxxx| 蜜桃视频网站在线观看| www.亚洲人| 亚洲综合自拍网| 97精品国产露脸对白| 亚洲av无码一区二区三区观看| www.性欧美| 欧美做受喷浆在线观看| 久久免费精品国产久精品久久久久| 中文字幕在线播放视频| 久久婷婷久久一区二区三区| 美女100%无挡| 国产精品日产欧美久久久久| 91香蕉视频污在线观看| 亚洲欧美韩国综合色| 国产一级免费观看| 精品久久久久久亚洲精品| 久久久久久久久影院| 色偷偷88欧美精品久久久| 波多野结衣人妻| 538在线一区二区精品国产| 国产成人麻豆精品午夜在线| 精品国产99国产精品| 女人偷人在线视频| 中文字幕亚洲一区二区三区五十路 | 91精品国产乱码久久久久| 91精品在线麻豆| 国产91免费在线观看| 日韩理论片久久| 瑟瑟视频在线| 欧美极品第一页| 欧美日韩电影免费看| 国产乱人伦真实精品视频| 日韩高清一区| 欧美精品二区三区四区免费看视频 | 国产欧美精品一区| 99久久久免费精品| 亚洲成a人在线观看| 高潮毛片又色又爽免费| 欧美一区二区美女| 四虎影视在线播放| 久久精品国产96久久久香蕉| 国产第一页在线| 国产精品福利久久久| 亚洲成av人片在线观看www| 欧美日韩国产精品一区二区| 亚洲女同中文字幕| 日本在线观看a| 国产成人在线网站| 国内精品卡一卡二卡三| 亚洲一区二区三区影院| 久久久国产免费| 精品国产91亚洲一区二区三区婷婷| 国产69久久| 国内精品久久久久影院优 | 视频一区视频二区中文| 天天干天天曰天天操| 国产午夜精品一区二区三区视频| www.色小姐com| 欧美性大战久久久| 五月天婷婷在线观看| 久久不射热爱视频精品| 欧美黑人一区| 久久狠狠久久综合桃花| 午夜天堂精品久久久久| 男女男精品视频站| 91麻豆福利精品推荐| 久久亚洲精品大全| 337p亚洲精品色噜噜噜| 国产视频福利在线| 97成人精品区在线播放| 天堂va在线高清一区| 综合国产精品久久久| 日韩中文字幕一区二区三区| 欧美 日本 国产| 亚洲高清不卡在线| 精品人妻一区二区三区麻豆91| 亚洲最新av网址| 日韩免费福利视频| 国产偷国产偷亚洲高清97cao| 一本一道久久综合狠狠老| 三上悠亚av一区二区三区| 国产午夜亚洲精品羞羞网站| 国产专区第一页| 亚洲国产第一页| 电影k8一区二区三区久久| 95av在线视频| 午夜亚洲福利| 下面一进一出好爽视频| 亚洲精品视频自拍| 99久久免费国产精精品| 美日韩在线视频| 成人日韩视频| 51xx午夜影福利| 国产精品456露脸| 久久亚洲AV无码| 亚洲国产天堂久久综合| aa国产成人| 久久久久网址| 日韩二区在线观看| 国产三级在线观看完整版| 欧美性感一类影片在线播放| 北条麻妃在线| 91精品久久久久久久久青青| 五月天久久久| 香蕉视频xxxx| 亚洲综合色在线| 日本免费不卡视频| 2019亚洲日韩新视频| 伊人久久大香线蕉综合网蜜芽| 国产成人无码av在线播放dvd| 久久这里只有精品6| www.中文字幕在线观看| 亚洲男人天堂网站| 99久久精品一区二区成人| 亚洲日本欧美在线| 国产美女在线观看一区| 久久久久亚洲av无码专区| 亚洲福利在线看| 日韩精品99| 一区二区三区四区视频在线观看| 久久精品国产亚洲一区二区三区| 免费看特级毛片| 精品99999| 3d性欧美动漫精品xxxx软件| 亚洲成人第一| 国产精品1区二区.| 国产免费av一区| 久久精品99久久久久久久久 | 亚洲国产精品久久久久秋霞蜜臀| 涩涩视频在线播放| 亚洲欧美日韩另类精品一区二区三区 | 国产精品久久久久久久久借妻| 国产精品伦理久久久久久| 日本亚洲一区二区三区| 欧美日韩美女在线| 日本中文字幕伦在线观看| 国产高清自拍一区| 久久一区二区三区超碰国产精品| 美女网站视频色| 亚洲国产一区自拍| 久久福利在线| 中文字幕无码精品亚洲资源网久久| 久久久电影一区二区三区| 国产高清视频免费| 国产91色在线| 激情偷拍久久| 91香蕉视频污在线观看| 亚洲精品videossex少妇| 欧美大陆国产| 欧美亚洲一二三区| 亚洲女人的天堂| 韩国中文字幕2020精品| 国产91一区二区三区| 美女网站在线免费欧美精品| 国产精品成人免费一区二区视频|