Salesforce LWC学习(四十六) record-picker组件浅谈
本篇参考:
https://developer.salesforce.com/docs/platform/lwc/guide/reference-graphql.html
https://developer.salesforce.com/docs/platform/lwc/guide/reference-refreshgraphql.html
https://developer.salesforce.com/docs/platform/graphql/guide/graphql-wire-lwc.html
https://developer.salesforce.com/docs/component-library/bundle/lightning-record-picker/documentation
背景:想象一下我们以前做项目如果需要一个搜索功能的时候,比如搜索Account列表数据,查询条件可以基于Owner或者某个自定义的lookup字段进行查询时,我们通常要如何设计?
- 创建custom lookup component来支持;
- 通过 lightning-record-edit-form搭配 lightning-input-field,input-field字段绑定着lookup字段来实现。
先不评论方案的好坏,这两种都需要花费不少的时间以及考虑不同的点,可扩展性达不到保证。 除此以外,有时还需要考虑其他的问题,比如通过哪个字段进行搜索,显示哪个字段,UI效果稳定性等等。现在我们就不用有这样的顾虑了,因为 lightning-record-picker来了。
一. lightning-record-picker
lightning-record-picker组件允许你基于输入的内容返回所对应的数据列表并且直接进行渲染,使用 GraphQL wire adapter来进行数据搜索,数据显示以及数据选择一条以后的信息获取。 至于GraphQL是什么,我们后续再说。
我们先看一下 lightning-record-picker的最简单的一个例子,只需要html的代码,js不需要任何内容。
<template>
<lightning-record-picker
label="Accounts"
placeholder="Search Accounts..."
object-api-name="Account">
</lightning-record-picker>
</template>
效果显示:这个UI效果,如果做过 custom lookup组件的小伙伴应该很熟悉,除的位置不同以外,其他的效果基本一致。

lightning-record-picker除这个最基础的以外,还支持哪些扩展呢?
1. Filter: 就像lookup字段支持 Lookup Filter一样,我们在使用搜索功能时,有时希望加一些前置的过滤条件,从而初始时就过滤掉我们不需要的数据。lightning-record-picker也支持filter功能而且用法很简单。我们对上面的代码进行一下改造
recordPickerSample.html:增加了filter属性
<template>
<lightning-record-picker
label="Accounts"
placeholder="Search Accounts..."
filter={filter}
object-api-name="Account">
</lightning-record-picker>
</template>
recordPickerSample.js: 增加了filter变量,我们可以看到结构体主要两部分:
- criteria: 用于指定我们的过滤的条件,包含三部分,并且这三部分都是必填内容:
- fieldPath: object api name
- operator: 操作符
- value: 过滤字段的值
- filterLogic:可选项,如果不包含这个值,默认所有的条件是AND,如果需要自定义,则添加这个值。
注:官方文档中这里的代码写的是错误的,如果直接复制粘贴无法运行,因为filterLogic位置不正确。
import { LightningElement, track, wire } from 'lwc';
export default class recordPickerSample extends LightningElement {
filter = {
criteria: [
{
fieldPath: 'AccountSource',
operator: 'ne',
value: 'Other'
},
{
fieldPath: 'Type',
operator: 'eq',
value: 'Prospect'
}
],
filterLogic: '1 OR 2',
}
}
上面的代码主要实现的是搜索记录时,要求记录还需要满足 AccountSource不等于Other或者Type等于Prospect。除此以外,我们看到operator的值有点怪,ne和eq,这些代表什么呢?
| Function | Description |
| eq | Equals。 |
| ne | Not Equals. |
| lt | less than。 |
| gt | great than。 |
| lte | Less than or equal |
| gte | Greater than or equal |
| like | 和soql中的用法相同 |
| in | 和soql中的IN用法相同 |
| nin | 和soql中的Not IN用法相同 |
| inq | 元素在一个query集中,和soql的 in子查询相同 |
| ninq | 元素不在一个query集中,和soql的not in 子查询相同 |
| includes | multi picklist包含某个值 |
| excludes | multi picklist不包含某个值 |
2. Display: 默认我们会显示搜索的Name字段的值,如果我们需要显示其他的值,我们可以通过display-info属性来实现。目前additional fields 只支持1个,即列表最多只允许显示两个字段。我们将上面的代码进行增强。
recordPickerSample.html:增加 display-info属性
<template>
<lightning-record-picker
label="Accounts"
placeholder="Search Accounts..."
filter={filter}
display-info={displayInfo}
object-api-name="Account">
</lightning-record-picker>
</template>
recordPickerSample.js:声明变量,变量使用 additionalFields。
import { LightningElement, track, wire } from 'lwc';
export default class recordPickerSample extends LightningElement {
filter = {
criteria: [
{
fieldPath: 'AccountSource',
operator: 'ne',
value: 'Other'
},
{
fieldPath: 'Type',
operator: 'eq',
value: 'Prospect'
}
],
filterLogic: '1 OR 2',
}
displayInfo = {
additionalFields: ['Owner.Name']
}
}
效果显示:

