Angular中的ViewEncapsulation是什麼?

2021-01-11 智能甄選

在本文中,我們來看看ViewEncapsulation和Angular中的Shadow DOM。雖然聽起來有些粗略,但不用擔心。這實際上非常有幫助!

要理解Angular中的ViewEncapsulation,首先,我們應該了解 Shadow DOM。您可以在這裡詳細了解 Shadow DOM。簡而言之,Shadow DOM將 HTML 封裝成HTML元素。使用Shadow DOM,標記,樣式和行為被限制到元素,並且不會與DOM的其他節點發生衝突。Shadow DOM是Web Components的一部分,它封裝了元素的樣式和登錄。

Angular部件由三件事組成:

組件類模板樣式

這三個因素的結合使得Angular組件可以在應用程式中重用。理論上講,當你創建一個組件時,通過某種方式創建一個Web組件(理論上,Angular組件不是Web組件)以利用Shadow DOM。您還可以在瀏覽器中使用Angular,它不支持Shadow DOM,因為Angular有它自己的模擬,它可以模擬Shadow DOM。

為了模擬Shadow DOM並封裝樣式,Angular提供了View Encapsulation的類型。他們如下:

讓我們試著用一個例子來理解它。我已經創建了一個組件,如下所示:

app.component.ts

import { Component, ViewEncapsulation } from '@angular/core';@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css'],encapsulation: ViewEncapsulation.None})export class AppComponent {title = 'parent component';}

app.component.html app.component.css

h1 {background: red;color: white;text-transform: uppercase;text-align: center;}

我們正在設置 h1 組件CSS的樣式。我們還創建了另一個組件:

import { Component } from '@angular/core';@Component({selector: 'app-child',template: `<h1>{{title}}</h1>`})export class AppChildComponent {title = 'child app';}

在 AppChildComponent,我們也使用 h1 標籤。要了解不同的 ViewEncapsulation 選項,我們將更改元數據 AppComponent。

讓我們從ViewEncapsulation.None開始,在這個選項中:

沒有陰影DOM。樣式不在組件範圍內。

在運行應用程式時,h1 即使我們僅設置了樣式,也會發現 樣式已適用於這兩個組件 AppComponent。 發生這種情況是因為 AppComponent 我們已經將封裝屬性設置為 ViewEncapsulation.None。

@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css'],encapsulation: ViewEncapsulation.None})export class AppComponent {title = 'parent component';}

在瀏覽器中,當您檢查原始碼時,您會發現該 h1 樣式已在DOM的頭部聲明。

因此,在 ViewEncapsulation.None中,風格被移動到DOM的頭部,而不是作用域的組件。組件沒有Shadow DOM,組件樣式可以影響DOM中的所有節點。

接下來,讓我們探索ViewEncapsulation.Native,在這個選項中:

Angular將為組件創建Shadow DOM。樣式的範圍是組件。

在運行應用程式時,您會發現該 h1樣式已應用於這兩個組件,儘管我們只在其中設置了樣式 AppComponent。發生這種情況是因為 AppComponent 我們已經將封裝屬性設置為 ViewEncapsulation.Native,並且我們正在使用 AppChildComponnet 模板內的子項 AppComponent。

import { Component, ViewEncapsulation } from '@angular/core';@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css'],encapsulation: ViewEncapsulation.Native})export class AppComponent {title = 'parent component';}

在瀏覽器中,當您檢查原始碼時,您將為該DOM創建一個Shadow DOM, AppComponent 並且該風格的範圍就是這個範圍。

因此, ViewEncapsulation.Native Angular創建了一個Shadow DOM,並將該風格的作用域限定為該Shadow DOM。

接下來,讓我們探索ViewEncapsulation.Emulated,在這個選項中:

Angular不會為該組件創建Shadow DOM。樣式將被限定於組件。這是封裝的默認值。

import { Component, ViewEncapsulation } from '@angular/core';@Component({selector: 'app-root',templateUrl: './app.component.html',styleUrls: ['./app.component.css'],encapsulation: ViewEncapsulation.Emulated})export class AppComponent {title = 'parent component';}

當你運行應用程式,你會發現, h1 從風格 AppComponent 不應用到 h1 的 AppChildComponent。這是由於仿效範圍。在此,該樣式僅限於組件。在這個選項中,Angular只模擬Shadow DOM,並不創建真正的陰影DOM。因此,在瀏覽器中運行的應用程式也不支持Shadow DOM,並且樣式也被限定在組件中。

讓我們看看Angular如何實現這一點。在瀏覽器中,當您檢查原始碼時,您會找到答案。

Angular在DOM的頭部創建了樣式,並給出了組件的任意標識。在ID的基礎上,選擇器樣式被限定到組件。

這些是Angular提供的三種ViewEncapsulation選項。我希望你覺得這篇文章有用。謝謝閱讀。如果你喜歡這篇文章,請分享。

