成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

開發(fā)你的第一個(gè) Web 組件

開發(fā) 前端
不要做重復(fù)的工作;基于瀏覽器開發(fā) Web App 時(shí),需要制作一些可重用的模塊。

Web 組件是一系列開源技術(shù)(例如 JavaScript 和 HTML)的集合,你可以用它們創(chuàng)建一些 Web App 中可重用的自定義元素。你創(chuàng)建的組件是獨(dú)立于其他代碼的,所以這些組件可以方便地在多個(gè)項(xiàng)目中重用。

首先,它是一個(gè)平臺標(biāo)準(zhǔn),所有主流的瀏覽器都支持它。

Web 組件中包含什么?

  • 定制元素:JavaScript API 支持定義 HTML 元素的新類別。
  • 影子 DOM:JavaScript API 提供了一種將一個(gè)隱藏的、獨(dú)立的??文檔對象模型??(DOM)附加到一個(gè)元素的方法。它通過保留從頁面的其他代碼分離出來的樣式、標(biāo)記結(jié)構(gòu)和行為特征對 Web 組件進(jìn)行了封裝。它會(huì)確保 Web 組件內(nèi)樣式不會(huì)被外部樣式覆蓋,反之亦然,Web 組件內(nèi)樣式也不會(huì)“泄露”到頁面的其他部分。
  • HTML 模板:該元素支持定義可重用的 DOM 元素。可重用 DOM 元素和它的內(nèi)容不會(huì)呈現(xiàn)在 DOM 內(nèi),但仍然可以通過 JavaScript 被引用。

開發(fā)你的第一個(gè) Web 組件

你可以借助你最喜歡的文本編輯器和 JavaScript 寫一個(gè)簡單的 Web 組件。本指南使用 Bootstrap 生成簡單的樣式,并創(chuàng)建一個(gè)簡易的卡片式的 Web 組件,給定了位置信息,該組件就能顯示該位置的溫度。該組件使用了 ??Open Weather API??,你需要先注冊,然后創(chuàng)建 APPID/APIKey,才能正常使用。

調(diào)用該組件,需要給出位置的經(jīng)度和緯度:

<weather-card longitude='85.8245' latitude='20.296' />

創(chuàng)建一個(gè)名為 ??weather-card.js?? 的文件,這個(gè)文件包含 Web 組件的所有代碼。首先,需要定義你的組件,創(chuàng)建一個(gè)模板元素,并在其中加入一些簡單的 HTML 標(biāo)簽:

const template = document.createElement('template');template.innerHTML = `  <div class="card">    <div class="card-body"></div>  </div>`

定義 Web 組件的類及其構(gòu)造函數(shù):

class WeatherCard extends HTMLElement {  constructor() {    super();    this._shadowRoot = this.attachShadow({ 'mode': 'open' });    this._shadowRoot.appendChild(template.content.cloneNode(true));  }  ......}

構(gòu)造函數(shù)中,附加了 ??shadowRoot?? 屬性,并將它設(shè)置為開啟模式。然后這個(gè)模板就包含了 shadowRoot 屬性。

接著,編寫獲取屬性的函數(shù)。對于經(jīng)度和緯度,你需要向 Open Weather API 發(fā)送 GET 請求。這些功能需要在 ??connectedCallback?? 函數(shù)中完成。你可以使用 ??getAttribute?? 方法訪問相應(yīng)的屬性,或定義讀取屬性的方法,把它們綁定到本對象中。

get longitude() {  return this.getAttribute('longitude');}get latitude() {  return this.getAttribute('latitude');}

現(xiàn)在定義 ??connectedCallBack?? 方法,它的功能是在需要時(shí)獲取天氣數(shù)據(jù):

connectedCallback() {  var xmlHttp = new XMLHttpRequest();  const url = `http://api.openweathermap.org/data/2.5/weather?lat=${this.latitude}&lon=${this.longitude}&appid=API_KEY`  xmlHttp.open("GET", url, false);  xmlHttp.send(null);  this.$card = this._shadowRoot.querySelector('.card-body');  let responseObj = JSON.parse(xmlHttp.responseText);  let $townName = document.createElement('p');  $townName.innerHTML = `Town: ${responseObj.name}`;  this._shadowRoot.appendChild($townName);  let $temperature = document.createElement('p');  $temperature.innerHTML = `${parseInt(responseObj.main.temp - 273)} °C`  this._shadowRoot.appendChild($temperature);}

一旦獲取到天氣數(shù)據(jù),附加的 HTML 元素就添加進(jìn)了模板。至此,完成了類的定義。

最后,使用 ??window.customElements.define?? 方法定義并注冊一個(gè)新的自定義元素:

window.customElements.define('weather-card', WeatherCard);

其中,第一個(gè)參數(shù)是自定義元素的名稱,第二個(gè)參數(shù)是所定義的類。這里是 ??整個(gè)組件代碼的鏈接??。

你的第一個(gè) Web 組件的代碼已完成!現(xiàn)在應(yīng)該把它放入 DOM。為了把它放入 DOM,你需要在 HTML 文件(??index.html??)中載入指向 Web 組件的 JavaScript 腳本。

<!DOCTYPE html><html><head>  <meta charset="UTF-8"></head><body>  <weather-card longitude='85.8245' latitude='20.296'/>  <script src='./weather-card.js'></script></body></html>

這就是顯示在瀏覽器中的 Web 組件:

Web component displayed in a browser

