本篇参看:

https://developer.salesforce.com/docs/component-library/bundle/lightning-datatable/documentation

https://www.lightningdesignsystem.com/components/data-tables/

我们在salesforce中,经常会使用 listview,标准的 lightning listview会有排序,filter展示chart等等标准功能。当然,某些情况标准搞定不了情况下,我们便需要使用自定义的开发。自定义开发我们就可以使用 lightning-datatable组件。一个 lightning-datatable组件用来展示表格数据,它可以根据数据类型展示每一列。比如一个 email类型的字段会展示一个点开以后是一个 mail:to的超链接。默认展示的类型是text类型。那 lightning-datatable有哪些特性呢?

  • 展示和格式化焗油适当类型的列
  • 具有无限滚动行功能
  • 指定的数据类型允许 inline编辑
  • 可以定义header的action
  • 可以定义行级别的action
  • 重置每一列展示的大小
  • 选择行操作
  • 指定的列通过升序或者降序排列
  • 文字换行和剪切
  • 对行进行编号
  • 设置单元格对齐方式

lightning-datatable有很多属性,其他的请自行查看文档,这里只例举几个核心属性或者方法。比较核心的如下:

  • columns:一组列的object用来定义数据类型,这个object有很多的属性,其中有几个必填的配置: label & fieldName & type。分别对应着字段的展示名称,字段的API name以及字段的类型,不同的字段类型将会自动的转换成不同的展示形式,默认是text。其他的属性我们后期会有简单介绍。
  • data:一组数据用来展示,通常 comulns设置表单的头以及每个单元列的类型,data设置内容;
  • hide-checkbox-column:标签用来设定是否展示左侧的checkbox,值为true/false,true即隐藏checkbox;
  • selected-rows:用来初始化时展示哪些行是被选中的;
  • key-field:用来指定每行的unique id;
  • getSelectedRows:这个是lightning-datatable提供的方法,用来获取哪些行用户选中的。

简单介绍完毕,下面通过几点来慢慢带入datatable的功能。

一. 基础 Datatable展示数据

demo中展示,我们来看官方提供的一个demo。

dataTableExample1.html:用来展示一个 datatable,我们看到属性中的data / columns / key-field都是上面描述过的, onrowselection方法为当有行选择的时候的调用

<template>
<lightning-datatable
data={data}
columns={columns}
key-field="id"
onrowselection={getSelectedName}>
</lightning-datatable>
</template>

dataTableExample1.js:有两种方式可以获取选择的行信息,demo中有两个。datatable有一个标准事件rowselection,调用以后可以通过event.detail.

selectedRows获取选中的行的信息,另外一种就是找到datatable然后调用其getSelectedRows方法。

除此之外,我们看到columns的设置方式,除了 label / fieldName / type这三个基础信息以外,还可以看到有 typeAttributes 以及 cellAttributes两种设置。

  • typeAttributes:用于对指定的列的类型格式化dataCell,不同的type可能拥有不同的设置。salesforce针对不同的type可以设置不同的 typeAttributes,这里不再详细展开,具体查看文档;
  • cellAttributes:typeAttributes用于设置针对 type的格式化,cellAttributes通常用于列中附加图标信息,设置图标位置等信息。
import { LightningElement } from 'lwc';

const columns = [
{label: 'Opportunity name', fieldName: 'opportunityName', type: 'text'},
{label: 'Confidence', fieldName: 'confidence', type: 'percent', cellAttributes:{ iconName: { fieldName: 'trendIcon' }, iconPosition: 'right' }},
{label: 'Amount', fieldName: 'amount', type: 'currency', typeAttributes: { currencyCode: 'EUR'}},
{label: 'Contact Email', fieldName: 'contact', type: 'email'},
{label: 'Contact Phone', fieldName: 'phone', type: 'phone'},
]; const data = [{
id: 'a',
opportunityName: 'Cloudhub',
confidence: 0.2,
amount: 25000,
contact: 'jrogers@cloudhub.com',
phone: '2352235235',
trendIcon: 'utility:down'
},
{
id: 'b',
opportunityName: 'Quip',
confidence: 0.78,
amount: 740000,
contact: 'quipy@quip.com',
phone: '2352235235',
trendIcon: 'utility:up'
}]; export default class DatatableExample1 extends LightningElement {
data = data;
columns = columns; getSelectedName(event) {
//两种方式获取选中的行,第一种是使用 event.detail.selectedRows,另外一种是使用querySelector找到 lightning-datatable,然后使用datatable封装的方法
//const selectedRows = event.detail.selectedRows;
const dataTable = this.template.querySelector('lightning-datatable');
const selectedRows = dataTable.getSelectedRows();
// Display that fieldName of the selected rows
for (let i = 0; i < selectedRows.length; i++){
console.log("You selected: " + selectedRows[i].opportunityName);
}
}
}

简单展示效果如下:

二. datatable中展示父表中的字段值

上个demo中简单介绍了datatable的使用,数据全是写死的demo,接下来通过一个包含后台的逻辑进行datatable展示数据。