相關焦點

  • 使用Spring Boot,Angular 6和Maven構建Web應用程式
    在這篇文章中,我們將使用Spring Boot和Angular 6創建一個簡單的Web應用程式,並將它們打包在一個war文件中。創建Maven項目首先,創建一個包含兩個模塊的Maven項目:一個用於後端,另一個用於前端。
  • material2 發布 7.1.0,Angular 的 Material Design 風格框架
    性能改進詳細更新說明和下載地址 https://github.com/angular/material2/releases/tag/7.1.0Material Design for Angular 是 Angular 官方團隊開發的基於最新版本 Angular 的 Material  Design 風格的框架,可和 Nest.js 搭配使用做全棧開發。
  • material2 發布 7.0.1,Angular 的 Material Design 風格框架
    filtering (#13487) (1d87b4c)text-field: autosize textarea not resizing on minRows decrease (#13437) (8bae5b4)性能改進源碼下載 https://github.com/angular
  • React、Angular和Vue三種最流行的前端框架哪一個最好?
    在當今的發展世界中,技術發展非常迅速並且變化迅速,許多開發工具似乎可以解決不同的開發問題。在本次討論中,我們將比較三種最受歡迎的前端開發技術 - Angular,React和Vue。我們正在根據項目架構或者從開發人員的角度來討論這種比較,他們將為新項目選擇技術。因此,我們首先需要明確決定是要開發單頁面應用程式(SPA)還是標準的多頁面應用程式。庫或框架?
  • 臺灣中研院:ALMA 首見旋轉式噴流 揭密原恆星成長機制
    論文信息【標題】A Rotating Protostellar Jet Launched from the Innermost Disk of HH 212【作者】李景輝(臺灣中研院天文所;臺灣臺灣大學),賀曾樸(臺灣中研院天文所;東亞天文臺)、李志雲(美國維吉尼亞大學
  • H5開發app用什麼框架
    AngularJSBootstrap 3 Mobile組件,比如switches, overlays和sidebars,這些都是bootstrap中沒有的。AngularJS modules, 比如 angular-route, angular-touch 和 angular-animate響應式媒體查詢是將bootstrap作為單獨的文件,你只需要包含你所需要的東西。Mobile Angular UIu並不包含任何jQuery依賴,你需要做的只是通過一些AngularJS指令創建友好的用戶體驗。
  • 什麼是MVVM,MVC和MVVM的區別,MVVM框架VUE實現原理
    並且MVVM中的View 和 ViewModel可以互相通信。在過去的10年中,我們已經把很多傳統的服務端代碼放到了瀏覽器中,這樣就產生了成千上萬行的javascript代碼,它們連接了各式各樣的HTML 和CSS文件,但缺乏正規的組織形式,這也就是為什麼越來越多的開發者使用javascript框架。比如:angular、react、vue。
  • 中國科大在強散射環境OAM光通信研究中取得進展
    然而,在無線光通信中,當攜帶OAM的光束在空間中傳輸時,易受大氣湍流、霧霾或空氣中塵埃的影響,微粒的多重散射嚴重降低光束質量,導致接收端的光束成為隨機散斑,這增加了通信的誤碼率。因此,在強散射條件下解決光信息的精確傳輸和恢復,對於光通信的研究和應用具有重要意義。  近日,中國科學技術大學物理學院李銀妹、黃坤課題組在強散射環境下OAM光通信的研究中取得新進展。
  • Angular、React 當前,Vue.js 優劣幾何?
    作者 |Tim Han譯者 | 蘇本如責編 | 仲培藝以下為譯文:對於大多數人來說,現在要構建一個新的前端應用,對框架/庫的選擇在很大程度上都是在 Angular 和 React 中二選一。很多時候,人們不會給 Vue.js 足夠的關注。
  • 哈爾濱前端移動框架Angular
    測試在Angular.js中,可以單獨對控制器和指令進行單元測試。Angular.js允許開發人員進行端到端和單元測試運行器設置,這意味著也可以從用戶角度進行測試。4. 跨瀏覽器兼容Angular的一個有趣功能是,框架中編寫的應用程式在多個瀏覽器都能運行良好。Angular.js可以自動處理每個瀏覽器所需的代碼。5.
  • 軌道角動量電磁波在無線通信系統中的應用
    電磁波的軌道角動量(orbital angular momentum :OAM)特性卻使得電磁波的等相位面沿著傳播方向呈螺旋上升的形態,故軌道角動量電磁波又稱「渦旋電磁波」,如下圖所示[1]。渦旋電磁波的場表達式中具有的相位因子,每一個軌道角動量態可被一個量子拓撲電荷(topological  charge)來定義, 可取任意的整數值,拓撲電荷亦被稱作軌道角動量的階數。具有不同拓撲電荷的電磁渦旋波間相互正交,因此在無線傳輸過程中,可以在同一載波上將信息加載到具有不同軌道角動量的電磁波上,而相互之間不影響,這種復用技術不僅可有效提高頻譜利用率,而且具有更高的安全性[2]。
  • React、Angular、Vue.js:三者完整的比較指南
    React和Angular在流行的前端框架類別中具有幾乎相同級別的用戶。Vue沒有在上述任何一個名單中佔據一席之地,但有能力參加這場戰鬥。現在,再看看GitHub上所有這三個框架評級的統計數據。這個GitHub為Angular,React和Vue創作的明星歷史展示了Vue.js在開發人員中的流行程度。
  • 大佬5分鐘帶你搞懂Javascript中的this
    this 關鍵字是 JavaScript 中最複雜的機制之一。它是一個很特別的關鍵字,被自動定義在所有函數的作用域中。this 的綁定一直是一件非常令人困惑的事,即使經驗豐富的開發者有時也較難說清它的指向。當一個函數被調用時,會創建一個活動記錄(有時候也稱為執行上下文)。這個記錄會包含函數在哪裡被調用(調用棧)、函數的調用方法、傳入的參數等信息。