<template>
<lightning-record-picker
label="Accounts"
placeholder="Search Accounts..."
filter={filter}
display-info={displayInfo}
matching-info={matchingInfo}
object-api-name="Account">
</lightning-record-picker>
</template>
recordPickerSample.js: matchingInfo属性可以设置两个信息: primaryField以及additionalFields参数。尽管additionalFields参数传递是数组,但是目前仍然最多也只允许1个值。
import { LightningElement, track, wire } from 'lwc';
export default class recordPickerSample extends LightningElement {
filter = {
criteria: [
{
fieldPath: 'AccountSource',
operator: 'ne',
value: 'Other'
},
{
fieldPath: 'Type',
operator: 'eq',
value: 'Prospect'
}
],
filterLogic: '1 OR 2',
}
displayInfo = {
additionalFields: ['Phone']
}
matchingInfo = {
primaryField: { fieldPath: 'Name' },
additionalFields: [ { fieldPath: 'Phone' } ]
}
}
效果显示:demo中通过Phone的信息也可以搜索出想要的信息

4. 事件: 组件封装了几个标准行为的事件,其他的小伙伴自行查看,这里只介绍 change事件,handler用于返回所选中的recordId信息。demo会和下面的一起介绍。
二. lightning-record-picker实现WhatId等多选择的效果
<template>
<div class="slds-form-element">
<label class="slds-form-element__label">Select a record</label>
<div class="slds-form-element__control slds-combobox-group">
<lightning-combobox
label="Select Object"
variant="label-hidden"
options={objNametList}
value={selectedObject}
onchange={handleTargetSelection}
>
</lightning-combobox>
<lightning-record-picker
object-api-name={selectedObject}
placeholder="Search..."
label="Select a record"
variant="label-hidden"
onchange={handleRecordSelect}
class="slds-size_full slds-combobox-addon_end"
>
</lightning-record-picker>
</div>
</div>
</template>
dynamicRecordPickerSample.js
import { LightningElement } from 'lwc';
export default class dynamicRecordPickerSample extends LightningElement {
objNametList = [
{label: 'Account',value: 'Account'},
{label: 'Contact',value: 'Contact'},
{label: 'Opportunity',value: 'Opportunity'},
{label: 'Case',value: 'Case'}
];
selectedObject = 'Account';
currentSelectedRecordId;
handleObjectChange(event) {
this.selectedObject = event.target.value;
}
handleRecordSelect(event) {
this.currentSelectedRecordId = event.detail.recordId;
console.log('*** this.currentSelectedRecordId : ' + this.currentSelectedRecordId);
}
}
效果显示:

