React组件思想篇:React封装简单表格(含复选框,无多级表头,无合并行以及合并列)

表格效果图

在这里插入图片描述

当复选框触发时,父组件接收到的数据
在这里插入图片描述

实现思路

1.将表头列,数据源,是否开启复选框开放出去,通过父组件传进来
2.开启复选框,选中的数据需要传给父组件;

代码说明

在这里插入图片描述

在这里插入图片描述

//标题格式
const column = [
  {
    keyName:'name',
    valueName:'姓名'
  },
  {
    keyName:'age',
    valueName:'年龄'
  },
  {
    keyName:'school',
    valueName:'学校'
  },
  {
    keyName:'info',
    valueName:'基本信息'
  }
];

在这里插入图片描述

//table表格需要展示的数据
const tableData = [
  {
    name: '1233',
    age: 21,
    school: 'XXXXX'
  },
  {
    name: '2334',
    age: 21,
    school: 'XXXXX'
  },
  {
    name: '3233',
    age: 21,
    school: 'XXXXX'
  },
  {
    name: '4233',
    age: 21,
    school: 'XXXXX'
  },
  {
    name: '5233',
    age: 21,
    school: 'XXXXX'
  }
];

在这里插入图片描述

完整代码

import React from 'react';

import './index.css'

export default function TableNavite(props: any) {
  
  const { tableData = [], column = [], isCheckbox = false, isPage = false, exportCheckList } = props;
  // 定义一个Set,保存选中的checkbox数据
  let checkboxMap = new Set();

  // 复选框选中事件触发
  const checkBoxChange = (item: any, index: number) => {
    return () => {
      // 判断Set是否已存在,存在及删除,否则则添加
      if( checkboxMap.has(item)){
        checkboxMap.delete(item);
      }else{
        checkboxMap.add(item);
      }
      // 暴露选中的的数据给父组件
      exportCheckList(checkboxMap);
    }
  }

  return (
    <>
      <table className='nativeTable'>
        <thead>
          <tr>
            {/* 是否存在复选框,是则加1列空白标题 */}
            {isCheckbox && <th className='everyColumn'></th>}
            {/* 显示标题 */}
            {column && column.map((item: any, index: number) => {
              return (
                <th className='everyColumn' key={item?.keyName || index}>{item?.valueName}</th>
              )
            })}
          </tr>
        </thead>
        <tbody>
          {/* 表格行数等于数据长度 */}
          {
            tableData && tableData.map((item: any, index: number) => {
              return (
                <tr key={index}>
                  {isCheckbox && <td className='everyColumn'><input onChange={checkBoxChange(item, index)} type='checkbox' /></td>}
                  {
                    column.map((_item: any, _index: number) => {
                      return (
                        <td className='everyColumn' key={_index}>{item[_item?.keyName]}</td>
                      )
                    })
                  }
                </tr>
              )
            })
          }
        </tbody>
      </table>
    </>
  )
}

组件使用

import React, { useState, useEffect } from 'react';
import TableNavite from '../../components/TableNavite/index';
import { column, tableData } from '../../dataSource/index.js';


export default function Four() {
  useEffect(() => {

  })
  const exportCheckList = (item: any) => {
    console.log('4组件', item);

  }

  return (
    <>
      <h2>这是肆页</h2>
      <h4>复选框表格</h4>
      <TableNavite
        column={column}
        tableData={tableData}
        isCheckbox={true}
        exportCheckList={exportCheckList}
      />
      <h4>简单表格</h4>
      <TableNavite
        column={column}
        tableData={tableData}
        // isCheckbox={true}
        exportCheckList={exportCheckList}
      />
    </>
  )
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过以下步骤在 React 中实现在表格外添加一个框并实现全或取消全功能: 1. 在表格外部添加一个框,并为其编写状态处理函数。 ```jsx class Table extends React.Component { constructor(props) { super(props); this.state = { isChecked: false }; } handleCheckAll = e => { this.setState({ isChecked: e.target.checked }); }; render() { return ( <div> <input type="checkbox" checked={this.state.isChecked} onChange={this.handleCheckAll} /> <table> {/* ... */} </table> </div> ); } } ``` 2. 在表格中添加一个框,并在其上绑定一个 `checked` 属性,该属性值应该与外部框的状态保持一致。 ```jsx class Table extends React.Component { constructor(props) { super(props); this.state = { isChecked: false, rows: [ { id: 1, name: 'Alice', isChecked: false }, { id: 2, name: 'Bob', isChecked: false }, { id: 3, name: 'Charlie', isChecked: false } ] }; } handleCheckAll = e => { const isChecked = e.target.checked; const rows = this.state.rows.map(row => ({ ...row, isChecked })); this.setState({ isChecked, rows }); }; handleCheckRow = (id, isChecked) => { const rows = this.state.rows.map(row => row.id === id ? { ...row, isChecked } : row); const isCheckedAll = rows.every(row => row.isChecked); this.setState({ isChecked: isCheckedAll, rows }); }; render() { return ( <div> <input type="checkbox" checked={this.state.isChecked} onChange={this.handleCheckAll} /> <table> <thead> <tr> <th>ID</th> <th>Name</th> <th>Is Checked</th> </tr> </thead> <tbody> {this.state.rows.map(row => ( <tr key={row.id}> <td>{row.id}</td> <td>{row.name}</td> <td> <input type="checkbox" checked={row.isChecked} onChange={e => this.handleCheckRow(row.id, e.target.checked)} /> </td> </tr> ))} </tbody> </table> </div> ); } } ``` 3. 当外部框的状态发生改变时,需要更新表格框状态;当表格框状态发生改变时,需要更新外部框的状态。 上述代码中已经实现了这些功能,因此整个应用已经可以正常工作了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值