日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

2023年了該了解下WebComponent使用教程

瀏覽:195日期:2022-06-01 17:38:12
目錄
  • 正文
  • 三項主要技術(shù)
    • 1、Custom elements (自定義元素)
      • 生命周期函數(shù)
    • 2、HTML templates(HTML 模板)
      • 3、Shadow DOM(影子 DOM)
      • 動態(tài)創(chuàng)建 webComponent 組件例子

        正文

        WebComponent 是官方定義的自定義組件實現(xiàn)方式,它可以讓開發(fā)者不依賴任何第三方框架(如Vue,React)來實現(xiàn)自定義頁面組件;達(dá)到組件復(fù)用效果

        一個簡單例子,讓頁面顯示 hello world:

        <body>  <!-- 使用組件的方式 -->  <my-text />  <script>    class MyText extends HTMLElement {      constructor() {super();this.append("hello world");      }    }    window.customElements.define("my-text", MyText);  </script></body>

        三項主要技術(shù)

        1、Custom elements (自定義元素)

        • 一組 JavaScript API,允許您定義 custom elements 及其行為,然后可以在您的用戶界面中按照需要使用它們

        分為兩種形式:

        自主定制元素:是獨立的元素,它不繼承其他內(nèi)建的 HTML 元素,可以直接把它們寫成 HTML 標(biāo)簽的形式,來在頁面上使用,例如我們剛才自定義的 <my-text>

        自定義內(nèi)置元素:繼承自內(nèi)置的 HTML 元素。指定所需擴(kuò)展的元素

        • 使用時需通過 is 屬性指定 custom element 的名稱,必須包含一個短橫線
        • 注冊的時候必須使用 extends 的屬性
        <!-- 自定義內(nèi)置元素 使用 is--><body>  <!-- 使用組件的方式 -->  <p is="color-p" color="green">云牧</p>  <script>    class ColorP extends HTMLParagraphElement {      constructor() {super();this.style.color = this.getAttribute("color");      }    }    window.customElements.define("color-p", ColorP, { extends: "p" });  </script></body>

        推薦在 connectedCallback 生命周期函數(shù),處理節(jié)點操作

        <!-- 自主定制元素--><body>  <my-text />  <script>    class MyText extends HTMLElement {      constructor() {super();      }      connectedCallback() {this.append("hello world");      }    }    window.customElements.define("my-text", MyText);  </script></body>

        生命周期函數(shù)

        connectedCallback:插入文檔時,可能被多次觸發(fā),比如刪除后又添加到文檔

        disconnectedCallback:從文檔刪除時,可配置做清理工作

        adoptedCallback:被移動新文檔時

        attributeChangedCallback:屬性變化時

        • 配合 observedAttributess 屬性一起使用,指定監(jiān)聽的屬性
        • 使用 setAttribute 方法更新屬性

        不同操作觸發(fā)的生命周期函數(shù):

        例子:

        <body>  <div id="container">    <p is="my-text" text="云牧" id="myText"></p>  </div>  <button id="btnUpdateText">更新屬性</button>  <button id="btnRemove">刪除節(jié)點</button>  <button id="btnRestore">恢復(fù)節(jié)點</button>  <button id="btnAdopt">移動節(jié)點</button>  <iframe src="./ifr.html" id="ifr"></iframe>  <script>    class MyText extends HTMLParagraphElement {      constructor() {super();      }      connectedCallback() {console.log("生命周期:connectedCallback");this.append("你好:" + this.getAttribute("text"));      }      disconnectedCallback() {console.log("生命周期:disconnectedCallback");this.innerHTML = "";      }      // 監(jiān)測的屬性      static get observedAttributes() {return ["text"];      }      attributeChangedCallback(name, oldValue, newValue) {console.log("生命周期:attributeChangedCallback", name, oldValue, newValue);// 最先觸發(fā)是此函數(shù),判斷是不是第一次觸發(fā),第一次的話,只由 connectedCallback 處理if (oldValue != null) {  this.replaceChildren("你好:" + newValue);}      }      adoptedCallback() {console.log("生命周期:adoptedCallback");      }    }    window.customElements.define("my-text", MyText, { extends: "p" });    const myText = document.getElementById("myText");    btnUpdateText.addEventListener("click", function (e) {      myText.setAttribute("text", "黛玉");    });    btnRemove.addEventListener("click", function (e) {      myText.remove();    });    btnRestore.addEventListener("click", function (e) {      container.appendChild(myText);    });    btnAdopt.addEventListener("click", () => {      const textNode = ifr.contentWindow.document.getElementById("myText");      container.appendChild(document.adoptNode(textNode));    });  </script></body>

        2、HTML templates(HTML 模板)

        • 使用 JS 模板字串符的方式創(chuàng)建模板,提示不友好,復(fù)用性差
        <body>  <product-item    name="關(guān)東煮"    img="http://img10.360buyimg.com/seckillcms/s200x200_jfs/t1/121953/18/20515/175357/61e7dc79Ee0acbf20/4f4f56abd2ea2f75.jpg!cc_200x200.webp"    price="49.8"  ></product-item>  <script>    class ProductItem extends HTMLElement {      constructor() {super();      }      connectedCallback() {const content = `  <img src="https://misc.360buyimg.com/lib/skin/e/i/error-jd.gif" />  <div></div>  <div></div>      `;this.innerHTML = content;this.querySelector(".img").src = this.getAttribute("img");this.querySelector(".name").innerText = this.getAttribute("name");this.querySelector(".price").innerText = this.getAttribute("price");      }    }    window.customElements.define("product-item", ProductItem);  </script></body>

        template 方式

        <body>  <!-- template -->  <template id="tpl-product-item">    <img src="https://misc.360buyimg.com/lib/skin/e/i/error-jd.gif" />    <div></div>    <div></div>  </template>  <product-item    name="關(guān)東煮"    img="http://img10.360buyimg.com/seckillcms/s200x200_jfs/t1/121953/18/20515/175357/61e7dc79Ee0acbf20/4f4f56abd2ea2f75.jpg!cc_200x200.webp"    price="49.8"  ></product-item>  <script>    class ProductItem extends HTMLElement {      constructor() {super();      }      connectedCallback() {const content = document.getElementById("tpl-product-item").content.cloneNode(true);// 插入克隆的模板內(nèi)容this.append(content);this.querySelector(".img").src = this.getAttribute("img");this.querySelector(".name").innerText = this.getAttribute("name");this.querySelector(".price").innerText = this.getAttribute("price");      }    }    window.customElements.define("product-item", ProductItem);  </script></body>

        slot

        <body>  <template id="tpl-test">    <style>      .title {color: green;      }    </style>    <div>標(biāo)題</div>    <slot name="slot-des">默認(rèn)內(nèi)容</slot>  </template>  <test-item>    <div slot="slot-des">不是默認(rèn)內(nèi)容</div>  </test-item>  <script>    class TestItem extends HTMLElement {      constructor() {super();      }      connectedCallback() {const content = document.getElementById("tpl-test").content.cloneNode(true);const shadow = this.attachShadow({ mode: "open" });shadow.append(content);      }    }    window.customElements.define("test-item", TestItem);  </script></body>

        3、Shadow DOM(影子 DOM)

        影子DOM,其內(nèi)部樣式不共享

        <body>  <!--  不受外部 .container.container 的顏色影響 -->  <my-item-s></my-item-s>  <div>My item</div>  <style>    .container.container {      color: green;    }  </style>  <template id="tpl">    <style>      .container {color: pink;      }    </style>    <div>My Item</div>  </template>  <script>    class MyItemShadow extends HTMLElement {      constructor() {super();      }      connectedCallback() {const content = document.getElementById("tpl").content.cloneNode(true);const shadow = this.attachShadow({ mode: "open" });shadow.append(content);      }    }    window.customElements.define("my-item-s", MyItemShadow);  </script></body>

        影子DOM,其內(nèi)部元素不可以直接被訪問到

        有一個重要的參數(shù) mode

        • open: shadow root 元素通過 js 從外部訪問根節(jié)點
        • closed:拒絕 js 從外部訪問關(guān)閉的 shadow root 節(jié)點
        <body>  <template id="tpl">    <div></div>    <div></div>  </template>  <note-item title="標(biāo)題" des="內(nèi)容"></note-item>  <script>    class NoteItem extends HTMLElement {      constructor() {super();      }      connectedCallback() {const content = document.getElementById("tpl").content.cloneNode(true);const shadow = this.attachShadow({ mode: "open" });shadow.append(content);// 如果是 open 則可以繼續(xù)訪問操作內(nèi)部 dom// console.log(document.querySelector(".note-item").shadowRoot.querySelector(".title"));shadow.querySelector(".title").textContent = this.getAttribute("title");shadow.querySelector(".des").textContent = this.getAttribute("des");      }    }    window.customElements.define("note-item", NoteItem);  </script></body>

        引入外部樣式:

        <body>  <template id="tpl">    <!-- 方式一: -->    <link rel="stylesheet" href="index.css" rel="external nofollow"  />    <div>My Item</div>  </template>  <my-item></my-item>  <script>    class MyItem extends HTMLElement {      constructor() {super();      }      connectedCallback() {const content = document.getElementById("tpl").content.cloneNode(true);const shadow = this.attachShadow({ mode: "open" });shadow.append(content);// 方式二:const linkEl = document.createElement("link");linkEl.setAttribute("rel", "stylesheet");linkEl.setAttribute("href", "index.css");shadow.appendChild(linkEl);      }    }    window.customElements.define("my-item", MyItem);  </script></body>

        動態(tài)創(chuàng)建 webComponent 組件例子

        • 通過創(chuàng)建 商品 組件,并使得點擊能跳轉(zhuǎn)
        <body>  <div id="product-list"></div>  <template id="product-item">    <style>      .product-item {margin-left: 15px;cursor: pointer;      }      .img {width: 100px;      }      .name {text-align: center;      }      .price {color: #999;text-align: center;      }    </style>    <div>      <img src="https://misc.360buyimg.com/lib/skin/e/i/error-jd.gif" />      <div></div>      <div></div>    </div>  </template>  <script>    class ProductItemElement extends HTMLElement {      constructor(props) {super(props);this.addEventListener("click", () => {  window.open(`https://item.jd.com/${this.id}.html`);});      }      connectedCallback() {const shadow = this.attachShadow({ mode: "open" });const content = document.getElementById("product-item").content.cloneNode(true);content.querySelector(".img").src = this.img;content.querySelector(".name").innerText = this.name;content.querySelector(".price").innerText = this.price;shadow.appendChild(content);      }    }    window.customElements.define("product-item", ProductItemElement);  </script>  <script>    const products = [      {name: "關(guān)東煮",img: "http://img10.360buyimg.com/seckillcms/s200x200_jfs/t1/121953/18/20515/175357/61e7dc79Ee0acbf20/4f4f56abd2ea2f75.jpg!cc_200x200.webp",id: "10026249568453",price: 49.8      },      {name: "土雞蛋",img: "http://img11.360buyimg.com/seckillcms/s200x200_jfs/t1/172777/32/27438/130981/61fbd2e0E236000e0/7f5284367e2f5da6.jpg!cc_200x200.webp",id: "10024773802639",price: 49.8      },      {name: "東北蜜棗粽子",img: "http://img20.360buyimg.com/seckillcms/s200x200_jfs/t1/129546/31/19459/110768/60b1f4b4Efd47366c/3a5b80c5193bc6ce.jpg!cc_200x200.webp",id: "10035808728318",price: 15      }    ];    const productList = document.getElementById("product-list");    const elList = products.map(product => {      // 創(chuàng)建組件      const el = document.createElement("product-item");      el.img = product.img;      el.name = product.name;      el.price = product.price;      el.id = product.id;      return el;    });    productList.append.apply(productList, elList);  </script></body>

        以上就是2023年了該了解下WebComponent使用教程的詳細(xì)內(nèi)容,更多關(guān)于WebComponent使用教程的資料請關(guān)注其它相關(guān)文章!

        標(biāo)簽: JavaScript
        日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
        日韩电影免费在线观看| 久久亚洲二区| 欧美一区激情| 综合激情一区| 丝袜亚洲另类欧美| 丝瓜av网站精品一区二区| 黄色av一区| 中文一区在线| 亚洲自啪免费| 日韩有码av| 国产日韩亚洲| 国产欧美视频在线| 国产日韩欧美在线播放不卡| 91大神在线观看线路一区| 日韩在线麻豆| 欧美一区在线观看视频| 国产精品66| 国产成人精品一区二区免费看京| 欧美激情日韩| 久久久久久色 | 好吊视频一区二区三区四区| 亚洲国产成人精品女人| 水野朝阳av一区二区三区| 中文字幕中文字幕精品| 日本99精品| 国产福利资源一区| 日本在线高清| 午夜日韩av| 只有精品亚洲| 国产精品毛片视频| av最新在线| 亚洲激情婷婷| 国产伦理一区| 三级精品视频| 在线精品亚洲| 国产一区2区在线观看| 毛片在线网站| 在线亚洲国产精品网站| 亚洲精品伦理| 欧美精品导航| 国产99精品一区| 一区二区三区四区日韩| 日本欧美一区二区在线观看| 免费看久久久| 99久久精品国产亚洲精品| 欧美精品黄色| 国产精品伊人| 99精品在线观看| 午夜久久av| 国产成人精品一区二区三区视频| 91国语精品自产拍| 青青草国产成人99久久| 国产精品高颜值在线观看| 免费久久99精品国产自在现线| 欧美有码在线| 国产99精品| 国产欧美啪啪| 五月天久久网站| 人人爱人人干婷婷丁香亚洲| 麻豆mv在线观看| 亚洲精品欧洲| 久久精品动漫| 国产亚洲一卡2卡3卡4卡新区| 在线成人动漫av| 国产精品xvideos88| 91精品二区| 美女久久久久久 | 国产精品99一区二区三| 中文字幕日韩亚洲| 国产一二在线播放| 日韩在线播放一区二区| 国产伊人久久| 在线免费观看亚洲| 日韩精品一卡| 久久精品一区二区三区中文字幕| 鲁大师成人一区二区三区| 精品日韩一区| 日韩精品一级| 亚洲午夜91| 国内不卡的一区二区三区中文字幕| 综合色就爱涩涩涩综合婷婷| 亚洲www免费| 久久久久伊人| 视频一区中文字幕精品| 欧美搞黄网站| 91偷拍一区二区三区精品| 亚洲乱码视频| 国产一区视频在线观看免费| 精品国产一区二| 日韩高清在线不卡| 午夜在线精品偷拍| 亚洲福利国产| 国产a久久精品一区二区三区| 日韩中文av| 亚洲一区久久| 亚洲高清成人| 亚洲三级欧美| 精品少妇一区| 国产乱人伦精品一区| 亚洲人成亚洲精品| 国产高清一区二区| 亚洲综合电影| 国产成人精品一区二区三区免费 | 精品国产aⅴ| 国产精品任我爽爆在线播放| 蜜桃一区二区三区在线观看| 亚洲国产一区二区三区在线播放| 日韩欧美字幕| 国精品产品一区| 精品久久久网| 99久久激情| 在线综合视频| 国产精品白丝一区二区三区| 一区二区电影| 久久电影一区| 蜜桃视频在线观看一区| 夜夜嗨一区二区| 香蕉国产精品| 91久久在线| 99在线观看免费视频精品观看| 欧美手机在线| 99精品一区| 精品中文一区| 影音先锋久久| 99国产精品久久久久久久成人热| 香蕉精品久久| 制服诱惑一区二区| 99视频精品视频高清免费| 久久久天天操| 99精品在线免费在线观看| 激情欧美国产欧美| 欧美日韩国产一区二区三区不卡 | 欧美亚洲三区| 青青国产精品| 国产日韩欧美一区二区三区在线观看 | 日韩综合精品| 日韩av自拍| 日韩在线视频精品| 欧美日韩精品免费观看视欧美高清免费大片 | 久久青草久久| 亚洲福利专区| 午夜亚洲一区| 亚洲精品动态| 国产欧美日韩免费观看| 久久一区欧美| 天堂中文在线播放| 99久久久久国产精品| 亚洲小说欧美另类婷婷| 日韩午夜精品| 午夜亚洲福利| 国产精品网在线观看| 精品美女在线视频| 视频一区中文| 视频一区免费在线观看| 一区二区91| 嫩呦国产一区二区三区av| 91青青国产在线观看精品| 国产尤物精品| 综合干狼人综合首页| 国产欧美日韩免费观看| 国产精选在线| 日韩午夜一区| 日本不卡视频在线观看| 国产精品观看| 偷拍精品精品一区二区三区| 六月婷婷一区| 老鸭窝一区二区久久精品| 亚欧洲精品视频在线观看| 日韩制服丝袜先锋影音| 日韩av网站在线观看| 美女精品一区二区| 99久久激情| 日韩精品亚洲专区| 国产第一亚洲| 鲁大师影院一区二区三区| 日韩av网站免费在线| 毛片在线网站| 中文亚洲免费| 免费在线亚洲欧美| 99国产精品视频免费观看一公开 | 久久久国产精品网站| 亚洲影院天堂中文av色| 三级欧美韩日大片在线看| 日韩精品一区二区三区中文在线 | 丝袜美腿一区| 日韩视频1区| 欧美xxxx中国| 免费不卡在线视频| 久久精品亚洲| 亚洲一区中文| 国内精品伊人| 日韩中文字幕亚洲一区二区va在线 | 水蜜桃久久夜色精品一区的特点| 中文不卡在线| 国产精品伦理久久久久久| 在线看片一区| 群体交乱之放荡娇妻一区二区| 日本亚洲视频在线| 亚洲一级黄色| 精品香蕉视频|