Ant Design的Table组件去除


Posted in Javascript onOctober 24, 2020

在Ant Design的Table组件文档中,排序有三种状态:点击升序、点击降序、取消排序。一般需求只需要升序和降序,不需要取消排序,这时候就需要我们设置sortOrder来去除取消排序。

首先,我们从官方文档中ctrl+c出一个排序栗子,放在我们的组件中。

官方栗子

import React, { useEffect, useState } from 'react';
import { Table } from 'antd'

export default () => {
 const [data, setData] = useState([
 {
 key: '1',
 name: 'John Brown',
 age: 32,
 address: 'New York No. 1 Lake Park',
 },
 {
 key: '2',
 name: 'Jim Green',
 age: 42,
 address: 'London No. 1 Lake Park',
 },
 {
 key: '3',
 name: 'Joe Black',
 age: 30,
 address: 'Sidney No. 1 Lake Park',
 },
 {
 key: '4',
 name: 'Jim Red',
 age: 25,
 address: 'London No. 2 Lake Park',
 },
 ]
 )
 const columns: any = [
 {
 title: 'Name',
 dataIndex: 'name',
 key: 'name',
 },
 {
 title: 'Age',
 dataIndex: 'age',
 key: 'age',
 sorter: (a: any, b: any) => a.age - b.age,
 },
 {
 title: 'Address',
 dataIndex: 'address',
 key: 'address',
 },
 ]

 const onChange = (pagination: any, filters: any, sorter: any, extra: any) => {
 //pagination分页、filters筛选、sorter排序变化时触发。extra:当前的data
 console.log(sorter)
 }
 return (
 <div>
 <Table columns={columns} dataSource={data} onChange={onChange} />
 </div>
 );
}

当我们点击排序时,会触发onChange事件,打印出的sorter如下:

Ant Design的Table组件去除

其中,sorter.order为排序状态。undefined:取消排序,ascend:升序,descend:降序。

如何去除取消排序呢?在官方提供的API中,有sortOrder和sortDirections这两个参数,

sortOrder:排序的受控属性,外界可用此控制列的排序,可设置为ascend、descend、false。

 

sortDirections:支持的排序方式,覆盖Table中sortDirections, 取值为 ascend 、descend。

下面我们就来开始实现去除取消排序。

一、设置sortOrder

首先我们需要声明一个变量sortOrderTest,默认为descend

const [sortOrderTest, setSortOrderTest] = useState<string>('descend')

然后给colum中的排序项Age设置sortOrder

{
 title: 'Age',
 dataIndex: 'age',
 sortOrder: sortOrderTest,
 sorter: (a: any, b: any) => a.age - b.age,
},

设置完成之后,每次点击排序,发现console输出的一直都是undefined,这是因为我们默认为descend,下一个状态为取消排序,而我们没有去更改sorter状态导致的。所以每次当我们onChange的时候,都要去改变一下设置的变量sortOrderTest

 const onChange = (pagination: any, filters: any, sorter: any, extra: any) => {
 setSortOrderTest(sorter.order || 'descend')
 }

只改变sortOrderTest依然是不够的,这时再进行我们的第二步设置。

二、设置sortDirections

{
 title: 'Age',
 dataIndex: 'age',
 key: 'age',
 sortOrder: sortOrderTest,
 sortDirections: ['descend', 'ascend'],
 sorter: (a: any, b: any) => a.age - b.age,
 }

这样设置完成之后,Table就去除了取消排序,只剩下升序和降序了。

三、优化

去除取消排序后,表头显示下一次排序的 tooltip 提示一直是点击升序、取消排序循环展示。取消排序其实就是降序,但是不够直观,目前菜菜的我尚未找到如何设置,暂时将tootip关闭。如果你有方法,也可以在评论中告诉我^_^ ,后续我找到方法也会更新哦。要将tootip关闭,showSorterTooltip设置为false即可,具体设置如下:

{
 title: 'Age',
 dataIndex: 'age',
 key: 'age',
 sortOrder: sortOrderTest,
 sortDirections: ['descend', 'ascend'],
 showSorterTooltip:false,
 sorter: (a: any, b: any) => a.age - b.age,
 }

项目中的排序一般是通过接口来排序的,要根据sorter来传不同的参数获取结果,这时候就可以用useEffect来处理。

首先,我们需要将更改column中的sorter,将其置为true。

