Salesforce學習之路(十)Aura組件工作原理


很喜歡曾經看到的一句話:以輸出倒逼輸入。以輸出的形式強制自己學習,確實是高效的學習方式,真的很棒。以下僅為個人學習理解,如有錯誤,歡迎指出,共同學習。


 

1. 什么是Lightning Component框架?

 Lightning Component框架是一個UI框架,用於為移動和台式設備開發Web應用程序。這是一個單頁面Web應用框架,用於為Lightning Platform應用程序構建具有動態,響應式用戶界面的單頁應用程序。它在客戶端使用JavaScript,在服務器端使用Apex。

Lightning Component作為Web應用框架,可以輕松的創建自定義應用程序,而不必自己編寫全部代碼。常用的Web應用程序框架有很多, 例如:Ruby on Rails, Grails, AngularJS, Django, CakePHP等等,甚至前面提到的Visualforc component也是一種web框架。

當然,Lighnting Component也可以看成是CS架構。

客戶端主要由兩個元素組成:View和Controller

  • View:是XML markup,同時混合了自定義的Aura component靜態HTML標簽,例如:<aura:component>標簽。如果有過Visualforce經驗的小伙伴一定對該格式比較熟悉:namespace:tagName。對於Aura的組件,Salesforce提供了非常完善的參考,各種不同的組件都已經給出參考示例,大大減少了開發和學習成本。具體的地址:https://developer.salesforce.com/docs/component-library/overview/components
  • Controller:主要是由JavaScript語言編寫,其目的主要是和服務端進行綁定,獲取所需的數據,並提供給View進行展示。

服務端主要也有兩個元素組成:Controller和Database。

  • Controller: 由Apex語言開發(類似於Java語言),Apex與Java一樣,由一個個類文件組成,不同的是Java為.java文件,而Apex為.cls文件。注意,在客戶端的View文件中綁定的是類名稱
  •  Database: 使用數據操作語言DML(Data Manipulation Language)對數據進行插入,更新,刪除和創建操作。

2. Aura組件捆綁包

Aura組件便是基於Lighnting Component框架進行的二次開發。

2.1 組件的命名規則

創建組件時,其命名的規則必須滿足如下條件:

  • 必須以字母開頭
  • 必須僅包含字母數字或下划線字符
  • 在命名空間中唯一
  • 不能包含空格
  • 不能以下划線結尾
  • 不能包含兩個連續的下划線

2.2 組件創建的文件

當我們在工程中創建一個新的Aura捆綁包(以下捆綁包都稱為組件)時,工程會自動創建出.auradoc,.cmp,.xml,.css,.design,svg,controller.js,help.js,renderer.js幾個文件。

資源 資源名稱 用途
component testAura.cmp 在捆綁包中唯一的必要資源,包含了組件的標記,並且每個捆綁包中只有一個component。
CSS樣式 testAura.css 組件的形狀格式
Design testAura.design 當組件在Lightning App Builder或者Lightning Page中使用時需要用到該文件
Helper testAuraHelper.js Javascript函數,該函數可以被捆綁包中的任何javascript代碼調用
Documentation testAura.auradoc 對組件的一些簡單介紹說明
Renderer testAuraRenderer.js 客戶端渲染器會覆蓋默認的渲染器
Controller testAuraController.js 客戶端的控制函數,用來處理組件中的事件
SVG文件 testAura.svg 組件的自定義圖標資源,一般為Lightning App Builder中使用的圖標

 組件捆綁包中的所有資源都遵循命名規則,並且自動綁定連接。例如:<aura:component controller="TestAuraController">,組件會自動連接TestAuraController.cls類,所以組件內所有資源都可連接該控制類。

2.3 組件的工作原理

組件由自動創建的一系列文件組成,並且每個文件都發揮着不同的功能。其中,組件的主體便是component(.cmp文件),對於最精簡的組件來講,只修改.cmp文件即可(其他文件使用默認值),該文件為組件定義了視圖。

當然,對於實際項目開發中,僅僅含有視圖是遠遠不夠的。通常,我們需要修改controller.js和helper.js文件。controller.js與.cmp文件交互,提供視圖中所需要的數據;helper.js與服務器controller.cls交互,獲取數據庫中的數據;controller.js直接調用helper.js中的函數(當然,可以把helper.js中的函數直接寫在controller.js中,直接從controller.js中獲取數據庫中的數據,但該模式不便與維護,不推薦使用)。

如果組件需要與服務器中數據庫進行交互,則還需創建一個Apex控制類,與控制類與數據庫交互,並將數據傳遞給組件。

不同文件之間的聯系,如下圖所示:

3. 組件的配置項和訪問控制

3.1 配置項

在創建Aura組件時,可在該文件中配置組件的配置選項。配置選項都是可選的,所以可以進行任意組合。

在Aura組件中提供如下配置項:

配置 標記 描述
Lightning Tab implements="force:appHostable" 創建一個組件,該組件可以作用Lightning Experience或者Salesfroce手機App的導航元素
Lightning Page implements="flexipage:avaliableForAllPageTypes" and access="global" 創建一個組件,該組件可以用在Lightning頁面或者Lightning App Builder中
Lighnting Record Page implements="flexipage:availableForRecordHome, force:hasRecordId" and access="global" 創建一個組件,該組件可以用在Lightning Experience的記錄的Home頁面
Lighnting Communities Page

