Salesforce 为 Lightning Web 组件提供了多种处理数据的方法。始终从最简单的解决方案开始,然后转向允许根据需要进行更多自定义的解决方案。
数据准则
处理 Salesforce 数据的最简单方法是使用基于 Lightning 数据服务 (LDS) 构建的基本 Lightning 组件。 如果您需要更大的灵活性,请直接使用 Lightning 数据服务线路适配器。每个电线适配器提供不同的数据和元数据。线路服务将数据和元数据预配到组件。
如果要在一个操作中发送多个查询,请从 GraphQL 线路适配器开始。最后,如果 GraphQL 和 LDS 电线适配器不够灵活,请使用 Apex。
重要
Lightning 数据服务支持所有自定义对象和用户界面 API 支持的所有标准对象。不支持外部对象、个人帐户和自定义元数据类型。Lightning 数据服务不会产生任何 API 使用调用,但它会受到一般限制的约束,例如返回的记录数。
使用基于 Lightning 数据服务构建的基本 Lightning 组件
Lightning 数据服务为您管理数据;对记录的更改反映在基于记录构建的所有技术中。
基于 Lightning 数据服务构建的基本 Lightning 组件是 、 和 。它们提供了一个用于查看、创建和编辑记录的 UI,类似于 Salesforce 中的记录详细信息页面。lightning-record-formlightning-record-edit-formlightning-record-view-form
使用这些组件可以:lightning-record*form
- 创建元数据驱动的 UI 或基于表单的 UI,类似于 Salesforce 中的记录详细信息页面。
- 根据字段元数据显示记录值。
- 显示或隐藏本地化的字段标签。
- 在自定义字段上显示帮助文本。
- 执行客户端验证并强制执行验证规则。
使用组件时,请考虑以下准则。lightning-record*form
闪电记录形式
此组件是显示表单以创建、编辑或查看记录的最简单方法。当用户开始编辑字段时,表单会自动在查看模式和编辑模式之间切换。该组件使用对象的默认记录布局,并支持多列。它加载对象的紧凑布局或完整布局中的所有字段,或仅加载您指定的字段。
注意
若要提高性能,请尽可能指定字段而不是布局。仅当您希望管理员(而不是组件)控制所置备的字段时,才指定布局。该组件必须处理接收分配给上下文用户布局的每个字段。
lightning-record-edit-form 和 lightning-record-view-form
若要自定义表单显示或提供记录数据的自定义呈现,请使用 (添加或更新记录) 和 (查看记录)。 使您能够使用组件预填充字段值。lightning-record-edit-form
lightning-record-view-form
lightning-record-edit-form
lightning-input-field
请参阅使用基本组件处理记录。
注意
若要创建自定义 UI,或者如果不需要元数据驱动的 UI,请使用线路适配器。
使用 Lightning Data Service 有线适配器和功能
和模块提供闪电数据服务 (LDS) 电线适配器和功能。lightning/uiGraphQLApi
lightning/ui*Api
GraphQL 有线适配器
GraphQL 线路适配器使用 LDS 管理您的数据。它提供了一个端点,允许您在没有 Apex 的情况下查询确切的字段和对象。与其他 LWC 电线适配器相比,它减少了请求有效负载,并最大限度地减少了为用户获取数据所需的请求数量。
如果您通过其他有线适配器替换多个请求,GraphQL 的性能可能会更高。在处理大量记录时,电线适配器的分页功能还可以帮助您轻松高效地呈现数据。
借助 Lightning Data Service 的共享缓存、字段级安全性以及用户和组织权限,您可以在以下场景中使用 GraphQL 线路适配器功能:
- 在一次操作中发送多个查询
- 请求多个对象的记录数据
- 具有父子关系的查询记录
- 按条件筛选并订购查询结果
- 使用动态记录 ID
请参阅适用于 LWC 的 GraphQL API。
lightning/ui*Api 线适配器和功能
要访问原始记录数据,以便您可以执行业务逻辑或创建需要比 LDS 基本组件允许的更多自定义的表单,请使用 指定 getRecord
Lightning 数据服务线路适配器。@wire
若要显示字段值列表(如联系人姓名列表),请使用 getListUi
。
您可以使用多个线路适配器为多个记录设置数据,但每个操作都是一个独立的事务。若要在单个事务中使用多个记录,请使用 Apex。
要创建、编辑或删除单个记录,请调用 lightning/ui*Api
模块中的 、 和 函数。与 LDS 电线适配器一样,要处理多条记录,可以使用多个功能,但每个操作都是一个独立的事务。若要在单个事务中使用多个记录,请使用 Apex。createRecordupdateRecorddeleteRecord
注意
要提高性能,请使用返回用例所需最少数据量的线路适配器。 例如,GraphQL 线路适配器仅返回您查询的数据。相反,除了指定的字段外,LDS 连线适配器还返回子关系和布局类型。getRecord
请参阅使用线路服务获取数据并创建记录。
使用 Apex
如果您无法使用基本组件,并且无法使用 Lightning 数据服务线路适配器或功能,请使用 Apex。
与 Lightning 数据服务数据不同,Apex 数据不受管理;您必须刷新数据。如果 Apex 数据是通过线路服务预配的,请通过调用 refreshApex()
来刷新它,该数据使用线路配置来获取数据并更新缓存。如果代码必须调用 Apex 方法,若要刷新数据,请调用该方法,然后调用 notifyRecordUpdateAvailable(recordIds)
来更新缓存。
注意
不推荐使用 to 刷新来自非 Apex 电线适配器的数据。若要刷新非 Apex 线路适配器返回的记录数据,请改用 notifyRecordUpdateAvailable(recordIds)。refreshApex
在以下场景中使用 Apex:
- 使用用户界面 API 不支持的对象,如 Task 和 Event。
- 使用用户界面 API 不支持的操作,例如按条件加载记录列表(例如,加载金额> $1M 的前 200 个帐户)。
- 执行事务性操作。例如,创建一个客户并创建一个与新客户关联的商机。如果任一创建失败,则回滚整个事务。
- 以命令方式调用方法,而不是通过有线服务调用方法。您可能希望以命令方式调用方法以响应单击按钮,或者延迟加载到关键路径之外。当您以命令方式调用 Apex 方法时,若要刷新数据,请再次调用 Apex 方法。
请参阅调用 Apex 方法。
重要
为了防止代码复杂性和不必要的副作用,数据应该沿一个方向流动,从父级流向子级。要触发突变,组件应向其父组件发送事件。传递给组件的对象是只读的。若要更改数据,组件应创建要更改的对象的浅拷贝。在处理数据时,了解这些概念非常重要。请参阅数据流。
Apex 和 Lightning 数据服务注意事项
根据您的使用案例,您可以结合使用 Apex 和 Lightning 数据服务 (LDS) 线路适配器。在处理 Apex 和 LDS 返回的数据时,请考虑这些准则。
- Apex 不与 LDS 共享数据缓存或数据存储。在联机和脱机条件下,使用 Apex 获取的数据可能与使用 LDS 电线适配器获取的数据不一致。例如,如果您的组件使用 Apex 获取数据,然后使用 GraphQL 线路适配器对相同数据执行搜索查询,则它可能会出现意外行为。
- 使用 SOQL 获取数据时,请在执行提取和搜索查询时使用 GraphQL 线路适配器。一致地使用 GraphQL 线路适配器进行提取和搜索可以防止出现问题,例如在 GraphQL 线路适配器上检索相应的 null 值时获取 Apex 数据。
闪电数据服务
Lightning 数据服务中加载的记录将被缓存并在组件之间共享。如果页面由显示相同记录的组件组成,则所有组件都显示相同版本的记录。访问同一记录的组件的性能显著提高,因为无论有多少组件使用记录,记录都会加载一次。
在 Lightning Web 组件中,使用基于 Lightning 数据服务构建的这些技术对数据执行操作并访问元数据。
- 基本组件:、 和
lightning-record-edit-form
lightning-record-form
lightning-record-view-form
lightning/ui*Api
模块中的电线适配器和功能- GraphQL API 线路适配器
重要
Lightning 数据服务支持所有自定义对象和用户界面 API 支持的所有标准对象。不支持外部对象、个人帐户和自定义元数据类型。Lightning 数据服务不会产生任何 API 使用调用,但它会受到一般限制的约束,例如返回的记录数。
Lightning 数据服务为您管理数据;对记录的更改反映在基于记录构建的所有技术中。相比之下,来自 Apex 的数据不受管理;您必须刷新数据。
如果 Lightning 数据服务检测到对记录或其支持的任何数据或元数据的更改,则使用相关适配器的所有组件都会接收新值。如果出现以下情况,将触发检测:@wire
- 闪电网络组件会改变记录。
- LDS 缓存条目过期,然后 Lightning Web 组件触发读取。对于同一用户,缓存条目和 Lightning Web 组件必须位于同一浏览器和应用程序(例如 Lightning Experience)中。
@wire
Lightning 数据服务做了大量工作来使代码运行良好。
- 逐步加载记录数据。
- 在客户端上缓存结果。
- 当依赖的 Salesforce 数据和元数据发生更改时,使缓存条目失效。
- 通过批量处理和重复数据删除请求来优化服务器调用。
为了提高性能,Lightning 数据服务维护了通过线路适配器加载的记录数据的客户端缓存。从此缓存加载数据比从服务器请求数据更快。Lightning 数据服务从服务器重新请求记录数据,以满足缓存生命周期后发生的请求。但是,即使在缓存生存期结束之前,您也可能获得更新的记录数据。缓存生命周期可能会随着 Lightning 数据服务的持续改进而发生变化。
此外,Lightning 数据服务还为缓存在持久存储中的对象和布局元数据维护单独的超时。当您更改布局以在自定义对象上记录页面时,布局更改不会立即显示。当您重新加载页面时,记录页面会在超时后显示更新的布局。要立即查看布局更改,请注销并重新登录。持久缓存在具有安全浏览器缓存的组织中可用,默认情况下处于启用状态。
Lightning 数据服务建立在用户界面 API 之上。UI API 是 Salesforce 用于构建 Lightning Experience 和 Salesforce for iOS 和 Android 的公共 Salesforce。顾名思义,UI API 旨在使构建 Salesforce UI 变得容易。
UI API 在单个响应中提供数据和元数据。响应与 Salesforce 管理员对组织所做的布局更改相匹配。如果管理员从布局中删除字段,则该字段不会包含在对布局元数据请求的响应中。
UI API 响应还遵循 CRUD 访问、字段级安全设置和共享设置。这意味着该框架仅显示用户具有 CRUD 访问权限和 FLS 可见性的记录和字段。通过使用 Lightning 数据服务线路适配器 () 和基于它构建的组件,您可以获得所有这些功能。lightning/ui*Api