总结: 篇中主要介绍了lightning-record-picker的使用,record-picker基于GraphQL的wire adapter来实现,后续的篇章中有机会也会讲一下GraphQL Wire Adapter等相关知识。官方文档中有一些错误,导致复制粘贴无法运行,不要怀疑自己,修改以后重新尝试。篇中有错误地方欢迎指出,有不懂欢迎留言。
Salesforce LWC学习(四十六) record-picker组件浅谈的更多相关文章
- Salesforce LWC学习(四十) dynamic interaction 浅入浅出
本篇参考: Configure a Component for Dynamic Interactions in the Lightning App Builder - Salesforce Light ...
- Salesforce LWC学习(四十二) getRecordNotifyChange已弃用
本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_get ...
- Salesforce LWC学习(三十六) Quick Action 支持选择 LWC了
本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.use_quick_act ...
- Salesforce LWC学习(二十六) 简单知识总结篇三
首先本篇感谢长源edward老哥的大力帮助. 背景:我们在前端开发的时候,经常会用到输入框,并且对这个输入框设置 required或者其他的验证,当不满足条件时使用自定义的UI或者使用标准的 inpu ...
- Salesforce LWC学习(四十) datatable的dynamic action的小坑浅谈
本篇参考:https://developer.salesforce.com/docs/component-library/bundle/lightning-datatable/documentatio ...
- Salesforce LWC学习(三十九) lwc下quick action的recordId的问题和解决方案
本篇参考: https://developer.salesforce.com/docs/component-library/bundle/force:hasRecordId/documentation ...
- Salesforce LWC学习(三十) lwc superbadge项目实现
本篇参考:https://trailhead.salesforce.com/content/learn/superbadges/superbadge_lwc_specialist 我们做lwc的学习时 ...
- Salesforce LWC学习(四) 父子component交互 / component声明周期管理 / 事件处理
我们在上篇介绍了 @track / @api的区别.在父子 component中,针对api类型的变量,如果声明以后就只允许在parent修改,son component修改便会导致报错. sonIt ...
- Java开发学习(四十六)----MyBatisPlus新增语句之id生成策略控制及其简化配置
在前面有一篇博客:Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发,我们在新增的时候留了一个问题,就是新增成功后,主键ID是一个很长串的内容. 我们更想要的是按照 ...
- Salesforce LWC学习(二十四) Array.sort 浅谈
本篇参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort sal ...
随机推荐
- 编译nw-node版本的插件
编译nw-node版本的插件 下载nwjs对应版本的nodejs 原始源码目录 yh@yh:~/addon$ tree . ├── addon.cc ├── binding.gyp ├── CppLi ...
- SQL函数count(),sum()理解
①准备-创建测试表: create table test ( id SMALLINT, name varchar(10) ); 插入数据: insert into test values(0,'张三' ...
- Openssl Des3对压缩文件进行加密命令详解
群友提问: 致力于明天: tar -cvf - WMG_Back_"$Today"|openssl des3 -salt -k hY91gd3GJAAfghECleLwWQAPGK ...
- MySQL误删恢复方法1
MySQL不同于oracle,没有闪回查询这类概念,但网上流传几个闪回的开源工具如 binglog2sql.MyFlash,可以使用binglog日志进行误操作数据的恢复. 笔者以前测试过 bingl ...
- VTable——不只是高性能的多维数据分析表格
导读 VTable: 不只是高性能的多维数据分析表格,更是行列间创作的方格艺术家! VTable是字节跳动开源可视化解决方案 VisActor 的组件之一. 在现代应用程序中,表格组件是不可或缺的一部 ...
- 2020 5 17 codeforces
cf还没结束,就开始写总结了.cf确实是个好东西,能够直接暴露出弱点和增加刷题量.以后还是要多打打的.这次我发现自己的码力还是不行.一个二分都要调好久.唉T1sb题,就是入门用的.题目看不懂...写了 ...
- Dotnet工具箱:开源、免费的纯前端工具网站,带你探索10大工具分类和73个实时在线小工具
1. 前言 大家好,我是沙漠尽头的狼. Dotnet工具箱是一个纯前端的.开源和免费的工具网站,周末我参考了开源项目it-tools,对网站界面文字进行了汉化,并重新部署了网站.该网站共有10大工具分 ...
- 谈谈selenium4.0中的相对定位
相对定位历史 2021-10-13 发布的 selenium 4.0 开始引入,selenium 3.X是没有的 implement relative locator for find_element ...
- 2022/7/26 暑期集训 pj组第6次%你赛
个人第3次 又是下午打,旁边那帮 不知好歹的 入门组小孩们又在吵吵... T1 老师是不是放反了? T1 是蓝题诶 理所应当地 跳过 然后就忘了写了,连样例也没打...样例可是有7分诶! 到现在也没写 ...
- P4156 [WC2016]论战捆竹竿 题解
题目链接 题意描述 给定一个字符串 \(s\),你初始拥有一个空串 \(t\),每次可以选择这个字符串的一个 Border,去掉它后接在 \(t\) 的后面,操作后 \(s\) 不变,给出一个上限 \ ...