谈一下业务场景:
(一)我在教师对象下,新建一个学生(学生有个字段查找教师),当我们点击标准的新建按钮时,“我的教师”字段它是保持空的,我们想要它默认为当前的教师,所以就需要我们将当前的教师Id携带到“新建页面”,这种场景我之前的解决方案是:通过新建“列表按钮”代替标准的新建按钮,列表按钮跳转到一个VF页面,VF页面需要做的就是重定向到“新建页面”并携带参数;
(二)如果我在新建数据之前,还想做一些操作,比如学生字段下有“个人信息”字段,我想从其他系统获取学生的个人信息,在新建学生之前先去搜索学生个人信息,那就需要在第一个场景中的VF页面去画一个搜索框,这样做的话,就是VF页面基本是一个H5,要自己去做UI。想到替代的方案:利用Aura或LWC组件代替VF。
注:这里并不是直接新建Aura或LWC,然后直接拖到布局,注意标题我提到的是“列表按钮”,因为在相关列表下新建数据,能显示的按钮只能是“列表按钮”类型
1. Aura实现
(1)在代码中创建Aura组件
MyStudentCreateCMP.cmp
<aura:component
implements="
flexipage:availableForAllPageTypes,
force:appHostable,
forceCommunity:availableForAllPageTypes,
lightning:isUrlAddressable,
force:lightningQuickAction">
<aura:handler name="init" value="{! this }" action="{! c.initialize }"/>
<aura:attribute name="tid" type="String" />
<aura:attribute name="pageReference" type="Object" />
<aura:attribute name="url" type="String" />
<lightning:navigation aura:id="navService"/>
<lightning:pageReferenceUtils aura:id="pageRefUtils"/>
<section role="dialog" tabindex="-1" aria-modal="true" aria-labelledby="modal-heading-01" class="slds-modal slds-fade-in-open">
<div class="slds-modal__container">
<div class="slds-modal__header">
<h1 id="modal-heading-01" class="slds-modal__title slds-hyphenate">跳转到标准新建弹窗</h1>
</div>
<div class="slds-modal__content slds-p-around_medium" id="modal-content-id-1">
</div>
<div class="slds-modal__footer">
<lightning:button variant="neutral" label="取消" onclick="{! c.handleCancel }"/>
<lightning:button variant="brand" label="保存" onclick="{! c.handleSave }"/>
</div>
</div>
</section>
<div class="slds-backdrop slds-backdrop_open" role="presentation"></div>
</aura:component>
复制代码
MyStudentCreateCMPController.js
({
initialize: function (component) {
// 获取父ID
let tid = component.get("v.pageReference").state.c__sid;
component.set('v.tid', tid);
},
handleSave: function (cmp) {
let tid = cmp.get('v.tid');
let navService = cmp.find("navService");
let pageRef = {
type: "standard__objectPage",
attributes: {
objectApiName: "MyStudent__c",
actionName: "new"
},
state: {}
}
let defaultFieldValues = {
teacherName__c: tid
};
pageRef.state.defaultFieldValues = cmp.find("pageRefUtils").encodeDefaultFieldValues(defaultFieldValues);
navService.navigate(pageRef);
},
handleCancel: function (cmp, event) {
let navEvt = $A.get("e.force:navigateToSObject");
navEvt.setParams({
"recordId": cmp.get('v.tid'),
"slideDevName": "related"
});
navEvt.fire();
}
})
复制代码
最后需要注意的是:有些组件的功能需要48.0以上的版本,所以在MyStudentCreate-meta.xml中最好改高点的版本:<apiVersion>52.0</apiVersion>
(2)部署代码,去Salesforce设置-对象管理器-学生-按钮、链接或操作-新建操作,把代码中新建的Aura创建出来,新建完后,可以看到自己的组件名称:MyStudentCreateCMP
(3)在返回“新建按钮或链接”,创建列表按钮,选择“列表按钮”,url的内容可参考官方文档(Lightning Component Type),它的Url格式是 /cmp/{componentName}?c__myAttr=attrValue,这里插入的参数是教师Id,可根据实际的业务需求改变
(4)将“列表按钮”显示到布局,在上图的左下角有一行是“列表试图按钮布局”,进入然后编辑(注:截图中的“新建学生”等于上图的“新建学生Aura”),将“新建学生Aura”添加到右边,保存
(5)进入任意教师-相关-新建学生Aura,点击跳转到Aura弹窗,弹窗中间空白可以填充自己的布局,和相应的逻辑处理,在这里我已经将教师ID保存,点击“保存”后,会将Id携带到标准的创建页面,并自动赋值
2. LWC实现
(1)在代码中,新建lwc组件(lwcTest是我创建的名字,这个名字乱取的)
lwcTest.html
<template>
<section role="dialog" tabindex="-1" aria-modal="true" aria-labelledby="modal-heading-01" class="slds-modal slds-fade-in-open">
<div class="slds-modal__container">
<div class="slds-modal__header">
<h1 id="modal-heading-01" class="slds-modal__title slds-hyphenate">跳转到标准新建弹窗</h1>
</div>
<div class="slds-modal__content slds-p-around_medium" id="modal-content-id-1">
</div>
<div class="slds-modal__footer">
<lightning-button variant="neutral" label="取消" title="Looks like a link" onclick={handleCancel}></lightning-button>
<lightning-button variant="brand" label="保存" class="slds-m-left_x-small" onclick={handleClick1} ></lightning-button>
</div>
</div>
</section>
<div class="slds-backdrop slds-backdrop_open" role="presentation"></div>
</template>
复制代码
lwcTest.js
import {LightningElement, wire} from 'lwc';
import {CurrentPageReference,NavigationMixin} from 'lightning/navigation';
import { encodeDefaultFieldValues } from 'lightning/pageReferenceUtils';
export default class LwcTest extends NavigationMixin(LightningElement) {
tid = '';
// 初始化获取url参数
@wire(CurrentPageReference)
getStateParameters(currentPageReference) {
if (currentPageReference) {
this.tid = currentPageReference.state.c__sid
}
}
// 保存按钮
handleClick1(event) {
let defaultFieldValues = {
teacherName__c: this.tid
};
this[NavigationMixin.Navigate]({
type: 'standard__objectPage',
attributes: {
objectApiName: 'MyStudent__c',
actionName: 'new'
},
state: {
defaultFieldValues: encodeDefaultFieldValues(defaultFieldValues)
}
});
}
// 取消按钮
handleCancel() {
let tid = this.tid;
this[NavigationMixin.Navigate]({
type: 'standard__recordPage',
attributes: {
recordId: tid,
objectApiName: 'MyTeacher__c',
actionName: 'view'
}
});
}
}
复制代码
同样需要注意API版本,还有在Aura中,我们需求去implements一些组件,在lwc也是同样的,但是它是在xml文件中配置,以下是lwcTest.js-meta.xml
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>52.0</apiVersion>
<isExposed>true</isExposed>
<targets>
<target>lightning__AppPage</target>
<target>lightning__RecordPage</target>
<target>lightning__HomePage</target>
<target>lightning__UtilityBar</target>
<target>lightning__Tab</target>
<target>lightning__RecordAction</target>
<target>lightningCommunity__Page</target>
</targets>
<targetConfigs>
<targetConfig targets="lightning__RecordAction">
<actionType>ScreenAction</actionType>
</targetConfig>
</targetConfigs>
</LightningComponentBundle>
复制代码