课程章节介绍
大家好,今天我们聊聊 Lightning Web Components 里一个非常常用的功能——Wire 服务。你写组件时,经常要从 Salesforce 拿数据,这时候用 Wire 就很方便。不过它有一些细节如果没注意到,数据可能出不来,调试起来挺头疼的。我就把这些点用最简单的话给你讲清楚。
首先,Wire 服务是通过 `@wire` 这个装饰器来用的,它需要三个东西:一个适配器 ID,一个配置对象,还有你要把结果放到哪个属性或函数里。适配器 ID 就是告诉它用哪个数据源,比如 `lightning/uiRecordApi`,注意这里用的是斜线符号,像路径一样。配置对象里放参数,例如你要的记录 ID 或者字段什么的。一定要记住,配置对象的属性绝不能是 `undefined`,哪怕你设成 `undefined`,Wire 服务直接不触发,什么反应都没有。所以如果你用变量,必须保证它在 Wire 执行时已经有值了。
接下来我们说字段引用。直接从 `@salesforce/schema` 里导入字段,比如 `Account.Name`。这样做的好处特别多:第一,编译的时候就能检查字段存不存在,写错了马上报错;第二,能防止字段被删除,如果管理员删了那个字段,组件打包就会失败,你提前知道;第三,字段重命名会级联更新,比如管理员改字段名,你这个引用会自动随着变;最后,打包或变更集的时候能确保这个字段被包含进去,不会漏。所以强烈建议用 schema 导入,别自己硬编码字段名字符串。
导入对象和字段有固定格式。对象导入直接用 API 名称,比如 `import ACCOUNT_OBJECT from '@salesforce/schema/Account'`。字段导入用 `对象.字段` 格式,比如 `import NAME_FIELD from '@salesforce/schema/Account.Name'`。如果你要跨关系拿数据,最多支持三级,格式是 `对象.关系1.关系2.关系3.字段`,再深就不行了。比如你想拿某个账户的第一个联系人的报告对象的字段,就可以写成 `Account.Contacts.ReportsTo.FieldName`,但最多三级关系。
复合字段这里有点特殊。什么复合字段呢?比如地址字段,一个字段里面包含街道、城市、邮编这些子字段。对于读取,你可以在 schema 里直接导入这个复合字段本身,比如用 `import BILLING_ADDRESS from '@salesforce/schema/Account.BillingAddress'`,这样读出来是对象。但是写入的时候,你不能写整个复合字段,必须拆成它的组成字段一个一个写。而且地址和地理位置这两种复合字段的子字段,只支持字符串语法来引用,不能用 schema 导入。所以如果你要设置 `BillingStreet`,你就直接用字符串 `'BillingStreet'`,而不是 schema 导入。
最后提醒几个导入限制。人员账户(Person Account)的字段挺特殊,比如 `PersonEmail`,你不能直接从 Account 对象导入,要从 Contact 导入,格式是 `Account.PersonContact.Email` 这种,或者说从 Contact 对象里引用 `__PC` 字段。外部对象(以 `__x` 结尾的)根本就不支持 schema 导入,只能用字符串。还有知识库对象 `Knowledge__kav`,你要用字段的时候也必须用字符串语法,不能从 schema 导入。这些特殊情况最好记一下,免得写出来报错。
总结一下,Wire 服务很好用,但要注意配置对象别传 undefined,字段尽量用 schema 导入,关系别超三级,复合字段读写有区别,特殊对象用字符串。这些点掌握了,你写数据相关的组件会顺手很多。那这节课就到这里,我们下次见。
关键词
LWC
Lightning Web Components
Salesforce