Flow 本地操作 — LWC Flow Actions 完全指南

全面掌握 LWC Flow 本地操作。...

📅 2026/7/19 ✍️ ponybai 🏷️ lwc, salesforce

使用 LWC 创建 Flow 本地操作

Flow 本地操作

用 LWC 构建 Flow 本地操作(Local Action)——在客户端执行逻辑,无需往返服务器。例如从第三方系统获取数据、在新浏览器标签页打开 URL。配置后组件在 Flow Builder 中作为 Core Action 元素可用。限制:必须遵守 Locker 限制、仅支持 Lightning Runtime、仅限 Screen Flow(需要浏览器上下文)。

Flow 本地操作 —— 配置与 invoke()

配置与 invoke

添加 lightning__FlowAction target。关键是实现 @api invoke() 方法——Flow 执行到此操作时调用。HTML 模板应为空白(本地操作没有 UI)。

<!-- .js-meta.xml -->
<targets><target>lightning__FlowAction</target></targets>
<targetConfigs>
  <targetConfig targets="lightning__FlowAction">
    <property name="toastTitle" type="String" label="Toast title"/>
    <property name="toastMessage" type="String" label="Toast message"/>
  </targetConfig>
</targetConfigs>

// JS——同步操作
@api toastTitle; @api toastMessage;
@api invoke() {
  this.dispatchEvent(new ShowToastEvent({ title: this.toastTitle, message: this.toastMessage }));
}

// JS——异步操作(返回 Promise)
@api invoke(cancelToken) {
  return new Promise((resolve, reject) => {
    cancelToken.promise.then(error => reject(new Error("Request timed out.")));
    // 异步工作...完成后 resolve() 或 reject("Custom error")
    resolve();
  });
}

同步:方法结束→Flow 执行下一个元素。异步(推荐用于 XHR 等):返回 Promise→resolve→下一个元素;reject→走 fault connector→$Flow.FaultMessage 设为 reject 的 Error 消息。默认超时 120 秒。调用外部服务器需allowlist + CORS 配置。cancelToken 用于超时时中止请求并自定义错误消息。

管理员在 Flow 中通过 Set Input Values 设置属性(从 Flow 传数据给组件),通过 Store Output Values 存储属性值到 Flow 变量。

验证自定义 Flow 屏幕组件

验证屏幕组件

在组件 JS 中创建 @api validate() 方法——返回 { isValid: true/false, errorMessage: '...' }不能用箭头函数——validate = () => {} 在 Flow Screen target 下不被识别。

@api validate() {
  if (/* 有效条件 */) { return { isValid: true }; }
  else { return { isValid: false, errorMessage: '/* 错误信息 */' }; }
}

自定义错误显示——三个 @api 方法:

  • validate()——Flow 用户导航到下一屏或完成时调用。返回内部验证状态。不要在 validate 中渲染错误——在 set 方法中验证并设内部错误消息
  • setCustomValidity(externalErrorMessage)——Flow 有外部输入验证错误时调用。存储消息到本地状态——不是渲染请求。空字符串=外部错误已解决,不应显示。非空字符串=富文本格式的外部错误消息
  • reportValidity()——Flow 请求组件显示所有错误的时机。渲染内部+外部错误消息到 HTML

最佳实践:防止首次加载时显示错误——用 hasUserInteracted 标志跟踪用户是否交互过。首次访问时不显示错误;当 validate() 返回错误导致用户被退回时显示错误。

验证方法 —— 时间线与决策表

验证方法时间线

方法调用时机:

  • validate():Flow 移动到下一屏或完成时调用
  • setCustomValidity():存在外部错误消息或外部错误变为空字符串时调用。不随 validate() 结果调用(独立触发)
  • reportValidity():基于多种条件调用

reportValidity 调用决策关键规则:

  • 有外部错误→必须调用(无论首次加载与否,无论有无内部错误)
  • 无外部错误 + 有内部错误 + 首次加载→调用(显示 validate 返回的错误)
  • 无外部错误 + 有内部错误 + 非首次→可选(根据实现决定)
  • 无外部错误 + 无内部错误→不调用(无错误报告)
  • 外部错误变为空(已解决)+ 非首次→调用(不渲染外部错误,可选内部)

完整示例流程:setCustomValidity("error") 存储→reportValidity() 显示。第二次 setCustomValidity("") 清空→reportValidity() 移除外部错误显示。

