国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一文讀懂Web Component

這篇具有很好參考價(jià)值的文章主要介紹了一文讀懂Web Component。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

您好,如果喜歡我的文章,可以關(guān)注我的公眾號(hào)「量子前端」,將不定期關(guān)注推送前端好文~

前言

由于最近作者在學(xué)習(xí)微前端,web component也是其中一大特性,部分微前端框架使用到,也是深入學(xué)習(xí)了一下相關(guān)的知識(shí),分享出來。

Web Component是什么?

Web Component 實(shí)際上一系列技術(shù)的組合,主要包含 3 部分:

  • 自定義元素。 在 HTML 基礎(chǔ)標(biāo)簽外擴(kuò)展自定義標(biāo)簽元素,也就是我們平時(shí)使用框架的"組件";
  • Shadow DOM。 主要用于將 Shadow DOM 的內(nèi)容與外層 document DOM 隔離,可以理解為在document中的一個(gè)子容器,放置各種組件;
  • HTML 模板。 使用 <template> 來定義組件模板,使用 <slot> 作為插槽使用(Vuer一定不陌生);

在一份html文件中的一個(gè)web component看起來是這樣的:

<trace-ele name="webComponent" version="0.0.1" desc="原生態(tài)自帶隔離的組件">
  <div slot="slot-ele">插槽內(nèi)容</div>
</trace-ele>

看起來很像Vue吧?接下來讓我們一個(gè)個(gè)demo學(xué)習(xí)web component。

上手

由于Web Component親和原生,因此無需其他包的依賴,一個(gè)index.html和一個(gè)index.js即可體驗(yàn)學(xué)習(xí)。

我們直接寫一個(gè)html模板,文章的案例組件統(tǒng)稱為<trace-ele />

index.html:

<body>
 <template id="trace">
      <div class="container">
        <img
          class="image"
          src="https://pic1.zhimg.com/50/v2-a6d65e05ec8db74369f3a7c0073a227a_200x0.webp"
          alt=""
        />
        <p class="title">學(xué)習(xí)Web Component</p>
        <p class="desc">Web Component是微前端沙盒隔離原理的重要知識(shí)</p>
        <p class="price">¥25.00</p>
      </div>
    </template>
    <trace-ele />
    <script src="./index.js" />
</body>

這里我們寫了一個(gè)"模板"——template,并在下面聲明了<trace-ele />組件。

而實(shí)現(xiàn)這一切的原理在index.js中。

class Trace extends HTMLElement {
  constructor() {
    super();
    const templateEle = document.getElementById("trace");
    const cloneEle = templateEle.content.cloneNode(true);
    this.appendChild(cloneEle);
  }
}

customElements.define("trace-ele", Trace);

Web Component組件本質(zhì)是一個(gè)類繼承于HTMLElement,當(dāng)customElements.define聲明完組件后,類中的this指向于組件本身,打印結(jié)果如下:

一文讀懂Web Component

在初始化時(shí),需要提供給組件一個(gè)空殼,并且綁定template元素的id,這樣就出現(xiàn)組件效果了。

一文讀懂Web Component

看到這里是不是感覺和Vue很像呢?接下來我們繼續(xù)升級(jí)組件的功能~

來點(diǎn)樣式吧

在上一節(jié)基礎(chǔ)上,給組件上點(diǎn)樣式,很簡(jiǎn)單,改變index.html即可,在template中加入style

<body>
 <template id="trace">
      <div class="container">
        <img
          class="image"
          src="https://pic1.zhimg.com/50/v2-a6d65e05ec8db74369f3a7c0073a227a_200x0.webp"
          alt=""
        />
        <p class="title">學(xué)習(xí)Web Component</p>
        <p class="desc">Web Component是微前端沙盒隔離原理的重要知識(shí)</p>
        <p class="price">¥25.00</p>
      </div>
      
      <style>
        .container {
          display: inline-flex;
          flex-direction: column;
          border-radius: 6px;
          border: 1px solid silver;
          padding: 16px;
          margin-right: 16px;
        }
        .image {
          border-radius: 6px;
        }
        .title {
          font-weight: 500;
          font-size: 16px;
          line-height: 22px;
          color: #222;
          margin-top: 14px;
          margin-bottom: 9px;
        }
        .desc {
          margin-bottom: 12px;
          line-height: 1;
          font-size: 14px;
        }
        .price {
          font-size: 14px;
        }
      </style>
    </template>
    <trace-ele />
    <script src="./index.js" />
