Lightning Container 簡介

在 Lightning 框架中糖驴,如果我們想要使用第三方的組件,可以將它們包含在 Lightning Container 模塊中佛致。

Lightning Container 的工作原理

Lightning Container 會(huì)將內(nèi)部的組件包含在一個(gè) iframe 中贮缕,并且提供了若干函數(shù)讓其內(nèi)部的組件和外部的 Lightning 應(yīng)用進(jìn)行通信。

它要求內(nèi)部的組件是作為“靜態(tài)資源(static resource)”上傳到 Salesforce 中俺榆。

它的語法本質(zhì)上是調(diào)用靜態(tài)資源的 URL 路徑感昼。

舉個(gè)例子,我們已經(jīng)有了一個(gè) Vue 應(yīng)用罐脊,它的入口文件是 index.html定嗓,我們將它上傳到 Salesforce 的靜態(tài)資源,名字叫 “testApp”萍桌,那么調(diào)用它的方式如下:

<lightning:container src="{!$Resource.testApp + '/index.html'}" />

Lightning Container NPM 包和使用實(shí)例

Lightning Container 提供了 NPM 包宵溅,可以讓第三方組件調(diào)用 API,從而和 Lightning 組件進(jìn)行通信梗夸。

我們以兩個(gè) Vue-cli 例子程序來說明:

  • 如何和 Lightning 組件進(jìn)行通信
  • 如何從第三方組件中調(diào)用 Apex 函數(shù)

設(shè)置 Lightning Container

初始化 Vue-cli 項(xiàng)目层玲,然后安裝 NPM 包:

npm install lightning-container --save

在 main.js 文件中加入以下兩行:

import LCC from 'lightning-container'

Vue.prototype.$LCC = LCC

這樣号醉,我們就可以在其他的組件中引用模塊了反症,語法如下:

this.$LCC

編譯 Vue 應(yīng)用

在命令行中運(yùn)行以下命令即可將 Vue 的應(yīng)用編譯到 “dist” 文件夾下:

npm run build

然后我們將 “dist” 文件夾下的內(nèi)容打包成 zip 文件,上傳到 Salesforce 中作為靜態(tài)資源畔派。

Vue-cli 的應(yīng)用默認(rèn)的入口是 index.html 文件铅碍。

和 Lightning 組件的通信演示

在這個(gè)通信的演示程序中,我們要達(dá)到的目標(biāo)是把文字在 Lightning 組件和 Vue 應(yīng)用中相互發(fā)送线椰。

在 Vue 項(xiàng)目中胞谈,在 “src/components” 文件夾中新建 Vue 組件,名為 “Messaging.vue”憨愉,代碼如下:

<template>
  <div>
    <h3>通信演示</h3>
    
    <div>
      發(fā)送給 Lightning Component:
      <input type="text" id="text-input-to-Lc" class="slds-input" v-model="msgToLC" />
      <button id="sendBtn" class="slds-button slds-button--neutral" v-on:click="sendMessage">發(fā)送到 Lightning Component</button>
    </div>
    
    <div>
      從 Lightning Component 接收的信息:
      <input type="text" id="text-input-from-Lc" class="slds-input" v-model="msgFromLC" />
    </div>
  </div>
</template>

<script>
export default {
    data () {
        return {
        msgToLC: '',
        msgFromLC: ''
        }
    },
    mounted: function() {
        this.$LCC.addMessageHandler(this.receiveMessage); // 使用 addMessageHandler() 函數(shù)定義如何接收從 Lightning 組件中傳來的數(shù)據(jù)
    },
    methods: {
        receiveMessage: function(message) {
            this.msgFromLC = message.value;
        },

        sendMessage: function() {
            // 使用 sendMessage() 函數(shù)發(fā)送信息給 Lightning 組件
            this.$LCC.sendMessage({name: "Message To LC", value: this.msgToLC})
        }
    }
}
</script>

在 Vue 項(xiàng)目的 “src/router” 文件夾下烦绳,修改 “index.js” 文件,將剛才建立的 Vue 組件定義為默認(rèn)的路徑:

import Messaging from '@/components/Messaging'

export default new Router({
    routes: [
    {
        path: '/',
        name: 'Messaging',
        component: Messaging
    },
    ]
})

編譯 Vue 應(yīng)用配紫,然后上傳到 Salesforce 中径密,作為靜態(tài)資源,名為 “VueApplication”躺孝。

在 Salesforce 中新建 Lightning 組件:

<aura:component access="global">
    <aura:attribute access="private" name="messageToSend" type="String" default=""/>
    <aura:attribute access="private" name="messageReceived" type="String" default=""/>
    
    <div>
        <lightning:input name="messageToSend" value="{!v.messageToSend}" label="發(fā)送給 Vue 應(yīng)用: "/>
        <lightning:button label="Send" onclick="{!c.sendMessage}"/>
        <br/>

        <lightning:input value="{!v.messageReceived}" label="接收自 Vue 應(yīng)用: "/>
        <br/>
    
        <!-- 使用 lightning:container 來調(diào)用靜態(tài)資源中的 Vue 應(yīng)用享扔,并定義在收到它的信息時(shí)使用的函數(shù) -->
        <lightning:container aura:id="vueApp"
                             src="{!$Resource.vueApplication + '/index.html'}"
                             onmessage="{!c.handleMessage}"/>
    </div>
</aura:component>

定義控制器:

