真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

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

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

  {{title}}
export class AppComponent {  title = 'angular'; }

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

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

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

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

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

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

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

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中可以這樣使用:

 
 

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

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)化,而且它實(shí)現(xiàn)細(xì)節(jié)也和本文有區(qū)別。不同于現(xiàn)今較為流行的virtual DOM實(shí)現(xiàn)方式,Angular這種實(shí)現(xiàn)思路不需要單獨(dú)創(chuàng)建中間DOM對(duì)象,減少了內(nèi)存分配。對(duì)此感興趣的讀者可以自行去看Angular的實(shí)現(xiàn)。

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


文章標(biāo)題:Angular怎樣由模板生成DOM樹-創(chuàng)新互聯(lián)
本文鏈接:http://weahome.cn/article/pjhdp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部