使用基本组件处理记录
要创建允许用户查看、编辑和创建 Salesforce 记录的表单,请使用 、 和 组件。lightning-record-form
lightning-record-edit-form
lightning-record-view-form
注意
这些组件是处理记录的最简单方法。它们提供用于查看、创建和编辑记录的 UI,类似于 Salesforce 中的记录详细信息页面。若要创建自定义 UI,或者如果不需要元数据驱动的 UI,请使用线路适配器。lightning-record*form
比较基本组件
比较组件以找到符合您用例的组件。lightning-record*form
这些组件提供窗体布局。字段标签使用基于组织中默认值的值。这些组件无需 Apex 代码即可处理记录创建、读取和更新更改。他们使用 Lightning 数据服务在组件之间缓存和共享记录更新。
lightning-record-edit-form
– 显示可编辑的表单。lightning-record-view-form
– 显示只读表单。lightning-record-form
– 支持编辑、查看和只读模式。
注意
这些组件支持用户界面 API 支持的对象。不支持外部对象和个人帐户。请参阅支持的对象。
特征 | lightning-record-form | lightning-record-view-form | lightning-record-edit-form |
---|---|---|---|
创建记录 | ![]() | ![]() | |
编辑记录 | ![]() | ![]() | |
查看记录 | ![]() | ![]() | |
只读模式 | ![]() | ![]() | |
布局类型 | ![]() | ||
多列布局 | ![]() | ![]() | ![]() |
字段的自定义布局 | ![]() | ![]() | |
记录数据的自定义呈现 | ![]() | ![]() |
对于大多数用例,这提供了一个很好的起点。它组合并简化了 和 的功能。lightning-record-form
lightning-record-view-form
lightning-record-edit-form
指定布局类型或字段和模式,组件将负责布局、验证、CRUD 更改和错误处理。成功提交更改后,组件还会从编辑模式切换到查看模式。lightning-record-form
注意
若要提高性能,请尽可能指定字段而不是布局。仅当您希望管理员(而不是组件)控制所置备的字段时,才指定布局。该组件必须处理接收分配给上下文用户布局的每个字段。
对于需要自定义字段布局和自定义呈现记录数据的更高级用例,请使用 和 .lightning-record-view-form
lightning-record-edit-form
如果需要比基本组件允许的更多自定义(例如自定义用户界面),请参阅生成自定义 UI 以创建和编辑记录并获取记录数据。
加载记录
加载记录可以完全在标记中使用和传入记录 ID 来完成。如果需要自定义布局,请使用 .如果您需要的自定义次数超出了基于表单的组件所允许的范围,请使用像 这样的电线适配器。lightning-record-form
lightning-record-view-form
getRecord
使用 lightning-record-form 显示记录
显示记录的最简单方法是使用 .您可以在两种模式下显示记录。lightning-record-form
view
使用启用了内联编辑的输出字段加载表单。可编辑字段具有编辑图标。如果用户单击编辑图标,则表单中的所有字段都将变为可编辑,并且表单将显示“提交”和“取消”按钮。read-only
只读模式仅加载包含输出字段的表单。表单不包括编辑图标或“提交”和“取消”按钮。
此代码在视图模式下显示具有指定字段的客户记录。字段标签和值根据显示密度设置进行显示。提供视图模式时为默认模式。record-id
<!-- myComponent.html -->
<template>
<lightning-record-form record-id={recordId} object-api-name={objectApiName} fields={fields}>
</lightning-record-form>
</template>
注意
若要提高性能,请尽可能指定字段而不是布局。仅当您希望管理员(而不是组件)控制所置备的字段时,才指定布局。该组件必须处理接收分配给上下文用户布局的每个字段。
使用您自己的记录 ID 或将示例放在客户记录页中以继承其记录 ID。
// myComponent.js
import { LightningElement, api } from "lwc";
export default class MyComponent extends LightningElement {
@api recordId;
@api objectApiName;
fields = ["AccountId", "Name", "Title", "Phone", "Email"];
}
例
此示例使用 github.com/trailheadapps/lwc-recipes 存储库中的组件。recordFormDynamicContact
使用 lightning-record-view-form 显示具有自定义字段布局的记录
若要显示具有自定义字段布局的记录,请使用该组件。要编写表单字段,请使用组件。通过包含单个字段,您可以使用 Lightning Design System 实用程序类(如网格系统)设置自定义字段布局的样式。lightning-record-view-form
lightning-output-field
<!-- recordViewCustomLayout.html -->
<template>
<lightning-record-view-form record-id={recordId} object-api-name="Account">
<div class="slds-grid">
<div class="slds-col slds-size_1-of-2">
<lightning-output-field field-name="Name"></lightning-output-field>
<lightning-output-field field-name="Phone"></lightning-output-field>
</div>
<div class="slds-col slds-size_1-of-2">
<lightning-output-field field-name="Industry"></lightning-output-field>
<lightning-output-field field-name="AnnualRevenue"></lightning-output-field>
</div>
</div>
</lightning-record-view-form>
</template>
使用您自己的记录 ID 或将示例放在客户记录页中以继承其记录 ID。
// recordViewCustomLayout.js
import { LightningElement, api } from "lwc";
export default class MyComponent extends LightningElement {
// Expose a recordId property.
@api recordId;
}
注意
您可以将表单设计为遵循组织的显示密度设置,或设置表单密度以覆盖显示密度设置。请参阅更改表单显示密度。
使用 getRecord 在自定义用户界面中显示记录数据
我们已经了解了记录字段如何使用 呈现。若要在自定义用户界面中呈现数据,请使用 getRecord
或 getRecords
线路适配器。lightning-output-field
此示例使用基本组件 来显示帐户名称。lightning-formatted-text
<!-- recordViewGetRecord.html -->
<template>
<lightning-record-view-form record-id={recordId} object-api-name={accountObject}>
<div class="slds-grid">
<div class="slds-col slds-size_1-of-2">
<!-- Other record data here -->
</div>
<div class="slds-col slds-size_1-of-2">
<lightning-formatted-text value={nameValue} class="slds-text-heading_large">
</lightning-formatted-text>
</div>
</div>
</lightning-record-view-form>
</template>
在组件的 JavaScript 代码中,导入对对象和字段的引用。Account
Account.Name
getRecord
连线适配器在组件中加载用于自定义渲染的字段,而不是 使用的标准。Namelightning-formatted-textlightning-output-fieldlightning-record-view-form
getFieldValue(record, field)
函数获取字段的值。Name
// recordViewGetRecord.js
import { LightningElement, api, wire } from "lwc";
/* Wire adapter to fetch record data */
import { getRecord, getFieldValue } from "lightning/uiRecordApi";
import ACCOUNT_OBJECT from "@salesforce/schema/Account";
import NAME_FIELD from "@salesforce/schema/Account.Name";
export default class AccountViewer extends LightningElement {
/** Id of record to display. */
@api recordId;
/* Expose schema objects/fields to the template. */
accountObject = ACCOUNT_OBJECT;
/* Load Account.Name for custom rendering */
@wire(getRecord, { recordId: "$recordId", fields: [NAME_FIELD] })
record;
/** Get the Account.Name value. */
get nameValue() {
return this.record.data ? getFieldValue(this.record.data, NAME_FIELD) : "";
}
}
使用 getRecord 显示父记录中的数据
若要显示记录及其父记录中的数据,请使用 ,与上一个示例类似。使用表示法从父记录导入数据。lightning-record-view-form
getRecord
{object}.{parentObject}.{field}
此示例使用基本组件 来显示客户记录所有者的电子邮件地址。lightning-formatted-email
<!-- recordViewGetRecordParent.html -->
<template>
<lightning-record-view-form object-api-name={objectApiName} record-id={recordId}>
<lightning-messages></lightning-messages>
<lightning-output-field field-name={nameField}></lightning-output-field>
<div class="slds-form-element slds-form-element_stacked">
<span class="slds-form-element__label">Owner Email</span>
<div class="slds-form-element__control">
<lightning-formatted-email value={ownerField}> </lightning-formatted-email>
</div>
</div>
</lightning-record-view-form>
</template>
组件的 JavaScript 代码导入对对象和字段的引用。Account
Account.Owner.Email
getRecord
连线适配器在组件中加载用于自定义呈现的字段,而不是在 使用的标准中加载。Account.Owner.Emaillightning-formatted-emaillightning-output-fieldlightning-record-view-form
getFieldValue(record, field)
函数获取字段的值。Account.Owner.Email
// recordViewGetRecordParent.js
import { LightningElement, api, wire } from "lwc";
import { getRecord, getFieldValue } from "lightning/uiRecordApi";
import ACCOUNT_OBJECT from "@salesforce/schema/Account";
import NAME_FIELD from "@salesforce/schema/Account.Name";
import OWNER_EMAIL_FIELD from "@salesforce/schema/Account.Owner.Email";
export default class RecordViewFormParentData extends LightningElement {
objectApiName = ACCOUNT_OBJECT;
nameField = NAME_FIELD;
@api recordId;
@api objectApiName;
/* Load Account.Owner.Email for custom rendering */
@wire(getRecord, {
recordId: "$recordId",
fields: [OWNER_EMAIL_FIELD],
})
record;
/* Get the Account.Owner.Email value. */
get ownerField() {
return this.record.data ? getFieldValue(this.record.data, OWNER_EMAIL_FIELD) : "";
}
}
编辑记录
创建允许您编辑记录的表单的最简单方法是使用 .要自定义表单布局或预加载自定义值,请使用 .lightning-record-form
lightning-record-edit-form
提示
如果您需要比这些组件提供的更大的灵活性,请参阅生成自定义 UI 以创建和编辑记录。
使用 lightning-record-form 编辑包含布局中的字段的记录
若要编辑记录,请使用 和 属性。当您提供记录 ID 时,组件默认使用视图模式,该模式显示带有编辑图标的输出字段。如果单击编辑图标,表单中所有可更新的字段都将变为可编辑。可编辑窗体显示一个用于更新记录的“保存”按钮,以及一个用于还原更改的“取消”按钮。record-id
object-api-name
该组件提供默认的提交和错误处理程序。错误会自动显示在表单顶部。
此示例创建一个窗体,该窗体允许用户从客户记录的紧凑布局中更新字段。它以两列布局显示字段。
<template>
<lightning-record-form
record-id={recordId}
object-api-name={objectApiName}
columns="2"
mode="edit"
layout-type="Compact"
>
</lightning-record-form>
</template>
注意
若要提高性能,请尽可能指定字段而不是布局。仅当您希望管理员(而不是组件)控制所置备的字段时,才指定布局。该组件必须处理接收分配给上下文用户布局的每个字段。
将此示例放在记录页上以继承其 和 属性。record-id
object-api-name
import { LightningElement, api } from "lwc";
export default class MyComponent extends LightningElement {
@api recordId;
@api objectApiName;
}
您可以使用自定义事件替代默认表单行为,例如在提交成功或失败时显示 Toast。有关更多信息,请参阅 lightning-record-form
参考文档。
使用 lightning-record-form 编辑具有特定字段的记录
您可以通过提供字段名称数组或导入对字段的引用来指定在可编辑表单上显示哪些字段。
注意
使用字符串传入对象和字段不提供编译时验证。在运行时之前,您不知道这些字段是否有效。建议从 导入对对象和字段的引用。@salesforce/schema
此示例使用 github.com/trailheadapps/lwc-recipes 存储库中的组件。它使用静态架构定义显示记录的可编辑表单。recordFormStaticContact
<template>
<lightning-record-form
object-api-name={objectApiName}
record-id={recordId}
fields={fields}
></lightning-record-form>
</template>
在 JavaScript 文件中导入字段引用。
import { LightningElement, api } from "lwc";
import ACCOUNT_FIELD from "@salesforce/schema/Contact.AccountId";
import NAME_FIELD from "@salesforce/schema/Contact.Name";
import TITLE_FIELD from "@salesforce/schema/Contact.Title";
import PHONE_FIELD from "@salesforce/schema/Contact.Phone";
import EMAIL_FIELD from "@salesforce/schema/Contact.Email";
export default class RecordFormStaticContact extends LightningElement {
// Flexipage provides recordId and objectApiName
@api recordId;
@api objectApiName;
fields = [ACCOUNT_FIELD, NAME_FIELD, TITLE_FIELD, PHONE_FIELD, EMAIL_FIELD];
}
使用 lightning-record-edit-form 编辑具有自定义布局的记录
要为表单字段提供自定义布局,请使用该组件。将字段传递给 ,这将显示基于记录字段类型的输入控件。本示例使用自定义布局显示多个字段。将此示例组件添加到联系人记录页以继承其 和 属性。lightning-record-edit-form
lightning-input-field
record-id
object-api-name
<template>
<lightning-record-edit-form
object-api-name={objectApiName}
record-id={recordId}>
<lightning-messages></lightning-messages>
<div class="slds-grid">
<div class="slds-col slds-size_1-of-2">
<lightning-input-field field-name="Name"></lightning-input-field>
<lightning-input-field field-name="Title"></lightning-input-field>
</div>
<div class="slds-col slds-size_1-of-2">
<lightning-input-field field-name="Phone"></lightning-input-field>
<lightning-input-field field-name="Email"></lightning-input-field>
</div>
</div>
<div class="slds-m-top_medium">
<lightning-button type="submit" variant="brand" label="Edit Contact"></lightning-button>
</div>
</template>
lightning-record-edit-form
自动处理表单提交和错误。要自动在表单字段的上方或下方显示错误消息,请在组件之前或之后添加。lightning-messages
lightning-input-field
将表单重置为原始字段值
lightning-record-edit-form
不像那样提供自己的“取消”和“保存”按钮。若要创建自己的“取消”按钮来还原字段值,请包含调用该方法的组件。将 替换为你自己的,或将此示例放在联系人记录页上以继承其属性。lightning-record-form
lightning-button
reset()
record-id
record-id
<template>
<lightning-record-edit-form record-id={recordId} object-api-name="Contact">
<lightning-messages></lightning-messages>
<lightning-input-field field-name="FirstName"></lightning-input-field>
<lightning-input-field field-name="LastName"></lightning-input-field>
<lightning-input-field field-name="Email"></lightning-input-field>
<lightning-input-field field-name="Phone"></lightning-input-field>
<div class="slds-align_absolute-center slds-p-around_medium">
<lightning-button
class="slds-m-around_xx-small"
label="Cancel"
onclick={handleReset}
></lightning-button>
<lightning-button
class="slds-m-around_xx-small"
label="Create Contact"
type="submit"
variant="brand"
></lightning-button>
</div>
</lightning-record-edit-form>
</template>
在组件上调用该方法。reset()
lightning-input-field
import { LightningElement } from "lwc";
export default class FormResetExample extends LightningElement {
@api recordId;
handleReset(event) {
const inputFields = this.template.querySelectorAll("lightning-input-field");
if (inputFields) {
inputFields.forEach((field) => {
field.reset();
});
}
}
}
使用自定义事件覆盖默认行为
lightning-record-edit-form
自动处理表单提交和错误。要自动在表单字段的上方或下方显示错误消息,请在组件之前或之后添加。lightning-messages
lightning-input-field
lightning-record-edit-form
使您能够处理以下自定义事件。
error
– 当表单返回服务器端错误时触发。load
– 在表单加载记录数据时触发。submit
– 提交表单时触发。success
– 在表单数据成功保存时触发。
此示例在表单提交时发生错误时显示 Toast。常见错误包括无法访问网络或表单中缺少必填字段。使用您自己的记录 ID 或将示例放在联系人记录页上以继承其记录 ID。
<template>
<lightning-record-edit-form
record-id={recordId}
object-api-name="Contact"
onerror={handleError}
>
<!--lightning-messages not needed here
since we’re displaying a toast with the error message -->
<!--<lightning-messages></lightning-messages>-->
<lightning-input-field field-name="FirstName"></lightning-input-field>
<lightning-input-field field-name="LastName"></lightning-input-field>
<lightning-input-field field-name="Email"></lightning-input-field>
<lightning-input-field field-name="Phone"></lightning-input-field>
<lightning-button type="submit" variant="brand" label="Create Contact"></lightning-button>
</lightning-record-edit-form>
</template>
若要显示 Toast,请导入模块。lightning/platformShowToastEvent
import { LightningElement } from "lwc";
import { ShowToastEvent } from "lightning/platformShowToastEvent";
export default class FormErrorExample extends LightningElement {
@api recordId;
handleError(event) {
console.log(event.detail);
this.dispatchEvent(
new ShowToastEvent({
title: "Error creating record",
message: event.detail.message,
variant: "error",
}),
);
}
}
event.detail.message
返回错误的一般说明。若要返回特定于字段的错误(如验证规则中的错误),请使用 ,它提供字段列表并记录异常错误。event.detail.output.fieldErrors
假设您在 、 和 字段中遇到验证规则错误,可能会返回如下内容。FirstName
LastName
Email
event.detail.output.fieldErrors
{
"Email": [
{
"constituentField": null,
"duplicateRecordError": null,
"errorCode": "FIELD_CUSTOM_VALIDATION_EXCEPTION",
"field": "Email",
"fieldLabel": "Email",
"message": "Enter a Salesforce email"
}
],
"Name": [
{
"constituentField": "FirstName",
"duplicateRecordError": null,
"errorCode": "FIELD_CUSTOM_VALIDATION_EXCEPTION",
"field": "Name",
"fieldLabel": "First Name",
"message": "Your first name should contain at least 2 characters"
},
{
"constituentField": "LastName",
"duplicateRecordError": null,
"errorCode": "FIELD_CUSTOM_VALIDATION_EXCEPTION",
"field": "Name",
"fieldLabel": "Last Name",
"message": "Your last name should contain at least 2 characters"
}
]
}
有关更多信息,请参阅 lightning-record-edit-form
参考文档。
使用 lightning-record-edit-form 编辑具有自定义验证的记录
我们建议您创建验证规则错误,以使用 nested in 强制执行字段验证,如使用自定义事件覆盖默认行为中所述。lightning-input-field
lightning-record-edit-form
lightning-input-field
不支持客户端自定义验证。如果要实现自己的客户端验证,请考虑改用嵌套。lightning-input
lightning-record-edit-form
将此示例放在客户记录页上。此示例将组件连接到“名称”字段进行编辑。lightning-input
<!-- recordEditFormStaticAccount.html -->
<template lwc:if={account.data}>
<lightning-record-edit-form
object-api-name={objectApiName}
record-id={recordId}
onsubmit={handleSubmit}
>
<lightning-input
label="Name"
value={name}
onchange={handleChange}
class="slds-m-bottom_x-small"
></lightning-input>
<lightning-button class="slds-m-top_small" type="submit" label="Update Account Name">
</lightning-button>
</lightning-record-edit-form>
</template>
使用电线适配器将组件连接到 Salesforce 字段,并提供您自己的标签。使用 时会自动完成接线,但使用 时不会。使用 上的事件处理程序提交记录数据。在事件处理程序中,使用用户输入值执行验证检查并更新字段。lightning-input
getRecord
lightning-input-field
lightning-input
onsubmit
lightning-record-edit-form
setCustomValidity()
// recordEditFormStaticAccount.js
import { LightningElement, api, wire } from "lwc";
import { getRecord } from "lightning/uiRecordApi";
const FIELDS = ["Account.Name"];
export default class RecordEditFormStaticAccount extends LightningElement {
@api recordId;
@api objectApiName;
inputVal = "";
@wire(getRecord, { recordId: "$recordId", fields: FIELDS })
account;
get name() {
return this.account.data.fields.Name.value;
}
handleChange(event) {
this.inputVal = event.target.value;
}
handleSubmit(event) {
event.preventDefault();
const inputCmp = this.template.querySelector("lightning-input");
const value = inputCmp.value;
// perform validation check
if (!value.includes("Burlington")) {
inputCmp.setCustomValidity("The account name must include 'Burlington'");
} else {
// if there was a custom error before, reset it
inputCmp.setCustomValidity("");
const fields = event.detail.fields;
fields.Name = this.inputVal;
this.template.querySelector("lightning-record-edit-form").submit(fields);
}
// shows the error right away without user interaction
inputCmp.reportValidity();
}
}
lightning-input
提供用于自定义验证的属性,如 、 和 。有关详细信息,请参阅 lightning-input
参考文档。minmaxpattern
注意
lightning-input-field
是与 一起使用的首选组件。仅当验证规则错误不符合要求时才使用 with。lightning-record-edit-form
lightning-input
lightning-record-edit-form
创建记录
创建允许用户创建记录的表单的最简单方法是使用 。要自定义表单布局或预加载自定义值,请使用 .lightning-record-form
lightning-record-edit-form
提示
如果您需要比这些组件提供的更大的灵活性,请参阅生成自定义 UI 以创建和编辑记录。
使用 lightning-record-form 创建记录
若要使用 创建记录,请省略该属性。此示例使用帐户对象及其字段的导入引用创建记录。窗体显示一个用于更新记录的“保存”按钮,以及一个用于还原更改的“取消”按钮。lightning-record-form
record-id
<template>
<lightning-record-form
object-api-name={accountObject}
fields={myFields}
onsuccess={handleAccountCreated}
>
</lightning-record-form>
</template>
字段导入将传递到数组中。导入引用时,将在编译时验证引用。将此示例放在记录页上以继承其 和 属性。myFields
record-id
object-api-name
import { LightningElement } from "lwc";
import ACCOUNT_OBJECT from "@salesforce/schema/Account";
import NAME_FIELD from "@salesforce/schema/Account.Name";
import WEBSITE_FIELD from "@salesforce/schema/Account.Website";
/**
* Creates Account records.
*/
export default class AccountCreator extends LightningElement {
accountObject = ACCOUNT_OBJECT;
myFields = [NAME_FIELD, WEBSITE_FIELD];
handleAccountCreated() {
// Run code when account is created.
}
}

