本篇參考:
https://trailblazer.salesforce.com/issues_view?id=a1p4V0000003znDQAQ
https://salesforce.stackexchange.com/questions/223766/lightning-new-case-action-override
https://www.lightningdesignsystem.com/utilities/alignment/
本篇主要總結專案中的兩個知識點,分別是關聯列表的new button重寫,如何獲取主表ID 以及一些常用的樣式資訊。
一. 子表在關聯列表新建時獲取父表ID
比如說我們都知道 Case可以關聯到 Account 或者 Contact,所以我們在 Account和Contact的關聯列表可以新建Case,關聯列表新建時,會自動關聯這個欄位。比如我們在 Account的關聯列表新建Case的時候,Account這個欄位會被預設設定初始值。
有的時候標準的UI並不能滿足我們的需求,所以我們需要進行一些自定製,即重寫一下 New的button。目前lex下只允許通過aura重寫,所以即使使用lwc的情況下同樣需要aura套一個殼子來實現,所以如何來在新建的情況下獲取主表ID呢?大神同事發過來一串程式碼搞定,這裡也做一下彙總和覆盤。
newCaseComponent.cmp:這裡有一個要求,除了實現 lightning:actionOverride以外,一定要實現 lightning:isUrlAddressable
<aura:component implements="lightning:actionOverride,lightning:isUrlAddressable"> <aura:handler name="init" value="this" action="{!c.initialHandler}"></aura:handler> <aura:attribute name="parentRecordId" type="String"></aura:attribute> <aura:attribute name="parentObjectType" type="String"></aura:attribute> <c:newCaseLwc parentId="{!v.parentRecordId}" parentObjectType="{!v.parentObjectType}"></c:newCaseLwc> </aura:component>
newCaseComponentController.js:這裡獲取了 pageRef.state的 inContextOfRef, 儘管網路上這個引數使用特別多,但是很遺憾,沒有找到詳細描述的官方文件,只有一個 salesforce article對它有一點簡單的描述,我們可以通過這個獲取到對應的value,這個value以 1. 為開始,後面的內容通過base64解碼以後,便會有這個父記錄的一些主要的資訊,比如 當前的 type, recordId, objectApiName等資訊。通過解析這個引數,我們便可以獲取到父表資料的資訊
({ initialHandler : function(component, event, helper) { var pageRef = component.get("v.pageReference"); var base64Context = pageRef.state.inContextOfRef; if (base64Context && base64Context.startsWith("1\.")) { base64Context = base64Context.substring(2); } if(base64Context) { var parentObjectContext = JSON.parse(window.atob(base64Context)); // console.log(JSON.stringify(parentObjectContext)); // {"type":"standard__recordPage","attributes":{"recordId":"0013g00000AFmcsAAD","actionName":"view","objectApiName":"Account"},"state":{}} if(parentObjectContext && parentObjectContext.attributes) { component.set('v.parentRecordId',parentObjectContext.attributes.recordId); component.set('v.parentObjectType',parentObjectContext.attributes.objectApiName); } } } })
newCaseLwc.html: 只是簡單展示這兩個變數值
<template> parent id: {parentId}<br/> parent object type : {parentObjectType} </template>
newCaseLwc.js
import { LightningElement, track,api, wire } from 'lwc'; export default class newCaseLwc extends LightningElement { @api parentId; @api parentObjectType; }
當我們配置完 Case的New按鈕以後,當在 Account關聯列表點選 Case的new button以後,頭部的URL資訊為:
https://zhangyueqi-5-dev-ed.lightning.force.com/lightning/o/Case/new?inContextOfRef=1.eyJ0eXBlIjoic3RhbmRhcmRfX3JlY29yZFBhZ2UiLCJhdHRyaWJ1dGVzIjp7InJlY29yZElkIjoiMDAxM2cwMDAwMEFGbWNzQUFEIiwiYWN0aW9uTmFtZSI6InZpZXciLCJvYmplY3RBcGlOYW1lIjoiQWNjb3VudCJ9LCJzdGF0ZSI6e319&count=1
我們看一下UI效果,可以成功的獲取到這兩個變數的值。
這裡有兩個需要注意的點:
- aura component一定要實現 url:isAddressable,否則無法獲取到 state;
- 針對inContextOfRef的瞭解以及獲取,獲取以前非空判斷,防止前端報錯。
二. lwc常用的一點小樣式
寫這個起源於專案中做的一些重寫標準button時發生的事情,很多都經常使用,但是寫的時候都是複製貼上一些既有的程式碼,所以整理一下,夯實一下。這裡針對幾個點進行講解,詳細的內容還是要不斷的看 lightning design system。這裡也只是挑幾個常用的點進行整理。我們先以一個例子進行展開,對上述的newCaseLwc進行內容填充一下。
newCaseLwc.js:針對不同詳情頁點選相關列表設定一下不同的初始值。
import { LightningElement, track,api, wire } from 'lwc'; export default class newCaseLwc extends LightningElement { @api parentId; @api parentObjectType; accountId; contactId; connectedCallback() { if(this.parentObjectType === 'Account') { this.accountId = this.parentId; } else if(this.parentObjectType === 'Contact') { this.contactId = this.parentId; } } }
newCaseLwc.html:展示一個case的新建的表單,只展示了幾個欄位。
<template> <lightning-record-edit-form object-api-name="Case" > <div class="slds-modal__container" style="position: relative;height: 500px;width: 100%;padding: unset;"> <div class="slds-modal__header"> <h2 class="slds-text-heading--medium">New Case</h2> </div> <div class="slds-modal__content slds-p-around--medium"> <lightning-layout multiple-rows="true"> <lightning-messages> </lightning-messages> <lightning-layout-item padding="horizontal-small" size="12"> <div class="slds-section__title slds-theme--shade"> <p>Information</p> </div> </lightning-layout-item> <lightning-layout-item padding="horizontal-small" flexibility="auto" size="6"> <lightning-input-field field-name="AccountId" value={accountId}></lightning-input-field> </lightning-layout-item> <lightning-layout-item padding="horizontal-small" flexibility="auto" size="6"> <lightning-input-field field-name="ContactId" value={contactId}></lightning-input-field> </lightning-layout-item> <lightning-layout-item padding="around-small" flexibility="auto" size="6"> <lightning-input-field field-name="Subject"></lightning-input-field> </lightning-layout-item> <lightning-layout-item padding="around-small" flexibility="auto" size="6"> <lightning-input-field field-name="Origin"></lightning-input-field> </lightning-layout-item> <lightning-layout-item padding="horizontal-small" flexibility="auto" size="6"> <lightning-input-field field-name="Reason"></lightning-input-field> </lightning-layout-item> <lightning-layout-item padding="horizontal-small" flexibility="auto" size="6"> <lightning-input-field field-name="Priority"></lightning-input-field> </lightning-layout-item> </lightning-layout> </div> <div class="slds-modal__footer"> <!-- <div class="slds-grid slds-grid_align-center"> --> <div class="slds-clearfix slds-float_right"> <lightning-button class="slds-m-left_x-small" label="Cancel"></lightning-button> <lightning-button type="submit" class="slds-m-left_x-small" label="Save & New"></lightning-button> <lightning-button type="submit" class="slds-m-left_x-small" variant="brand" label="Save"></lightning-button> </div> </div> </div> </lightning-record-edit-form> </template>
先放一個顯示效果。
這裡說一下幾個點。
1. button對齊的設定:我們在專案中常用的button對齊方式有居中對齊或者居右對齊(當然偶爾也有左對齊),那麼如何來設定?
針對居中對齊和左對齊,我們可以使用兩種方式。
- 使用 slds-grid以及slds-grid_align-center組合來實現居中對齊,當然,如果只使用 slds-grid實現的是左對齊;
- 使用 slds-align_absolute-center / slds-float_left / slds-float_right來實現居中/左/右對齊。這兩種也趨向於這種方式。使用 slds-float_left/right如果不起作用,可以搭配slds-clearfix一起使用。
2. 元件中的margin/padding設定:我們看到圖中的button都是有一點距離的,使用的是slds-m-left_x-small來實現。這裡可以參考文件:https://www.lightningdesignsystem.com/utilities/margin/,通過文件,我們可以看到,如果我們將m 改成了 p,即設定的是元件中的padding,除了small以及left之外,我們還可以設定很多種大小和位置,還可以設定 around / horizontal資訊等等。
3. 仿layout中的section:我們知道 record-form預設是不會帶過來section資訊,這也是廣大開發詬病的一點。實際客戶可能並不買賬,所以可能會使用 record-edit-form來開發,那樣我們就可以使用slds-section__title 樣式來模擬section區域。
當然,demo中的內容都是在lightning design system中可以很好的查到的,沒事也可以多刷一刷 lds中的 Utilities內容。
總結:篇中主要整理了一下 related 區域按鈕重寫如何獲取父表ID的方式以及一些常用樣式的整理。篇中有錯誤歡迎指出,有不懂歡迎留言。