{
 title: 'Age',
 dataIndex: 'age',
 key: 'age',
 sortOrder: sortOrderTest,
 sortDirections: ['descend', 'ascend'],
 showSorterTooltip: false,
 sorter: true,
 }

然后我们写一个请求函数

const getList = () => {
 let data = {
 sort: sortOrderTest
 }
 console.log(data)
 //根据参数去发送请求
 //await。。。。
 //请求成功之后设置data,达成排序
 //setData(result)
}

最后,将这个函数放到useEffect中,每当sorter改变的时候,就会自动触发该函数。

useEffect(() => {
 getList()
}, [sortOrderTest])

四、完整代码

import React, { useEffect, useState } from 'react';
import { Table } from 'antd'

export default () => {
 const [sortOrderTest, setSortOrderTest] = useState<string>('descend');
 const [data, setData] = useState([
 {
 key: '1',
 name: 'John Brown',
 age: 32,
 address: 'New York No. 1 Lake Park',
 },
 {
 key: '2',
 name: 'Jim Green',
 age: 42,
 address: 'London No. 1 Lake Park',
 },
 {
 key: '3',
 name: 'Joe Black',
 age: 30,
 address: 'Sidney No. 1 Lake Park',
 },
 {
 key: '4',
 name: 'Jim Red',
 age: 25,
 address: 'London No. 2 Lake Park',
 },
 ]
 )
 useEffect(() => {
 getList()
 }, [sortOrderTest])
 const getList = () => {
 let data = {
 sort: sortOrderTest
 }
 console.log(data)
 //根据参数去发送请求
 //await。。。。
 //请求成功之后设置data,达成排序
 //setData(result)
 }
 const onChange = (pagination: any, filters: any, sorter: any, extra: any) => {
 setSortOrderTest(sorter.order || 'descend')
 }
 const columns: any = [
 {
 title: 'Name',
 dataIndex: 'name',
 key: 'name',
 },
 {
 title: 'Age',
 dataIndex: 'age',
 key: 'age',
 sortOrder: sortOrderTest,
 sortDirections: ['descend', 'ascend'],
 showSorterTooltip: false,
 sorter: true,
 },
 {
 title: 'Address',
 dataIndex: 'address',
 key: 'address',
 },
 ]
 return (
 <div>
 <Table columns={columns} dataSource={data} onChange={onChange} />
 </div>
 );
}

补充知识:使用Ant Design的Upload上传删除预览照片,以及上传图片状态一直处于uploading的解决方法。

一、界面构建

1、创建index父组件

import React from "react";
import { Form } from "antd";
import UploadComponent from "./UploadComponent";
export default () => {
 const [form] = Form.useForm();
 return (
 <Form
 form={form}
 initialValues={
 {
  'uploadPhoto': []
 }
 }
 >
 <Form.Item name="uploadPhoto">
 <UploadComponent />
 </Form.Item>
 </Form>
 );
};

2、创建UploadComponent子组件

import React, { useState, useEffect } from "react";
import { Upload } from 'antd';
import { PlusOutlined } from "@ant-design/icons";
export default (props: any) => {
 console.log(props)
 const [fileList, setFileList] = useState<any>([]) //展示默认值
 const handleChange = ({ file, fileList }: any) => {};
 const uploadButton = (
 <div>
 <PlusOutlined />
 <div className="ant-upload-text">Upload</div>
 </div>
 );
 return (
 <Upload
 listType="picture-card"
 fileList={fileList}
 onChange={handleChange}
 action={'这里是你上传图片的地址'}
 >
 {fileList.length >= 8 ? null : uploadButton}
 </Upload>
 );
};

这样一个简单界面就构造完成了,通过打印子组件的props,我们可以看到,父组件给子组件通过prop传递了一个对象,该对象中有value:子组件的默认值,id:FormItem的name,onChange:onChange事件

注:

1、Form表单以及Upload请参考Ant Design官方文档

2、因后台返回数据格式不同,所以fileList的设置也不同,本文仅供参考。

3、本文后台返回的数据格式为:[{id:id1,imgUrl:imgUrl1},...],上传图片成功后,返回的也是一个key值,string类型,比如:qwertyuidsa151sad

二、设置upload的fileList

上传图片后,下次再进入该页面时,Form就会有initialValues默认值,此时upload就要展示默认值中的图片。