</body>

樣式生效:

一文讀懂Web Component

但是這里如果給一個(gè)通用標(biāo)簽的樣式,就像這樣:

<body>
    <p>組件外的P標(biāo)簽</p>
        <template>
        <p>組件中的P標(biāo)簽</p>
        <style>
           p {
             color: red;
           }
            ...
            .container {}
        </style>
        </template>
</body>

效果如下:

一文讀懂Web Component

可以看到組件外的p標(biāo)簽也被影響了,顏色變?yōu)榧t色,而在組件概念中這個(gè)樣式其實(shí)只期望作用于組件本身。這也是樣式隔離的概念,而很幸運(yùn),Web Component提供了開箱即用的樣式隔離方案。

為了不讓 <template> 里的 <style> CSS 和全局的 CSS 有沖突,我們可以將組件掛在到 Shadow Root 上,再用 Shadow Root 掛到外層的 document DOM 上,這樣就可以實(shí)現(xiàn) CSS 的隔離啦:

class Trace extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: "open" });
    
    const templateEle = document.getElementById("trace");
    const cloneEle = templateEle.content.cloneNode(true);

    this.shadowRoot.appendChild(cloneEle);
  }
}

customElements.define("trace-ele", Trace);

從控制臺(tái)中觀察:

一文讀懂Web Component

而如果有多個(gè)組件本質(zhì)其實(shí)就是在document中有多個(gè)Shadow Root

整個(gè)DOM架構(gòu)圖是這樣的:

一文讀懂Web Component

Shadow DOM 的一大優(yōu)點(diǎn)是能將 DOM 結(jié)構(gòu)、樣式、行為與 Document DOM 隔離開,非常適合做組件的封裝,因此它能成為 Web Component 的重要組成部分之一。

Props

VueReact一樣,Web Component也提供了父?jìng)髯拥男问健?/p>

index.html:

<trace-ele name="webComponent" version="0.0.1" desc="原生態(tài)自帶隔離的組件">

這里傳了3個(gè)props給組件,在組件中打印this如下:

火眼金睛的我已經(jīng)找到了在組件中接受傳參的入口:

一文讀懂Web Component

做一個(gè)簡(jiǎn)單的動(dòng)態(tài)賦值:

class Trace extends HTMLElement {
  constructor() {
    super();

    this.attachShadow({ mode: "open" });

    const templateEle = document.getElementById("trace");
    const cloneEle = templateEle.content.cloneNode(true);
    cloneEle.querySelector('.container > .title').textContent = this.getAttribute('name');
    cloneEle.querySelector('.container > .price').textContent = this.getAttribute('version');
    cloneEle.querySelector('.container > .desc').textContent = this.getAttribute('desc');

    this.shadowRoot.appendChild(cloneEle);
  }
}

customElements.define("trace-ele", Trace);

搞定~

Slot

HTML 模板的另一個(gè)好處是可以像 Vue 一樣使用 <slot>。比如,現(xiàn)在我們可以在這個(gè) <trace-ele> 最下面添加一個(gè)插槽:

<body>
    <template id="trace">
        <div class="container">
            <p>組件中的P標(biāo)簽</p>
            <img
              class="image"
              src="https://pic1.zhimg.com/50/v2-a6d65e05ec8db74369f3a7c0073a227a_200x0.webp"
              alt=""
            />
            <p class="title">學(xué)習(xí)Web Component</p>
            <p class="desc">Web Component是微前端沙盒隔離原理的重要知識(shí)</p>
            <p class="price">¥25.00</p>
            <slot name="slot-ele"></slot>
        </div>
        <style>
        ...
        </style>
    </template>
    <trace-ele name="webComponent" version="0.0.1" desc="原生態(tài)自帶隔離的組件">
        <div slot="slot-ele">插槽內(nèi)容</div>
    </trace-ele>
