欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Angular怎樣由模板生成DOM樹-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)Angular怎樣由模板生成DOM樹,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

為廣靈等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及廣靈網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站建設(shè)、做網(wǎng)站、廣靈網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

Angular等現(xiàn)代Web框架極大的提高了開發(fā)效率,比如我們經(jīng)常會在開發(fā)過程中寫出類似下面的代碼:

<div>
  {{title}}
</div>

export class AppComponent {
 title = 'angular';
}

這種模板寫法并不是HTML原生支持的,那么Angular又是如何轉(zhuǎn)換這些代碼,并顯示成我們期望的界面呢? 首先我們來看看Angular把上述代碼編譯成什么樣子:

 ...省略了其他代碼
 i0.??elementStart(0, "div");
 i0.??text(1, " hello angular\n");
 i0.??elementEnd()
 ...省略了其他代碼

可以看到,Angular把我們寫的模板編譯成指令的方式,然后通過這些指令生成對應(yīng)的HTML.這個過程包含兩個步驟:

  1. 把模板編譯成上面的產(chǎn)物

  2. 執(zhí)行產(chǎn)物代碼生成HTML

本文主要圍繞步驟二進(jìn)行展開,步驟一的話可能會在后續(xù)另寫一篇進(jìn)行闡述。

觀察上面的產(chǎn)物代碼,我們不難發(fā)現(xiàn)有三個主要方法:elementStart、text、elementEnd.從它們的命名不難推測,這三個方法的作用分別是開始生成標(biāo)簽、內(nèi)容賦值、閉合標(biāo)簽。下面我們來嘗試自己實現(xiàn)這幾個方法,最簡單的基礎(chǔ)版本大概會是這樣:

let currentNode: Node | null = null;
let currentParent: Node | null = null;

function patch(host: Node | DocumentFragment, render: () => void): void {
  currentNode = host;
  render();
}

function elementOpen(tagName: string): void {
  currentParent = currentNode;
  const element = document.createElement(tagName);
  currentParent!.appendChild(element);
  currentNode = element;
}

function text(textContent: string): void {
  currentNode!.textContent = textContent;
}

function elementEnd(tagName: string): void {
  currentNode = currentParent;
  currentParent = currentNode!.parentNode;
}

然后在HTML中可以這樣使用:

 <div id="container"></div>
 <script>
 function render() {
  elementOpen('div');
  text('div content');
   elementOpen('p');
   text('p content');
   elementEnd('p');
  elementEnd('div');
 }
 patch(document.getElementById('container'), render);
 </script>

上述代碼中,text方法參數(shù)都被寫固定了,實際生成的代碼可能類似于text(Comp.title)這種形式。那么既然是以變量的形式賦值,當(dāng)用戶進(jìn)行操作的時候,更新這個變量的值,豈不是又要完全重新執(zhí)行一遍patch函數(shù)么?我們知道DOM操作是耗時的,當(dāng)我們的項目較大時,如果不采取優(yōu)化措施,勢必會影響框架性能。為此我們很容易想到的一個優(yōu)化思路,在再次執(zhí)行patch函數(shù)時,如果DOM節(jié)點已經(jīng)存在我們就重復(fù)利用,不再去重新創(chuàng)建并插入DOM樹?;谶@個思路,我們來更新一下代碼:

let currentNode: Node | null = null;
let currentParent: Node | null = null;


function patch(host: Node | DocumentFragment, render: () => void): void {
  currentNode = host;
  render();
}

function elementOpen(tagName: string): void {
  currentParent = currentNode;

  const firstChild = (currentParent as Element).firstElementChild;
  if (firstChild && firstChild.tagName.toLowerCase() === tagName) {
    currentParent = firstChild;
    return;
  }

  const element = document.createElement(tagName);
  currentParent!.appendChild(element);
  currentNode = element;
}

function text(textContent: string): void {
  if (currentNode!.textContent !== textContent) {
    currentNode!.textContent = textContent;
  }
}

function elementEnd(tagName: string): void {
  currentNode = currentParent;
  currentParent = currentNode!.parentNode;
}

本文所述代碼,只是表述Angular由模板生成dom樹的大致思路。具體的Angular做了許多優(yōu)化,而且它實現(xiàn)細(xì)節(jié)也和本文有區(qū)別。不同于現(xiàn)今較為流行的virtual DOM實現(xiàn)方式,Angular這種實現(xiàn)思路不需要單獨創(chuàng)建中間DOM對象,減少了內(nèi)存分配。對此感興趣的讀者可以自行去看Angular的實現(xiàn)。

關(guān)于“Angular怎樣由模板生成DOM樹”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

網(wǎng)頁標(biāo)題:Angular怎樣由模板生成DOM樹-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://www.aaarwkj.com/article18/pjhdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航做網(wǎng)站、定制網(wǎng)站、網(wǎng)站排名ChatGPT、移動網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
未满18周岁禁止观看视频| 中文字幕日本人妻少妇| 久久久久久久精品久久| 久久精品免费激情视频| 丰满少妇被激烈的插进去| 亚洲一区二区婷婷久久| 欧美精品福利一区二区| 人妻中文字幕视频在线| 少妇人妻精品一区三区二区 | 亚洲va久久久噜噜噜久久狠| 亚洲成人精品久久久| 国产精品成人亚洲一区二区| 人妻激情偷乱视91九色| 日韩精品在线观看天堂| 亚洲精品美女久久久久高潮| 久久99热最新地址获取| 亚洲国产高清第一第二区| 日韩精品在线观看你懂的| 欧美日韩在线视频一区| 国产日韩欧美国产精品| 午夜视频在线观看日韩| 亚洲日本在线观看一区| 国产三级在线dvd观看| 亚洲一区二区日韩在线| 国产一区二区精品久久岳| 成人黄色av在线看| 五十路六十路美熟人妻| 国产精品大全中文字幕| 日本写真视频一区二区三区| 日产中文乱码字幕无线观看| 日韩精品一区二区三区欲色av| 欧美日本一道本一区二区三区| 成人免费视频国产免费| 亚洲av丰满熟妇在线观看| 成人激情电影免费在线| 一区二区亚洲欧美精品| 日本高清加勒比免费在线| 免费av男人天堂亚洲天堂| 日韩欧美中文字幕区| 精品国产一区二区日韩91| 91亚洲婷婷国产综合精品|