DataTableExampleController:用于获取 Case表中的相关字段以及其父表的字段

public with sharing class DataTableExampleController {
@AuraEnabled(cacheable=true)
public static List<Case> getCaseList(){
List<Case> caseList = [SELECT Id,CaseNumber,Account.Name,
Priority,Status
FROM Case
LIMIT 100];
return caseList;
}
}

datatableExample2.js:用于展示相关的字段,通过wire adapter获取后台数据放在data中

import { LightningElement, track, wire } from 'lwc';
import getCaseList from '@salesforce/apex/DataTableExampleController.getCaseList';
const COLUMNS = [
{label: 'Case Number', fieldName: 'CaseNumber', type: 'text'},
{label: 'Account Name', fieldName: 'Account.Name', type: 'text'},
{label: 'Priority', fieldName: 'Priority', type: 'text'},
{label: 'Status', fieldName: 'Status', type: 'text'}
];
export default class DataTableExample2 extends LightningElement {
columns = COLUMNS;
@track datas; @wire(getCaseList)
wiredCaseList({ error, data }) {
if(data) {
this.datas = data;
} else if(error) {
//TODO
console.log(JSON.stringify(error));
}
}
}

dataTableExample.html:展示datatable

<template>
<lightning-datatable
data={datas}
columns={columns}
key-field="id"
>
</lightning-datatable>
</template>

结果展示:通过下图我们可以看到,其他的字段可以正常展示,但是父表的数据获取确实失败的。

来剖析一下原因,datatable针对columns的fieldName只支持一级结构的获取,针对获取父的方式没法通过 各种点的方式获取到,那么如何获取呢,查看下面的方式,我们对js的代码进行一下改动。按照下面的步骤两步走的修改。

结果展示:我们可以看到 Account Name列的值也顺利的展示出来了,按照这种操作做一个拓展,其实我们也可以去做一些字段间的逻辑操作拼出一个符合我们逻辑的列,不仅仅局限于获取父的对象值这种简单操作。

 三. 实现datatable展示 formula类型是图片的功能

自己看文档的小伙伴可能发现datatable的columns的type没有类似 image类型,但是在object field创建时我们很容易创建一些IMAGE的字段,那样的话使用标准的datatable便无法展示,那要如何操作呢?还好lwc提供了一个自定义类型的操作。首先我们在Case表里面新增一个formula 字段,展示图片。

接下来一步接着一步搞定。

dataTableWithImage.js:这里需要继承 LightningDatatable,并且引入 imageRow.html,其用于做template

import LightningDatatable from 'lightning/datatable';
import imageRow from './imageRow.html';
export default class DataTableWithImage extends LightningDatatable {
static customTypes = {
image: {
template: imageRow
}
};
}

imageRow.html:默认要求 imageRow需要和 dataTableWithImage在同一个目录下,如果不在一个目录,需要改上面的文件目录信息。

<template>
<c-data-table-image-template
url={value}
>
</c-data-table-image-template>
</template>

dataTableImageTemplate.html:用来通过 img标签展示图片

<template>
<img src={url} class="image"/>
</template>

dataTableImageTemplate.css:用来设置图片大小的初始值,这种是一种偷懒的方式,正常应该通过 attribute注入进来指定大小的宽和高。

.image {
height: 30px;
width: 30px;
}

dataTableImageTemplate.js

import { LightningElement,api } from 'lwc';

export default class DataTableImageTemplate extends LightningElement {
@api url;
}

OK,通过上面的这些步骤我们实现和继承了自定义的datatable组件。接下来是调用操作。我们在class里面搜索一下Priority_Image__c这个字段,apexClass这里不再写。

dataTableExample3.js:这里有几个关键点。

  • 设置 type为 image类型,image类型是我们上文自定义创建的
  • 对 formula类型进行解析,找到他的src部分。比如针对<img src="/resource/priority/priority/medium.png" alt="Priority Flag" border="0"/>这个字符串,我们需要的是/resource/priority/priority/medium.png这个字符串
import { LightningElement, track, wire } from 'lwc';
import getCaseList from '@salesforce/apex/DataTableExampleController.getCaseList'; const COLUMNS = [
{label: 'Case Number', fieldName: 'CaseNumber', type: 'text'},
{label: 'Account Name', fieldName: 'AccountName', type: 'text'},
{label: 'Priority', fieldName: 'Priority', type: 'text'},
{ label: 'Priority Image',fieldName:'Priority_Image__c',type: 'image' },
{label: 'Status', fieldName: 'Status', type: 'text'}
];
export default class DataTableExample3 extends LightningElement {
columns = COLUMNS;
@track datas; @wire(getCaseList)
wiredCaseList({ error, data }) {
if(data) {
//this.datas = data;
let resultList = [];
let objectTemp;
data.forEach(item => {
objectTemp = Object.assign({},item);
if(item.Account) {
objectTemp.AccountName = item.Account.Name;
} const srcIndex = objectTemp.Priority_Image__c.indexOf('src=');
if(srcIndex !== -1) {
const imgSrcSubstring = objectTemp.Priority_Image__c.substring(srcIndex + 5);
objectTemp.Priority_Image__c = imgSrcSubstring.substring(0,imgSrcSubstring.indexOf('"'))
}
console.log(JSON.stringify(objectTemp));
resultList.push(objectTemp);
});
this.datas = resultList;
} else if(error) {
//TODO
console.log(JSON.stringify(error));
}
}
}