</body>

這樣我們就可以實(shí)現(xiàn)自定義插槽內(nèi)容了。

事件綁定

Web Component也可以給組件中元素或者插槽綁定事件。

class Trace extends HTMLElement {
  constructor() {
    super();

    this.attachShadow({ mode: "open" });

    const templateEle = document.getElementById("trace");
    const cloneEle = templateEle.content.cloneNode(true);
    cloneEle
      .querySelector(".container > .title")
      .addEventListener("click", this.onClick);

    this.shadowRoot.appendChild(cloneEle);
  }

  onClick = () => {
    alert("Click Me!");
  };
}

customElements.define("trace-ele", Trace);

一文讀懂Web Component

總結(jié)

上面主要給大家分享了一下 Web Component 的一些使用方法??偟膩碚f,Web Component 是一系列 API 的組合:

  • Custom Element:注冊(cè)和使用組件
  • Shadow DOM:隔離 CSS
  • HTML template 和 slot:靈活的 DOM 結(jié)構(gòu)

它看起來仿佛是現(xiàn)在主流框架的基建實(shí)現(xiàn),框架也正是基于原生的能力實(shí)現(xiàn)出一整套的解決方案,就比如Vue的響應(yīng)式以來追蹤、模板語法數(shù)據(jù)綁定,都是我們希望看到的。文章來源地址http://www.zghlxwxcb.cn/news/detail-439156.html

