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 相关文章推荐
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
Feb 15 Javascript
JQuery+DIV自定义滚动条样式的具体实现
Jun 25 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
Aug 02 Javascript
JavaScript的arguments对象应用示例
Sep 15 Javascript
浅析Node.js实现HTTP文件下载
Aug 05 Javascript
jQuery实现的自定义弹出层效果实例详解
Sep 04 Javascript
对于Javascript 执行上下文的全面了解
Sep 05 Javascript
基于JavaScript实现抽奖系统
Jan 16 Javascript
vue二级菜单导航点击选中事件的方法
Sep 12 Javascript
bootstrap table合并行数据并居中对齐效果
Oct 17 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
Mar 08 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
Nov 01 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加密解密类代码
2011/11/27 PHP
PHP URL路由类实例
2013/11/12 PHP
php修改上传图片尺寸的方法
2015/04/14 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
javascript dom代码应用 简单的相册[firefox only]
2010/06/12 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/25 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
jQuery判断一个元素是否可见的方法
2015/06/05 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
微信小程序中顶部导航栏的实现代码
2017/03/30 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
2017/07/27 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
python读取LMDB中图像的方法
2018/07/02 Python
Django中的ajax请求
2018/10/19 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
python opencv如何实现图片绘制
2020/01/19 Python
如何快速理解python的垃圾回收机制
2020/09/01 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
飘柔洗发水广告词
2014/03/14 职场文书
励志演讲稿范文
2014/04/29 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
实现一个简单得数据响应系统
2021/11/11 Javascript