Lightning Web Components 与 Salesforce 数据

掌握 LWC 中处理 Salesforce 数据的正确方式。本文讲解完整的数据访问决策树——从零代码的 lightning-record-*-form 基础组件、到 LDS wire 适配器(@wire 响应式读取)、LDS 函数(命令式增删改),再到 @AuraEnabled 的 Apex 方法(@wire 响应式 vs 命令式),以及每种方式的服务器错误处理模式(wired 属性/函数/命令式的 reduceErrors 模式),帮你按场景选择正确的数据访问策略,用更少代码、更好性能、更少 bug 构建生产级 LWC。...

📅 2026/10/5 ✍️ ponybai 🏷️ salesforce, developer, lwc, headless

一、使用 Lightning Data Service 处理数据

slide_2

Lightning Data Service(LDS)是 LWC 处理 Salesforce 数据的首选且最简单的方式。本单元探索 record-form 基础组件(最简单)、LDS wire 适配器(响应式读取)、LDS 函数(命令式修改),以及 LDS 的共享缓存架构——消除冗余服务端调用、保持组件间数据一致。

学习目标(单元一)

slide_3

完成本单元后,你将能够:用 lightning-record-*-form 基础组件查看、编辑、创建记录;用 LDS wire 适配器通过 @wire 装饰器响应式读取数据;用 LDS 函数通过 JavaScript promise 命令式创建、更新、删除记录。

数据访问决策树:选择正确的工具

slide_4

在 LWC 中处理 Salesforce 数据有多种方式,选对意味着更少代码、更简单、更好性能、更易维护。从最简单到最可定制的四个层级:

  • Level 1 — Record Form 基础组件(最简单):lightning-record-form(查看+编辑+创建一体)、lightning-record-view-form(只查看)、lightning-record-edit-form(编辑/创建)。最适合单记录 CRUD,无需 JavaScript。
  • Level 2 — LDS Wire 适配器(响应式读取):@wire(getRecord)(记录变化自动更新)、getObjectInfo、getPicklistValues。最适合自动保持最新的显示。
  • Level 3 — LDS 函数(命令式修改):createRecord、updateRecord、deleteRecord,都返回 promise。最适合用户动作触发的编程式增删改。
  • Level 4 — 调用 Apex(完全控制):多记录事务、复杂业务逻辑、自定义验证、外部系统调用。

从 Level 1 开始,只在需要额外控制时往下走。

Record Form 基础组件:零代码 CRUD

slide_5

lightning-record-*-form 组件后台用 LDS,自动继承缓存、安全、同步。lightning-record-form 是瑞士军刀:一个组件做查看、编辑、创建,用6 行 markup 即可创建 Account(无需 Apex、无需 JavaScript 数据操作,只需成功处理器显示 toast)。lightning-record-view-form 查看记录并自定义布局;lightning-record-edit-form 编辑/创建并自定义字段放置。

关键模式——导入对象和字段引用:import ACCOUNT_OBJECT from '@salesforce/schema/Account'、import NAME_FIELD from '@salesforce/schema/Account.Name'。这确保引用完整性:Salesforce 验证对象和字段存在、防止删除、自动包含在 change set 和 package 中;字段重命名时代码仍工作,因为引用的是元数据而非字符串。

二、使用 Apex 处理数据

slide_6

当 LDS 无法处理用例——多记录事务、复杂业务逻辑、自定义验证、外部系统调用——就用 Apex。学习用 @AuraEnabled 暴露 Apex 方法、@wire 响应式调用、命令式调用。

从 Lightning Web Components 调用 Apex

slide_7

Apex 方法要求:static、public/global、@AuraEnabled 注解;可缓存方法(@AuraEnabled(cacheable=true))只读、禁止 DML。

两种调用方式:

  • @wire(响应式)——方法必须 cacheable;数据自动提供,响应式参数变化就重新运行;数据可来自 LDS 缓存或服务端;用 refreshApex() 强制刷新。适合依赖响应式变量的显示。
  • 命令式(Imperative)——精确控制调用时机;方法不需要 cacheable(可做 DML);返回 promise(.then()/.catch());从事件处理器/生命周期钩子调用。适合 create/update/delete。

何时选 Apex 而非 LDS:单事务多记录操作、属于服务端的复杂业务逻辑、验证规则之外的自定义验证、外部系统集成、LDS 不支持的操作。黄金法则:LDS 能做就用 LDS,不能才用 Apex。

三、处理服务器错误

slide_8

每个数据操作都可能失败(网络、验证、权限)。专业 LWC 开发意味着优雅处理错误。学习 LDS 和 Apex 返回的错误结构、@wire(属性或函数)vs 命令式调用的错误处理差异、LWC Recipes 的 reduceErrors 模式。

每种数据访问方法的错误处理模式

slide_9

服务器错误有特定结构,取决于数据访问方式,需正确处理每种模式:

  • Wired 属性(最常见)——错误在 this.wiredProperty.error,用 getter 创建响应式 errors 属性(get errors() { return this.wiredRecord.error ? reduceErrors(...) : [] }),在模板用 <template if:true={errors}> 显示。
  • Wired 函数——函数接收 { data, error } 参数,在函数内处理。
  • 命令式调用(LDS 函数和 Apex)——用 .catch(error => ...) 处理 promise 错误。

reduceErrors 助手(LWC Recipes 的 ldsUtils 模块):把复杂错误对象扁平化成消息数组,处理字段级/页面级/DML 错误,可直接复制进项目。呈现方式自选:错误面板、Toast 消息(ShowToastEvent variant='error')、内联字段错误。用户永远不该看到空白屏幕或堆栈跟踪——每个错误都应被捕获、处理、清晰呈现。


文章来源:Trailhead - Lightning Web Components and Salesforce Data