自定义属性编辑器 —— 概述与对比

自定义属性编辑器

无自定义编辑器→Flow Builder 中用文本框/组合框编辑属性。自定义编辑器→可使用任何输入组件和自定义样式——滑块、按钮组等简化管理体验。

自定义编辑器 = 一个 LWC 组件,通过特定 JavaScript 接口与 Flow Builder 通信。用于两种场景:① Apex Invocable Action 的输入配置(@InvocableMethod(configurationEditor='c-editor'))② Flow Screen Component 的属性编辑(configurationEditor="c-editor" 在 targetConfig 中)。

核心 JS 接口:@api inputVariables 接收 Flow 数据、用事件向 Flow 报告变更——configuration_editor_input_value_changed(值变化)、configuration_editor_input_value_deleted(值删除)、configuration_editor_generic_type_mapping_changed(泛型 sObject 类型变化)。

自定义属性编辑器 —— Invocable Action 示例

Invocable Action 示例

Apex 类中 @InvocableMethod(configurationEditor='c-html-email-editor') 注册编辑器。编辑器 @api inputVariables 接收 [{name, value, valueDataType}] 数组。每个属性用 getter 从数组中提取:this.inputVariables.find(({name}) => name === 'senderName')

值变化→派发 configuration_editor_input_value_changed 事件({ name, newValue, newValueDataType } detail)。Flow Builder 接收→更新 Flow 中的值。

validate() 编辑器验证:返回 [{key, errorString}] 数组。Flow Builder 显示错误数量(阻止保存)——要显示具体错误消息需自行编写代码。

自定义属性编辑器 —— Screen Component 与泛型 SObject

Screen Component 与泛型

Screen Component 编辑器:<targetConfig configurationEditor="c-volume-editor">。与 Action 编辑器相同模式——inputVariables 接收 + 事件报告变更。

泛型 SObject 输入(Screen Component):配置文件中声明 <propertyType name="T" extends="SObject"/> + <property name="inputValue" type={T}/>。类型用花括号引用 propertyType 的 name。编辑器通过 @api genericTypeMappings 接收 [{typeName, typeValue}]。类型变化→派发 configuration_editor_generic_type_mapping_changed

泛型 SObject(Invocable Action):typeName 自动加前缀——输入 T__paramName,输出 U__paramName

SObject 输入编辑器与 JavaScript 接口

SObject 与 JS 接口

完整 JS 接口五要素:

  • inputVariables:[{name, value, valueDataType}]——Flow 中的属性值。用 getter/setter 模式存储(_inputVariables = variables || []
  • builderContext:Flow 中所有元素和资源——{variables, screens, actionCalls, formulas, ...}。用于构建下拉选项(如从 variables 数组生成选项列表)
  • elementInfo:{apiName, type}——type 为 "Screen" 或 "Action"。用于区分同一组件的不同实例
  • genericTypeMappings:[{typeName, typeValue}]——泛型 sObject 的类型映射
  • validate:返回 [{key, errorString}]——Flow Builder 仅显示错误数量

三种事件类型:configuration_editor_input_value_changed(detail: name/newValue/newValueDataType)、configuration_editor_input_value_deleted(detail: name)、configuration_editor_generic_type_mapping_changed(detail: typeName/typeValue)。事件必须设 bubbles:true, composed:true

SObject 字面值编辑器:Contact 对象输入→ newValue 为 JSON 字符串(含 attributes.type + 字段值)、newValueDataType: "SObject"。集合输入→ newValue 为 JSON 数组字符串。

支持的数据类型与外形尺寸配置

数据类型与外形尺寸

Flow 与 LWC 间的类型映射:Apex(自定义类/@AuraEnabled 字段)、Boolean(true=1/true、false=0/false)、Currency→Integer、Date→"YYYY-MM-DD"、DateTime→"YYYY-MM-DDThh:mm:ssZ"、Email/Phone/Picklist/URL→String、Number→Number、Percent→Double、Record→特定 sObject 类型名、Multi-Picklist→分号分隔 String。

外形尺寸配置:<supportedFormFactors> 标签控制组件在哪些设备上渲染——Large(桌面)、Small(手机)。App/Record 页面支持两者,Home 页面仅支持 Large。一旦组件在页面中使用,只能增加不能减少支持的外形尺寸。

感谢阅读本指南。如需继续学习,请参阅下一章:Lightning App Builder。