fileList是一个数组,数组中是n个对象,每个对象都包含uid:上传图片的id,name:上传图片的名字,status:上传图片的状态,url:图片路径。想展示图片就必须要设置uid,status,url。也可以在该对象中增加自己所需要。

当子组件的props.value变化时,就需要更新fileList,使用useEffect即可。具体代码如下

useEffect(() => {
 if (props.value) {
 let newFileList = props.value.map((item: any) => {
 return {
  uid: item.id || item.uid,

//存在id时,使用默认的id,没有就使用上传图片后自动生成的uid
  status: 'done',





//将状态设置为done

  url: 'https://image/'+item.imgUrl,
//这里是展示图片的url,根据情况配置
  imgUrl: item.imgUrl,
//添加了一个imgUrl,保存Form时,向后台提交的imgUrl,一个key值
 }
 })
 setFileList(newFileList)
 }
 }, [props])

三、触发父组件传递的onChange

当子组件每次上传图片或者删除图片时,都需要触发父组件的Onchange事件,来改变Form表单的值。自定义一个triggerChange函数,上传成功或者删除图片时,通过triggerChange来触发onChange。

const triggerChange = (value: any) => {
 const onChange = props.onChange;
 if (onChange) {
 onChange(value); //将改变的值传给父组件
 }
 };

四、file常用的status

1、uploading:上传中

2、done:上传成功

3、error:上传错误

4、removed:删除图片

五、上传图片

上传图片时,触发Upload的onChange事件

const handleChange = ({ file, fileList }: any) => {
//file:当前上传的文件

//通过map将需要的imgUrl和id添加到file中
 fileList = fileList.map((file: any) => {
 if (file.response) {
  file.id = file.uid;
  file.imgUrl = file.response.data.key
//请求之后返回的key
 }
 return file;
 });
 if (file.status !== undefined) {
 if (file.status === 'done') {
 console.log('上传成功')
 triggerChange(fileList);
 } else if (file.status === 'error') {
 console.log('上传失败')
 }
 }
 }

这样之后,会发现上传图片的状态一直是uploading状态,这是因为上传图片的onChange只触发了一次。

解决方法:在onChange中始终setFileList,保证所有状态同步到 Upload 内

const handleChange = ({ file, fileList }: any) => {
 //...上一段代码
 //最外层一直设置fileLsit
 setFileList([...fileList]);
 }

这样就可以正常上传图片了。

六、删除图片

删除图片时,file的status为removed。具体代码如下

const handleChange = ({ file, fileList }: any) => {
 //...代码 
 
else if (file.status === 'removed') {
 if (typeof file.uid === 'number') {
  //请求接口,删除已经保存过的图片,并且成功之后triggerChange
  triggerChange(fileList);
 } else {
  //只是上传到了服务器,并没有保存,直接riggerChange
  triggerChange(fileList);
 }
 }

//...代码
}

七、预览图片

1、Upload添加onPreview

<Upload
 onPreview={handlePreview}
 >
</Upload>

2、增加Modal

<Modal
 visible={previewVisible}
 title='预览照片'
 footer={null}
 onCancel={() => setPreviewVisible(false)}
>
 <img alt="example" style={{ width: '100%' }} src={previewImage} />
</Modal>

3、添加previewVisible以及previewImage

const [previewVisible, setPreviewVisible] = useState<boolean>(false);

const [previewImage, setPreviewImage] = useState<string>('');

4、添加handlePreview函数

const handlePreview = async (file: any) => {
 setPreviewImage(file.imgUrl); //这个图片路径根据自己的情况而定
 setPreviewVisible(true);
 };

这样,图片的上传,删除,预览功能都已经实现了。

八、完整代码

1、index完整代码

index.tsx

import React from "react";
import { Form } from "antd";
import UploadComponent from "./UploadComponent";
export default () => {
 const [form] = Form.useForm();
 return (
 <Form
 form={form}
 initialValues={
 {
  'uploadPhoto': []
 }
 }
 >
 <Form.Item name="uploadPhoto">
 <UploadComponent />
 </Form.Item>
 </Form>
 );
};

2、UploadComponent完整代码

UploadComponent.tsx