结果展示:针对不同的Priority展示其对应的formula的图片。

总结:篇中讲了datatable的简单的应用以及相应的扩展,datatable很强悍,这里不逐点讲述,感兴趣的可以自行查看 inline edit,action等操作。篇中有错误地方欢迎指出,有不懂的欢迎留言。

后记:工作原因这篇博客准备了好久才成型,不知不觉学了半年的lwc的开发,也整理总结了一些博客供自己和他人学习。前半年的主旋律大部分时间都在学习lwc,后半年的时间大部分会放在考证和学习其他技术,不出意外应该是今年的最后一篇lwc的博文。有其他lwc的问题欢迎留言探讨,希望各位salesforce开发者可以养成独立思考的能力,先思考,在查,最后再问。加油!

Salesforce LWC学习(十八) datatable展示 image的更多相关文章

  1. Salesforce LWC学习(十五) Async 以及 Picklist 公用方法的实现

    本篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) https://developer.salesfo ...

  2. Salesforce LWC学习(十六) Validity 在form中的使用浅谈

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/lightning-input/documentation h ...

  3. Salesforce LWC学习(十) 前端处理之 list 处理

    本篇参看:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array list是我们经 ...

  4. Salesforce LWC学习(十四) Continuation进行异步callout获取数据

    本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.apex_continua ...

  5. Salesforce LWC学习(十九) 针对 lightning-input-field的label值重写

    本篇参考: https://salesforcediaries.com/2020/02/24/how-to-override-lightning-input-field-label-in-lightn ...

  6. Salesforce LWC学习(三十) lwc superbadge项目实现

    本篇参考:https://trailhead.salesforce.com/content/learn/superbadges/superbadge_lwc_specialist 我们做lwc的学习时 ...

  7. Salesforce LWC学习(三十九) lwc下quick action的recordId的问题和解决方案

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/force:hasRecordId/documentation ...

  8. Salesforce LWC学习(四十) dynamic interaction 浅入浅出

    本篇参考: Configure a Component for Dynamic Interactions in the Lightning App Builder - Salesforce Light ...

  9. Salesforce LWC学习(十七) 前端知识之 onclick & onblur & onmousedown

    在Salesforce LWC学习(八) Look Up组件实现篇中,我们实现了公用的lookup组件,使用的过程中,会发现当我们输入内容以后,搜索出来的列表便无法被清空. 针对此种情况我们打算优化一 ...

随机推荐

  1. jQuery-操作元素的内容,属性,样式

    1.操作内容 获取: 双标签:html() input:val() 设置: 双标签:html('新内容') input:val('新内容') 2.操作属性 * 获取:attr('属性名') * 设置: ...

  2. Chisel3 - Tutorial - VendingMachine

    https://mp.weixin.qq.com/s/tDpUe9yhwC-2c1VqisFzMw   演示如何使用状态机.   参考链接: https://github.com/ucb-bar/ch ...

  3. 面试问题---JAVA程序CPU占用过高怎么定位

    今天一个电话面试问了这个问题.回来查了下答案,自己也顺带操作一遍,做个记录.之前知道jstack工具可以查看线状态这些.比如死锁这些,主要是之前不知道top -H -p pid这个命令的使用,这命令可 ...

  4. 高性能可扩展mysql 笔记(六) SQL执行计划及分页查询优化、分区键统计

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 常见业务处理 一.使用数据库处理常见业务: 案例: 如何对评论进行分页展示 使用 EXPLAIN 获得s ...

  5. 第八届蓝桥杯JavaA组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.迷宫 题目描述 X星球的一处迷宫游乐场建在某个小山坡上. 它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母. ...

  6. java中装箱和拆箱的详细使用(详解)

    一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Jav ...

  7. java实现整数翻转

    ** 整数翻转** 以下程序把一个整数翻转(8765变为:5678),请补充缺少的代码. int n = 8765; int m = 0; while(n>0) { m = __________ ...

  8. java实现第七届蓝桥杯棋子换位

    棋子换位 棋子换位 有n个棋子A,n个棋子B,在棋盘上排成一行. 它们中间隔着一个空位,用"."表示,比如: AAA.BBB 现在需要所有的A棋子和B棋子交换位置. 移动棋子的规则 ...

  9. OpenJudge - 2977:生理周期

    原题链接 总时间限制: 1000ms 内存限制: 65536kB 描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天 ...

  10. 给女朋友讲解什么是Git

    前言 在周六发现了Linus去Google演讲的一个视频,当时还发了一条朋友圈: 有兴趣的同学也可以去看看,一点儿也不无聊,在线看Linus大佬怼人 https://www.bilibili.com/ ...