({
    /*
     * 從 Lightning 組件中發(fā)送信息
     */
    sendMessage : function(component, event, helper) {
        var msg = {
            name: "Message From LC",
            value: component.get("v.messageToSend")
        };
      
        component.find("vueApp").message(msg);
    },
    
    /*
     * 接收從 Vue 應(yīng)用中發(fā)送的信息
     */ 
    handleMessage: function(component, event, helper) {
        var value = event.getParams().payload.value;
   
        component.set("v.messageReceived", value);        
    },
})

當(dāng)我們使用這個(gè) Lightning 組件時(shí)底桂,它會(huì)自動(dòng)調(diào)用 Vue 應(yīng)用,然后可以將文字在兩個(gè)應(yīng)用之間發(fā)送和接收惧眠。

當(dāng)我們查看頁面的源代碼時(shí)籽懦,可以看到,lightning:container 中的內(nèi)容被放在了一個(gè) iframe 中氛魁,所以我們的 Vue 應(yīng)用其實(shí)是封裝起來的暮顺。

調(diào)用 Apex 函數(shù)

在接下來的應(yīng)用中,我們要從 Vue 應(yīng)用中調(diào)用 Apex 函數(shù)秀存。

在 Salesforce 中建立 Apex 函數(shù):

global without sharing class VueController {
    @RemoteAction
    global static Account[] getAccounts(String searchString) {
        return [SELECT Id, Name, Phone, Type, NumberOfEmployees FROM Account Limit 10];
    }
}

為了調(diào)用 Apex 函數(shù)拖云,我們?cè)?Vue 應(yīng)用中需要一個(gè)特殊的設(shè)置。在 “dist” 文件夾下建立一個(gè)名為 “manifest.json” 的文件应又,內(nèi)容如下:

{
    "landing-pages" : [
        {
            "path": "index.html",
            "apex-controller": "VueController"
        }
    ]
}

在 Vue 應(yīng)用中建立一個(gè)名為 “AccountList” 的組件:

<template>
  <div>
    <h3>接收到的數(shù)據(jù):</h3>
    
    <ul>
      <li v-for="item in accounts">
        {{ item.Name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
    data () {
        return {
            accounts: [],
        }
    },
    mounted: function() {
        this.getAccounts();
    },
    methods: {
        getAccounts: function() {
            // 使用 callApex() 函數(shù)來調(diào)用相應(yīng)的函數(shù)
            this.$LCC.callApex("VueController.getAccounts", 
            {
            searchString: ''
            }, 
            this.handleResult, 
            {});
        },

        handleResult: function(result) {
            this.accounts = result;
        },
    }
}
</script>

這樣宙项,在用 lightning:container 在 Lightning 組件中執(zhí)行 Vue 應(yīng)用時(shí),Vue 應(yīng)用會(huì)直接調(diào)用 Apex 函數(shù)株扛,然后給出結(jié)果尤筐。

與 Locker Service 的比較

Lightning Container 機(jī)制和 Locker Service 機(jī)制都是對(duì) Lightning 組件的安全進(jìn)行提高,將不同來源(命名空間等)的組件分別封裝洞就。

Lightning Container 是基于 iframe 的盆繁,它將第三方的組件或應(yīng)用封裝在 iframe 中,而 Locker Service 則不需要這樣旬蟋,它是將不同的組件放在同一個(gè) DOM 樹中油昂,將不同的 DOM 元素封裝起來。這是兩者最大的不同倾贰,從而也決定了它們不同的特性:

  • Locker Service 可以利用 Lightning 框架的各種本地功能冕碟,而 Lightning Container 中的內(nèi)容則受到限制,比如只能通過其 NPM 包中提供的 API 函數(shù)來進(jìn)行通信
  • Lightning Container 支持的第三方框架比 Locker Service 更多
  • Locker Service 中的組件執(zhí)行速度比 Lightning Container 中的要快
  • Locker Service 中的組件和整個(gè) Lightning 框架的外觀是一致的匆浙,而 Lightning Container 中的內(nèi)容由于被封裝在 iframe 中安寺,在特殊的情況下可能會(huì)出現(xiàn)問題
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市首尼,隨后出現(xiàn)的幾起案子挑庶,更是在濱河造成了極大的恐慌,老刑警劉巖软能,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迎捺,死亡現(xiàn)場離奇詭異,居然都是意外死亡查排,警方通過查閱死者的電腦和手機(jī)凳枝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雹嗦,“玉大人范舀,你說我怎么就攤上這事合是。” “怎么了锭环?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵聪全,是天一觀的道長。 經(jīng)常有香客問我辅辩,道長难礼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任玫锋,我火速辦了婚禮蛾茉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撩鹿。我一直安慰自己谦炬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布节沦。 她就那樣靜靜地躺著键思,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甫贯。 梳的紋絲不亂的頭發(fā)上吼鳞,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音叫搁,去河邊找鬼赔桌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛渴逻,可吹牛的內(nèi)容都是我干的疾党。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼裸卫,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼仿贬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起墓贿,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜓氨,沒想到半個(gè)月后聋袋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡穴吹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年幽勒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片港令。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啥容,死狀恐怖锈颗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咪惠,我是刑警寧澤击吱,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站遥昧,受9級(jí)特大地震影響覆醇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炭臭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一永脓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鞋仍,春花似錦常摧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至那婉,卻和暖如春板甘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背详炬。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來泰國打工盐类, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呛谜。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓在跳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親隐岛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猫妙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容