由于 Web 組件中只包含 HTML、CSS 和 JavaScript,它們本來就是瀏覽器所支持的,并且可以無瑕疵地跟前端框架(例如 React 和 Vue)一同使用。下面這段簡單的代碼展現(xiàn)的是它跟一個(gè)由 ??Create React App?? 引導(dǎo)的一個(gè)簡單的 React App 的整合方法。如果你需要,可以引入前面定義的 ??weather-card.js??,把它作為一個(gè)組件使用:

import './App.css';import './weather-card';function App() {  return (  <weather-card longitude='85.8245' latitude='20.296'></weather-card>  );}export default App;

Web 組件的生命周期

一切組件都遵循從初始化到移除的生命周期法則。每個(gè)生命周期事件都有相應(yīng)的方法,你可以借助這些方法令組件更好地工作。Web 組件的生命周期事件包括:

  • ??Constructor??:Web 組件的構(gòu)造函數(shù)在它被掛載前調(diào)用,意味著在元素附加到文檔對象前被創(chuàng)建。它用于初始化本地狀態(tài)、綁定事件處理器以及創(chuàng)建影子 DOM。在構(gòu)造函數(shù)中,必須調(diào)用??super()??,執(zhí)行父類的構(gòu)造函數(shù)。
  • ??ConnectedCallBack??:當(dāng)一個(gè)元素被掛載(即,插入 DOM 樹)時(shí)調(diào)用。該函數(shù)處理創(chuàng)建 DOM 節(jié)點(diǎn)的初始化過程中的相關(guān)事宜,大多數(shù)情況下用于類似于網(wǎng)絡(luò)請求的操作。React 開發(fā)者可以將它與??componentDidMount?? 相關(guān)聯(lián)。
  • ?attributeChangedCallback??:這個(gè)方法接收三個(gè)參數(shù):??name??,??oldValue?? 和??newValue??。組件的任一屬性發(fā)生變化,就會(huì)執(zhí)行這個(gè)方法。屬性由靜態(tài)??observedAttributes?? 方法聲明:
static get observedAttributes() {  return ['name', '_id'];}
  • 一旦屬性名或??_id?? 改變,就會(huì)調(diào)用??attributeChangedCallback?? 方法。
  • ??DisconnectedCallBack??:當(dāng)一個(gè)元素從 DOM 樹移除,會(huì)執(zhí)行這個(gè)方法。它相當(dāng)于 React 中的??componentWillUnmount??。它可以用于釋放不能由垃圾回收機(jī)制自動(dòng)清除的資源,比如 DOM 事件的取消訂閱、停用計(jì)時(shí)器或取消所有已注冊的回調(diào)方法。
  • ??AdoptedCallback??:每次自定義元素移動(dòng)到一個(gè)新文檔時(shí)調(diào)用。只有在處理 IFrame 時(shí)會(huì)發(fā)生這種情況。

模塊化開源

Web 組件對于開發(fā) Web App 很有用。無論你是熟練使用 JavaScript 的老手,還是初學(xué)者,無論你的目標(biāo)客戶使用哪種瀏覽器,借助這種開源標(biāo)準(zhǔn)創(chuàng)建可重用的代碼都是一件可以輕松完成的事。

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2018-01-31 15:45:07

前端Vue.js組件

2020-07-07 07:55:53

web app數(shù)據(jù)科學(xué)機(jī)器學(xué)習(xí)

2013-01-14 09:44:58

JavaScriptJSJS框架

2018-10-15 10:10:41

Linux內(nèi)核補(bǔ)丁

2013-12-19 09:46:04

垃圾收集器

2009-06-26 16:07:43

MyEclipse開發(fā)Hibernate程序

2023-03-02 08:37:15

2011-04-02 10:08:21

webOS開發(fā)應(yīng)用程序

2014-07-24 14:35:26

Linux內(nèi)核模塊

2019-12-31 08:00:00

DebianLinuxApple Swift

2016-08-24 15:12:41

LXDLinux容器

2016-08-05 12:58:44

GitLinux開源

2023-06-01 08:24:08

OpenAIChatGPTPython

2020-06-30 16:50:15

RPA應(yīng)用

2021-03-24 08:00:44

項(xiàng)目Vue 3Typescript

2022-11-15 08:49:15

2015-08-05 09:31:42

開發(fā)六件事

2013-10-30 22:10:28

Clouda程序

2014-12-24 11:34:23

CoreOSWordPress集群部署

2025-04-27 03:33:00

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 99亚洲视频 | 九九久久国产精品 | 亚洲视频在线播放 | 伊人网综合 | 国产一区999| 成人三级视频在线观看 | 色接久久 | 亚洲国产aⅴ精品 | 久草.com| 国产传媒视频在线观看 | a级片网站 | 国产欧美精品一区二区色综合 | 欧美激情视频一区二区三区在线播放 | 久久国产日韩欧美 | 欧美人妇做爰xxxⅹ性高电影 | 久久久久久久久久久久久久国产 | 日韩一区二区在线视频 | 99精品久久 | 亚洲第一av | 国产 日韩 欧美 制服 另类 | 激情五月婷婷综合 | 天天弄天天操 | 国产免费高清 | 国产亚洲精品美女久久久久久久久久 | 欧美视频在线看 | 一区二区三区精品视频 | 日韩在线视频观看 | 奇米在线| 亚洲国产一区二区三区在线观看 | 操夜夜| 三级免费网| 亚洲一区二区视频 | 久久久精品网 | 国产视频中文字幕 | 毛片软件 | 久久69精品久久久久久国产越南 | 精品国产乱码久久久久久88av | 成人毛片在线观看 | 一级a爱片性色毛片免费 | 成人精品鲁一区一区二区 | 久久久.com|