到了這里,關(guān)于一文讀懂Web Component的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 一文讀懂Docker原理

    一文讀懂Docker原理

    說起Docker,基本上就是指容器。許多同學(xué)熟悉Docker的操作,卻搞不懂到底什么是容器。本文就來講講Docker容器到底是個(gè)啥。 容器被稱為輕量級(jí)的虛擬化技術(shù),實(shí)際上是不準(zhǔn)確的。確切地說,容器是一種對(duì)進(jìn)程進(jìn)行隔離的運(yùn)行環(huán)境。 由于生產(chǎn)環(huán)境的容器幾乎都是運(yùn)行在Linux上的

    2024年01月17日
    瀏覽(27)
  • 一文讀懂?dāng)?shù)據(jù)加密

    一文讀懂?dāng)?shù)據(jù)加密

    在計(jì)算機(jī)信息安全領(lǐng)域,之前軟件設(shè)計(jì)師的網(wǎng)絡(luò)安全部分了解了一點(diǎn)密碼學(xué)的知識(shí),這里隨想記錄一下。 數(shù)據(jù)加密 的基本過程就是對(duì)原來為 明文 的文件或數(shù)據(jù)按 某種算法 進(jìn)行處理,使其成為不可讀的一段代碼為“ 密文 ”,使其只能在輸入相應(yīng)的 密鑰 之后才能顯示出原容

    2024年02月03日
    瀏覽(25)
  • 一文讀懂HTML

    一文讀懂HTML

    HTML(HyperText Markup Language)的歷史可以追溯到20世紀(jì)90年代早期,它是互聯(lián)網(wǎng)發(fā)展的重要里程碑之一。以下是HTML的歷史概述: 早期階段(1980年代末 - 1990年代初):在互聯(lián)網(wǎng)的早期階段,人們開始意識(shí)到需要一種標(biāo)記語言來創(chuàng)建和共享文檔。這導(dǎo)致了Tim Berners-Lee在1989年至1991年

    2024年02月13日
    瀏覽(27)
  • 一文讀懂Zookeeper

    1、介紹zookeeper 1.1、zookeeper概述 ? ZooKeeper從字面意思理解,【Zoo - 動(dòng)物園,Keeper - 管理員】動(dòng)物園中有很多種動(dòng)物,這里的動(dòng)物就可以比作分布式環(huán)境下多種多樣的服務(wù),而ZooKeeper做的就是管理這些服務(wù)。 ? Apache ZooKeeper的系統(tǒng)為分布式協(xié)調(diào)是構(gòu)建分布式應(yīng)用的高性能服務(wù)。

    2024年02月10日
    瀏覽(19)
  • 一文讀懂Websocket

    提示:通過本章節(jié)的學(xué)習(xí),你想深入了解什么是websocket。 提示:這里可以添加本文要記錄的大概內(nèi)容: 例如:websocket是html5新增的全雙工通訊協(xié)議,基于Tcp協(xié)議,屬于應(yīng)用層協(xié)議。 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 WebSocket 是一種在單個(gè) TCP 連接上進(jìn)行全雙

    2024年02月16日
    瀏覽(24)
  • 一文讀懂c++語言

    一文讀懂c++語言

    C++是一種通用的、高級(jí)的編程語言,它是C語言的擴(kuò)展。C++由Bjarne Stroustrup于1983年首次引入,并在之后的幾十年中不斷發(fā)展壯大。C++被廣泛應(yīng)用于各種領(lǐng)域,包括系統(tǒng)開發(fā)、游戲開發(fā)、嵌入式系統(tǒng)、圖形用戶界面(GUI)開發(fā)等。 C++的設(shè)計(jì)目標(biāo)是提供一種高效、靈活和可擴(kuò)展的

    2024年02月13日
    瀏覽(20)
  • 一文讀懂“大語言模型”

    一文讀懂“大語言模型”

    本文基于谷歌云的官方視頻:《Introduction to Large Language Models》 ,使用 ChatGPT4 整理而成,希望對(duì)大家入門大語言模型有幫助。 本課程主要包括以下 4 方面的內(nèi)容: 大語言模型的定義 描述大語言模型的用例 解釋提示詞調(diào)優(yōu) 谷歌的 Gen AI 開發(fā)工具介紹 大語言模型是深度學(xué)習(xí)的

    2024年02月09日
    瀏覽(35)
  • 一文讀懂Embedding

    一文讀懂Embedding

    “Embedding”直譯是 嵌入式、嵌入層 。 簡(jiǎn)單來說,我們常見的 地圖 就是對(duì)于 現(xiàn)實(shí)地理的Embedding ,現(xiàn)實(shí)的地理地形的信息其實(shí)遠(yuǎn)遠(yuǎn)超過三維,但是地圖通過顏色和等高線等來最大化表現(xiàn)現(xiàn)實(shí)的地理 信息 。 通過它,我們?cè)诂F(xiàn)實(shí)世界里的文字、圖片、語言、視頻就能轉(zhuǎn)化為計(jì)算

    2024年02月11日
    瀏覽(31)
  • 一文讀懂ThreadLocal

    目錄 ThreadLocal 有什么用? 如何使用 ThreadLocal? ThreadLocal 原理了解嗎? ThreadLocal 有什么用? 通常情況下,我們創(chuàng)建的變量是可以被任何一個(gè)線程訪問并修改的。 如果想實(shí)現(xiàn)每一個(gè)線程都有自己的專屬本地變量該如何解決呢? JDK 中自帶的 ThreadLocal 類正是為了解決這樣的問題

    2024年02月13日
    瀏覽(19)
  • 一文讀懂Redis哨兵

    一文讀懂Redis哨兵

    吹哨人巡查監(jiān)控后臺(tái)master主機(jī)是否故障,如果故障了根據(jù) 投票數(shù) 自動(dòng)將某一個(gè)從庫轉(zhuǎn)換為新主庫,繼續(xù)對(duì)外服務(wù)。 俗稱,無人值守運(yùn)維。 主從監(jiān)控:監(jiān)控主從redis庫運(yùn)行是否正常 消息通知:哨兵可以將故障轉(zhuǎn)移的結(jié)果發(fā)送給客戶端 故障轉(zhuǎn)移:將其中一個(gè)Slave作為新的Maste

    2024年02月04日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包