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

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://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è)
久草福利在线观看免费| 在线一区二区三区高清视频| 人妻一区二区免费视频| 亚洲高清中文字幕一区二三区| 中文字幕日韩一区二区| 中文字幕在线看精品乱码| 少妇高潮试看二十分钟| 国产无人区码一区二区| 国产精品一区二区欧美激情| 亚洲成人精品免费观看| 亚洲精品aa片在线观看国产| 99久久夜国产精品| 亚洲综合另类小说专区| 少妇人妻精品一区三区二区 | 国产美女口爆吞精久久| 成熟人妻一区二区三区人妻| 日韩在线欧美在线一区二区| 日韩国产欧美亚洲一区不卡| 日本午夜福利视频在线观看| 国产男女爱猛视频在线| 精品裸足人妻少妇二区三区 | 中文字幕欧美日韩人妻| 国产一区二区三区在线看片| 日韩一区二区三精品| 深夜视频在线观看成人| 激情内射日本一区二区三区| 国产b片免费在线观看| 永久免费观看黄色录像| 亚洲一区二区日韩在线| 亚洲精品中文字幕久久| 欧美特黄大片在线观看| 欧美亚洲午夜一二综合| 岛国av有码高清在线观看| 91香蕉国产在线观看| 日韩亚洲一区在线观看| 人妻中文字幕日韩av| 亚洲激情久热中文字幕| 久久99久久精品视频国产| 亚洲国产欧美在线91| 国产精品免费视频一区二区三区| 成人激情视频在线网页|