成功保存数据后,字段将显示铅笔图标,表示内联编辑可用。此视图将一直显示,直到您刷新或重新加载页面。

使用 lightning-record-edit-form 创建具有自定义字段布局的记录
用于自定义字段布局或数据呈现。lightning-record-edit-form
传入所需的字段,这将显示基于记录字段类型的输入控件。若要启用错误消息的自动显示,请包含该组件。lightning-input-field
lightning-messages
<template>
<lightning-record-edit-form object-api-name={accountObject} onsuccess={handleAccountCreated}>
<lightning-messages></lightning-messages>
<div class="slds-grid">
<div class="slds-col slds-size_1-of-2">
<lightning-input-field field-name={nameField}></lightning-input-field>
<lightning-input-field field-name={websiteField}></lightning-input-field>
</div>
<div class="slds-col slds-size_1-of-2">
<!-- More lightning-input-field components here -->
</div>
</div>
<lightning-button type="submit" variant="brand" label="Create Account"></lightning-button>
</lightning-record-edit-form>
</template>
要访问所需的字段,请使用字段 imports from 。导入对对象和字段的引用可确保代码正常工作,即使对象和字段名称发生更改也是如此。@salesforce/schema
import { LightningElement } from "lwc";
import ACCOUNT_OBJECT from "@salesforce/schema/Account";
import NAME_FIELD from "@salesforce/schema/Account.Name";
import WEBSITE_FIELD from "@salesforce/schema/Account.Website";
/**
* Creates Account records.
*/
export default class AccountCreator extends LightningElement {
accountObject = ACCOUNT_OBJECT;
nameField = NAME_FIELD;
websiteField = WEBSITE_FIELD;
handleAccountCreated() {
// Run code when account is created.
}
}
使用 lightning-record-edit-form 预填充字段值
要在表单显示时提供字段值,请使用 上的属性。value
lightning-input-field
本示例显示一个窗体,其中包含帐户名称字段的自定义值。单击该按钮时,窗体将创建客户记录。
<template>
<lightning-record-edit-form object-api-name="Account">
<lightning-input-field field-name="Name" value="My Field Value"> </lightning-input-field>
<lightning-button class="slds-m-top_small" type="submit" label="Create new"> </lightning-button>
</lightning-record-edit-form>
</template>
若要在加载表单时以编程方式设置值,请在 JavaScript 中提供该值。此示例使用该属性设置值。以后可以通过编程方式设置此值,如调用该方法的事件处理程序所示。myValue
onclick
overrideValue
<template>
<lightning-record-edit-form object-api-name="Account">
<lightning-input-field field-name="Name" value={myValue}></lightning-input-field>
<lightning-button class="slds-m-top_small" type="submit" label="Create new"></lightning-button>
</lightning-record-edit-form>
<lightning-button label="Override Value" onclick={overrideValue}></lightning-button>
</template>
import { LightningElement, api } from "lwc";
export default class FieldValueCreateExample extends LightningElement {
myValue = "My Account Name";
overrideValue(event) {
this.myValue = "My New Name";
}
}
将表单重置为原始字段值
lightning-record-edit-form
不像那样提供自己的“取消”和“保存”按钮。若要创建自己的“取消”按钮来还原字段值,请包含调用该方法的组件。替换为您自己的。有关示例,请参阅编辑记录。lightning-record-formlightning-buttonreset()record-id
使用自定义事件覆盖默认行为
lightning-record-edit-form
自动处理表单提交和错误。要自动在表单字段的上方或下方显示错误消息,请在组件之前或之后添加。lightning-messages
lightning-input-field
lightning-record-edit-form
使您能够处理以下自定义事件。
error
– 当表单返回服务器端错误时触发。load
– 在表单加载记录数据时触发。submit
– 在表单提交更改的记录数据时触发。success
– 在表单提交更改的记录数据时触发。
有关示例,请参阅编辑记录。
构建自定义 UI 以创建和编辑记录
如果组件无法为您的用例提供足够的灵活性,请使用 JavaScript API 构建用于创建和编辑记录的 UI。lightning-record*form
提示
在使用 JavaScript API 之前,请查看组件是否满足您的需求。请参见比较基本组件。lightning-record*form
本文档介绍了 lwc-recipes 存储库中的组件。该组件要求输入一个名称,并使用该名称创建一个帐户。创建帐户时,它会呈现帐户 ID。ldsCreateRecord

