简述用React实现Table组件

本文主要介绍了在工作中遇到的表格代码冗余问题,决定封装一个React Table组件以提高代码复用性和可读性。分析了组件需要实现的API,包括columns、dataSource、emptyText、pagination等关键参数,并详细阐述了组件的具体实现,包括表头和表体的渲染,以及如何处理多表头和分页功能。最后展示了组件的使用方法和传入columns的示例。
摘要由CSDN通过智能技术生成

一、背景

由于刚到现在就职的公司接手到公司后台的项目代码的时候,发现系统中大量使用了表格,因为代码经多人参与过,导致有些代码块是通过ul>li标签布局有些地方则是通过div布局等等,导致了代码的严重冗余;简单的表格还好,如果是表格中需要对某些字段进行排序的话,又会大大增加代码的量级和可读性,如图


代码为:


从上图部分截图可以看出,一个表格的代码量大概能占到200行代码,而且每个字段的排序的上下箭头都会增加两个state去进行管理,5个字段需要排序则需要增加10个state,也就意味着每次我们在进入路由组件的时候和进行各种刷新重置操作的时候都需要去处理这10个state等等,还有一个问题就是表格的布局,每个字段所占的宽和高度都是class去设置的,也就意味着,每次产品来告诉你,这个表格需要增加一个字段,你也就得重新去计算所有的字段所占宽度和分配适合的宽度。以上所述的问题违背了程序开发的耦合性和复用性,所以决定封装一个Table组件去解决这个问题。

二、分析需要实现Table的API

1、传入一个数组自动构建出表头以及该表头下这一列的显示的内容,命名为columns,数据类型为array
2、传入表格需要显示的数据源数组,命名为dataSource,数据类型为array
3、缺省状态下,表格需要展示的内容,命名为emptyText,数据类型为string
4、传入表格的分页项,包含当前页码,总页码,以及分页器的点击事件,命名为pagination,数据类型为object
5、传入一个表格每行勾选的配置对象,包含是否使用勾选、勾选的点击事件,便于满足对表格勾选项进行批量处理的需求,命名为rowSelection,数据类型为object
6、传入一个表格行的点击事件,便于满足点击当前行进入详情的需求,命名为onRowClick,数据类型为function
7、传入表格的样式对象,给表格内部的外层包裹容器添加行内样式,命名为style,数据类型为object
8、传入一个className给表格内部的外层包裹容器添加className,可以实现在表格组件外部设置表格的每一列的className,数据类型为string

三、具体实现

1、整体代码

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import ListNone from '../ListNone/ListNone';
import Pager from '../Pager/Pager';
import './Table.less';
// API
// columns为表格定义数据格式,title字段为表格标题,dataIndex为传入的数据源中需要显示的字段一致,可以通过render函数来渲染当前列的数据 -> Array// dataSource为数据源 -> Array
// rowSelection列表项是否可选 -> Object | null
// pagination为分页器 -> Object | false
// onRowClick为单行点击事件

export default class Table extends Component {  
    constructor(props) {    
        super(props);
        this.state = { 
            rowAllSelect: false,//全选按钮  
            rowCheck: [],//单项勾选框   
            rowSelId: [], //选中的id    
            sortArr: [], //排序标志数组  
        };  
    }  

    static propTypes = {    
        columns: PropTypes.array.isRequired, //表头名称
        dataSource: PropTypes.array.isRequired, //数据列表
        emptyText: PropTypes.string, //列表为空时表格缺省状态
        pagination: PropTypes.object, //表格分页对象,包含当前页码,总共页数,分页器的点击事件,
        rowSelection: PropTypes.object, //表格单选全选的配置对象,onChange为单选全选框的状态改变事件,可以得到选中的列的数据    style: PropTypes.object, //表格的样式对象
        isLastNoOp: PropTypes.bool //表格最后一行不需要渲染操作样式  
    }

    static defaultProps = {
        dataSource: [],
        columns: [],
        pagination: {},
        emptyText: '暂无相关信息'
    }; 

    componentWillReceiveProps(nextProps) {    
        let { dataSource } = nextProps;
        let { rowCheck } = this.state;
        let sortArr = [];
        if (dataSource != this.props.dataSource) {
            dataSource.map((item, i) => {
                rowCheck[i] = false;
            });
            this.props.columns.map(item => {
                sortArr.push("");
            });
            const rowSelId = [];
            this.props.rowSelection && this.props.rowSelection.onChange(rowSelId);
            this.setState({
                rowAllSelect: false,//全选按钮
                rowCheck,//单项勾选框
                rowSelId, //选中的id
                sortArr
            });
        }
  }

  //单选
  goodsChange = (item, index, event) => {
    let { rowCheck } = this.state;
    let status = false;
    let { rowSelId } = this.state;
    if (eve
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Ant Design 的 Table 组件提供了一个 `rowSelection` 属性,用于选择行。如果要在 Table 组件实现全选,可以通过以下步骤实现: 1. 在 Table 组件外部创建一个复选框,用于全选/取消全选。 2. 在复选框的 `onChange` 事件中,通过 Table 组件的 `rowSelection` 属性的 `onChange` 方法来处理全选/取消全选的逻辑。 以下是一个简单的示例代码: ``` import React, { useState } from 'react'; import { Table } from 'antd'; function MyTable(props) { const [selectedRowKeys, setSelectedRowKeys] = useState([]); const handleSelectAll = (e) => { const isChecked = e.target.checked; const keys = props.dataSource.map((item) => item.key); setSelectedRowKeys(isChecked ? keys : []); }; const rowSelection = { selectedRowKeys, onChange: (selectedRowKeys) => { setSelectedRowKeys(selectedRowKeys); }, }; const columns = [ { title: 'Name', dataIndex: 'name', }, { title: 'Age', dataIndex: 'age', }, { title: 'Address', dataIndex: 'address', }, ]; return ( <> <div style={{ marginBottom: '16px' }}> <input type="checkbox" onChange={handleSelectAll} /> <span style={{ marginLeft: '8px' }}>Select All</span> </div> <Table dataSource={props.dataSource} columns={columns} rowSelection={rowSelection} /> </> ); } export default MyTable; ``` 在上面的代码中,我们在 Table 组件外部创建了一个复选框,并在 `handleSelectAll` 方法中处理全选/取消全选的逻辑。在 `rowSelection` 属性中,我们将 `selectedRowKeys` 和 `onChange` 方法传递给了 Table 组件,用于处理行选择的逻辑。通过这种方式,我们就可以在 Table 组件外部实现全选/取消全选的功能了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值