为何Salesforce自定义LWC组件的动态Picklist查询在App Builder保存时执行两次?
LWC动态Picklist查询重复执行问题解决
问题背景
开发了一款可在记录详情页使用的自定义LWC组件,组件包含一个基于Apex实现的动态Picklist设计属性。将组件拖拽到App Builder页面并保存后,日志显示该动态Picklist的查询被执行了两次。
问题原因
Salesforce App Builder在加载组件配置时,会分别调用动态Picklist类的getDefaultValue()和getValues()方法,用于获取默认选项和完整选项列表。原代码将查询逻辑放在了类的构造函数中,而App Builder会为这两个方法的调用分别创建类的实例,导致查询被执行两次。
解决方案
通过静态变量缓存查询结果,确保查询仅执行一次。修改Apex类,使用静态初始化块执行查询,让结果在类首次加载时就被缓存,后续所有方法调用复用该缓存数据。
修正后的Apex代码
public with sharing class AccountNamePicklist extends VisualEditor.DynamicPickList { private static List<Account> accountList; // 静态初始化块,仅在类首次加载时执行一次查询 static { System.debug('enter Method'); accountList = [SELECT Id, Name FROM Account WITH USER_MODE ORDER BY CreatedDate DESC LIMIT 2000]; } public override VisualEditor.DataRow getDefaultValue() { VisualEditor.DataRow defaultValue = new VisualEditor.DataRow('', ''); if (!accountList.isEmpty()) { defaultValue = new VisualEditor.DataRow(accountList[0].Name, accountList[0].Name); } return defaultValue; } public override VisualEditor.DynamicPickListRows getValues() { VisualEditor.DynamicPickListRows accountNameList = new VisualEditor.DynamicPickListRows(); for (Account acc : accountList) { VisualEditor.DataRow value = new VisualEditor.DataRow(acc.Name, acc.Name); accountNameList.addRow(value); } return accountNameList; } }
关键优化点
- 用静态初始化块替代构造函数执行查询:静态块仅在类首次被加载时执行一次,避免多次实例化类导致重复查询。
- 静态变量缓存结果:
accountList作为静态变量,在类加载后一直存在,getDefaultValue()和getValues()直接复用该数据,无需重复查询。
原组件代码参考
LWC JavaScript代码
import { LightningElement, api } from 'lwc'; export default class ListView extends LightningElement { @api AccountName; }
LWC HTML代码
<template> test </template>
LWC元数据配置文件
<?xml version="1.0" encoding="UTF-8"?> <LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>61.0</apiVersion> <isExposed>true</isExposed> <targets> <target>lightning__AppPage</target> <target>lightning__RecordPage</target> <target>lightning__HomePage</target> </targets> <masterLabel>List View</masterLabel> <targetConfigs> <targetConfig targets="lightning__HomePage,lightning__RecordPage,lightning__AppPage,lightning__UtilityBar"> <property name="AccountName" default="" required="true" type="String" datasource="apex://AccountNamePicklist" description="Name of the List view configuration. This value is required." label="Configuration Name"/> </targetConfig> </targetConfigs> </LightningComponentBundle>
内容的提问来源于stack exchange,提问作者Gowtham S
相关产品推荐
相关产品推荐