import React, { useState, useEffect } from "react";
import { Upload, Modal } from 'antd';
import { PlusOutlined } from "@ant-design/icons";
export default (props: any) => {
 console.log(props)
 const [fileList, setFileList] = useState<any>([])
 const [previewVisible, setPreviewVisible] = useState<boolean>(false);
 const [previewImage, setPreviewImage] = useState<string>('');
 useEffect(() => {
 if (props.value) {
 let newFileList = props.value.map((item: any) => {
 return {
  uid: item.id || item.uid,
  status: 'done',
  url: 'url' + item.imgUrl,
  imgUrl: item.imgUrl,
 }
 })
 setFileList(newFileList)
 }
 }, [props])
 const handleChange = ({ file, fileList }: any) => {
 fileList = fileList.map((file: any) => {
 if (file.response) {
 file.id = file.uid;
 file.imgUrl = file.response.data.key
 }
 return file;
 });
 if (file.status !== undefined) {
 if (file.status === 'done') {
 console.log('上传成功')
 triggerChange(fileList);
 } else if (file.status === 'error') {
 console.log('上传失败')
 } else if (file.status === 'removed') {
 if (typeof file.uid === 'number') {
  //请求接口,删除已经保存过的图片,并且成功之后triggerChange
  triggerChange(fileList);
 } else {
  //只是上传到了服务器,并没有保存,直接riggerChange
  triggerChange(fileList);
 }
 }
 }
 setFileList([...fileList]);
 }
 const triggerChange = (value: any) => {
 const onChange = props.onChange;
 if (onChange) {
 onChange(value);
 }
 };
 const handlePreview = async (file: any) => {
 setPreviewImage(`url/${file.imgUrl}`);
 setPreviewVisible(true);
 };
 const uploadButton = (
 <div>
 <PlusOutlined />
 <div className="ant-upload-text">Upload</div>
 </div>
 );
 return (
 <div>
 <Upload
 listType="picture-card"
 fileList={fileList}
 onChange={handleChange}
 onPreview={handlePreview}
 action={'url'}
 headers={{
  'Duliday-Agent': '4',
  'Duliday-Agent-Version': (0x020000).toString(),
  'X-Requested-With': 'null',
  'token': 'token'
 }}
 >
 {fileList.length >= 8 ? null : uploadButton}
 </Upload>
 <Modal
 visible={previewVisible}
 title='预览照片'
 footer={null}
 onCancel={() => setPreviewVisible(false)}
 >
 <img alt="example" style={{ width: '100%' }} src={previewImage} />
 </Modal>
 </div>
 );
};

以上这篇Ant Design的Table组件去除“取消排序”选项操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS异常处理的一个想法(sofish)
Mar 14 Javascript
jquery实现智能感知连接外网搜索
May 21 Javascript
jQuery中:hidden选择器用法实例
Dec 30 Javascript
vue数据双向绑定原理解析(get &amp; set)
Mar 08 Javascript
Angualrjs和bootstrap相结合实现数据表格table
Mar 30 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
Apr 17 jQuery
详解webpack 如何集成第三方js库
Jun 29 Javascript
Vue中的数据监听和数据交互案例解析
Jul 12 Javascript
vue axios请求超时的正确处理方法
Apr 02 Javascript
jQuery插件实现弹性运动完整示例
Jul 07 jQuery
Vue 中使用富文本编译器wangEditor3的方法
Sep 26 Javascript
js制作提示框插件
Dec 24 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
Oct 24 #Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 24 #Javascript
解决Antd 里面的select 选择框联动触发的问题
Oct 24 #Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
Oct 24 #Javascript
jquery插件懒加载的示例
Oct 24 #jQuery
在react-antd中弹出层form内容传递给父组件的操作
Oct 24 #Javascript
Antd下拉选择,自动匹配功能的实现
Oct 24 #Javascript
You might like
php图片验证码代码
2008/03/27 PHP
第六章 php目录与文件操作
2011/12/30 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
JQuery动态给table添加、删除行 改进版
2011/01/19 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
基于BootStarp的Dailog
2016/04/28 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
Web服务器框架 Tornado简介
2014/07/16 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
python3 shelve模块的详解
2017/07/08 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
2017/07/11 Python
python:pandas合并csv文件的方法(图书数据集成)
2018/04/12 Python
python 显示数组全部元素的方法
2018/04/19 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
考试没考好检讨书
2014/01/31 职场文书
优良学风班总结材料
2014/02/08 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
表扬通报怎么写
2015/01/16 职场文书
客房部经理岗位职责
2015/02/02 职场文书
2015年领班工作总结
2015/04/29 职场文书
Redis基本数据类型哈希Hash常用操作命令
2022/06/01 Redis