若要通过 JavaScript 创建记录,请调用该函数。此组件调用处理程序中的函数。createRecord()
createAccount
<template>
<lightning-card title="LdsCreateRecord" icon-name="standard:record">
<div class="slds-m-around_medium">
<lightning-input label="Id" disabled value={accountId}></lightning-input>
<lightning-input
label="Name"
onchange={handleNameChange}
class="slds-m-bottom_x-small"
></lightning-input>
<lightning-button
label="Create Account"
variant="brand"
onclick={createAccount}
></lightning-button>
</div>
</lightning-card>
</template>
组件的 JavaScript 从模块导入。要显示错误处理通知,请从 导入。然后,它导入对 Account 对象和 Account name 字段的引用。createRecord
lightning/uiRecordApi
ShowToastEvent
lightning/platformShowToastEvent
将帐户名称传递给 ,这将根据您提供的名称创建帐户记录。createRecord(recordInput)
接下来,提供一个使用 创建客户记录的处理程序。在此示例中,当用户输入帐户名称时,该方法将处理组件 HTML 文件中的事件。createRecord(recordInput)
handleNameChange(event)
change
import { LightningElement } from "lwc";
import { createRecord } from "lightning/uiRecordApi";
import { ShowToastEvent } from "lightning/platformShowToastEvent";
import ACCOUNT_OBJECT from "@salesforce/schema/Account";
import NAME_FIELD from "@salesforce/schema/Account.Name";
export default class LdsCreateRecord extends LightningElement {
accountId;
name = "";
handleNameChange(event) {
this.accountId = undefined;
this.name = event.target.value;
}
createAccount() {
const fields = {};
fields[NAME_FIELD.fieldApiName] = this.name;
const recordInput = { apiName: ACCOUNT_OBJECT.objectApiName, fields };
createRecord(recordInput)
.then((account) => {
this.accountId = account.id;
this.dispatchEvent(
new ShowToastEvent({
title: "Success",
message: "Account created",
variant: "success",
}),
);
})
.catch((error) => {
this.dispatchEvent(
new ShowToastEvent({
title: "Error creating record",
message: error.body.message,
variant: "error",
}),
);
});
}
}
该函数返回一个 Promise 对象,该对象在创建记录时进行解析。要将记录数据返回给组件,请使用该块。此组件返回 并将其设置为属性。createRecord(recordInput)
then()
account.id
accountId
使用块处理错误。catch()
提示
若要更新记录,请参阅 updateRecord(recordInput, clientOptions),其中包含示例代码。要使用 Apex 更新多条记录,请参阅使用内联编辑在表中显示数据。