implements="forceCommunity:availableForAllPageTypes" and access="global"

創建一個組件,該組件支持在Community Builder中拖拽功能
Lighnting Quick Action implements="force:lightningQuickAction" 創建一個組件,該組件可以充當一個Lightnging quick action

示例:

<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes">
</aura:component>

3.2 訪問控制

Aura框架可以通過access屬性自由的控制應用,組件,屬性,接口,事件,方法的訪問權限。access屬性指定資源是否可以被所在命名空間之外使用。

使用范圍

可在如下tag中使用access屬性:

  • <aura:application>
  • <aura:component>
  • <aura:attribute>
  • <aura:interface>
  • <aura:event>
  • <aura:method>

access的值

  • private:
    • 可在應用,組件,接口,事件或者方法中使用, 不能被外部資源使用(命名空間)。
    • 該值可以在<aura:attribute>或<aura:method>中使用。
    • 將屬性標記為private會使得將來重構變得更加簡單(畢竟作用域小,所引發的影響也更小)。
    • 除了在聲明該屬性的組件,其他組件調用該屬性時會返回undefined錯誤,所以即使繼承自該組件的子組件也不可訪問。
  •  public:
    • 在當前org中都可以訪問。access的默認值便是public。
  • global:
    • 在所有的org中都可以訪問。

應用訪問控制

access在aura:application標簽中控制app是否可被所在命名控制之外訪問。

修飾符 描述
public 僅在當前org中可用。access的默認值。
global 在所有的org中可用。

組件訪問控制

access在aura:component標簽中控制app是否可被所在命名控制之外訪問。

修飾符 描述
public 僅在當前org中可用。access的默認值。
global 在所有的org中可用。

屬性訪問控制

access在aura:attribute標簽中控制app是否可被所在命名控制之外訪問。 

修飾符 描述
private 可在應用,組件,接口,事件或者方法中使用, 不能被外部資源使用(命名空間)
public 僅在當前org中可用。access的默認值。
global 在所有的org中可用。

接口訪問控制

access在aura:interface標簽中控制app是否可被所在命名控制之外訪問。 

修飾符 描述
public 僅在當前org中可用。access的默認值。
global 在所有的org中可用。

事件訪問控制

access在aura:event標簽中控制app是否可被所在命名控制之外訪問。 

修飾符 描述
public 僅在當前org中可用。access的默認值。
global 在所有的org中可用。

示例:

<aura:component access="global">
    ...
</aura:component>

4. 組件Markup和CSS文件

4.1 組件標記

在捆綁包中,以.cmp為后綴的文件稱為標記(Markup,可以理解為視圖),是捆綁包中唯一的必要資源,所以最精簡的捆綁包只包含一個.cmp文件即可。

標記可以包含文本或其他組件的引用,當然也可以聲明當前組件的元數據。

Hello, World!示例:

<aura:component>
    Hello, world!
</aura:component>

在<aura:component>標簽中包含“Hello, world!”文本,當引用該組件時,會打印出“Hello, world”

在markup中集成了絕大多數HTML的標簽,例如<div>, <span>以及<br>等等。(也支持HTML5標簽)

示例:

<aura:component>
    <div class="container">
        <!--Other HTML tags or components here-->
    </div>
</aura:component>

4.2 css樣式

組件的樣式,我們一般在.css后綴文件中定義。

組件中的所有頂級元素都添加了一個特殊的.THIS CSS類,將命名空間添加到CSS文件中,可以有效防止當前組件的CSS樣式被其他組件的CSS文件覆蓋。如果CSS文件不按照該格式編寫,框架會拋錯誤。

示例:

testAura.cmp

<aura:component>
  <!--使用CSS中.THIS .WHITE類-->  
  <div class="white"> 
    Hello, world!   
  </div>
  
  <!--頂級元素使用.THIS類-->
  <h2>Check out the style in this list.</h2>
  
  <div>
    <!--使用.THIS .RED類-->
    <li class="red">I'm red.</li>
    <!--使用.THIS .BLUE類-->
    <li class="blue">I'm blue.</li>
    <!--使用.THIS .GREEN類-->
    <li class="green">I'm green.</li>
    <!--沒有指定,使用當前模塊樣式-->
    <li>I'm default.</li>
  </div>
</aura:component>

testAura.css

.THIS {
    background-color: grey;
}

.THIS.white {
    background-color: white;
}

.THIS .red {
    background-color: red;
}

.THIS .blue {
    background-color: blue;
}

.THIS .green {
    background-color: green;
}

輸出:

分析:從產生的結果來看,<h2>是頂級元素,直接使用了.css文件中.THIS類得到灰色背景;“I'm default”沒有指定顏色,使用當前模塊<div>的樣式,而<div>是頂級元素,所以使用.THIS類得到灰色背景;其他的指定CSS類,顯示對應樣式。


作者:吳家二少

博客地址:https://www.cnblogs.com/cloudman-open/

本文歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM