封装react-antd-table组件参数以及方法如rowSelection、pageNum、pageSize、分页方法等等

简介: 文章介绍了如何封装React-Antd的Table组件,包括参数和方法,如行选择(rowSelection)、页码(pageNum)、页面大小(pageSize)、分页方法等,以简化在不同表格组件中的重复代码。

一般情况下,我们在页面组件里面都会使用state创建对应的分页参数和分页方法然后传入对应的组件内部,再或者选择行、全选等等,这都会在每一个组件中徒增大量的代码行数,所以简单整理了一下这个只是针对于处理逻辑的组件:
useTableCom

import {
    map, uniqBy } from 'lodash-es'
import {
    useState } from 'react'
// 表格分页参数默认值
const cur = 1
const pagesize = 10
export default function useRowSelection({
    rowKey = 'id', getTable = () => {
   } }) {
   
    // 表格选中的id (rowKey)
    const [selectedRowKeys, setSelectedRowKeys] = useState([])
    // 当前选中的行元素对象
    const [selectedList, setSelectedList] = useState([])
    const [pageNum, setCurrent] = useState(cur)
    const [pageSize, setPageSize] = useState(pagesize)
    // 记录当前表格查询条件
    const [curparams, setcurparams] = useState({
   })
    // 表格多选
    const rowSelection = {
   
        // 当前选中行list
        selectedRowKeys,
        // 禁用选中
        getCheckboxProps: record => ({
   
            disabled: record.disabled,
        }),
        // onChange: (keys, selectedRows, info) => {
   
        //     console.log(keys, selectedRows, info)
        // },
        // 单选按钮
        onSelect: (record, selected) => {
   
            let selectedData = selectedList
            // 选中 push
            if (selected) {
   
                selectedData.push(record)
            } else {
   
                // 未选中 splice
                selectedData.splice(
                    selectedData.findIndex(item => item[rowKey] === record[rowKey]),
                    1,
                )
            }
            selectedData = uniqBy(selectedData, rowKey)
            setSelectedList(selectedData)
            setSelectedRowKeys(map(selectedData, rowKey))
        },
        // 全选按钮
        onSelectAll: (selected, selectedRows, changeRows) => {
   
            let selectedData = selectedList
            if (selected) {
   
                selectedData = selectedData.concat(changeRows)
            } else {
   
                selectedData = selectedData.filter(x => !changeRows.find(change => change[rowKey] === x[rowKey]))
            }
            selectedData = uniqBy(selectedData, rowKey)
            setSelectedList(selectedData)
            setSelectedRowKeys(map(selectedData, rowKey))
        },
    }

    // 重置当前选中项
    const initSelect = () => {
   
        setSelectedRowKeys([])
        setSelectedList([])
    }

    // 这个可以页面初始化或者重置查询条件的时候使用
    const changeCurrentAndPageSize = async (pageNum = cur, pageSize = pagesize, params = {
   }) => {
   
        setCurrent(pageNum)
        setPageSize(pageSize)
        setcurparams(params)
        getTable({
    pageNum, pageSize, ...params })
    }

    // 点击跳转页码或者下一页的时候
    const paginationChange = (p, ps) => {
   
        if (ps !== pageSize) {
   
            changeCurrentAndPageSize(1, ps, curparams)
        } else {
   
            changeCurrentAndPageSize(p, ps, curparams)
        }
    }

    // 设置当前分页参数 
    const changeCurrentAndPageSizeNum = (pageNum = cur, pageSize = pagesize) => {
   
        setCurrent(pageNum)
        setPageSize(pageSize)
    }

    return {
   
        // 当前页
        pageNum,
        changeCurrentAndPageSizeNum,
        setCurrent,
        // 当前页显示条数
        pageSize,
        setPageSize,
        // 改变当前页码
        changeCurrentAndPageSize,
        // 给table组件的改变页面的方法
        paginationChange,
        // 选中行方法
        rowSelection,
        // 当前选中的 rowKey list
        selectedRowKeys,
        // 当前选中的 对象 list
        selectedList,
        // 设置当前选中的 rowKey list
        setSelectedRowKeys,
        // 设置当前选中的 对象 list
        setSelectedList,
        // 初始化选中框
        initSelect,
    }
}

使用的时候我们我们只需要传入当前list每一行的key以及,对应的表格查询方法即可。

使用:

const getTable = async (obj = {
   }) => {
   
        setList([])
        setTotal(0)
        setLoading(true)
        const res = await IPServe.aaa(obj)
        if (res && res.code === 200) {
   
            const {
    data = [], total = 0 } = res.data || {
   }
            setList(data)
            setTotal(total)
        }
        setLoading(false)
    }
const {
   
        pageNum,
        pageSize,
        changeCurrentAndPageSize,
        // rowSelection,
        // selectedRowKeys,
        // initSelect,
        paginationChange,
    } = useRowSelection({
   
        rowKey: 'id',
        getTable,
    })
    form表单收集查询参数即可
    const search = async () => {
   
        changeCurrentAndPageSize(1, 10, {
   
            ...form.getFieldsValue(),
        })
    }
    const reset = () => {
   
        form.resetFields()
        changeCurrentAndPageSize(1, 10, {
   
            ...form.getFieldsValue(),
        })
    }
<myTable
     Props={
   {
   
          title: '列表',
          columns: [],
          dataSource: [],
          showPagination: true,
          rowKey: 'id',
      }}
      pageProps={
   {
    total, pageNum, onChange: paginationChange, pageSize }}
  />

当然我们也可以将total也搞到组件里面。
myTable是自己封装的组件,当然table组件无非就这些参数。

目录
相关文章
|
1天前
|
前端开发 JavaScript 开发者
React 按钮组件 Button
本文介绍了 React 中按钮组件的基础概念,包括基本的 `&lt;button&gt;` 元素和自定义组件。详细探讨了事件处理、参数传递、状态管理、样式设置和可访问性优化等常见问题及其解决方案,并提供了代码示例。帮助开发者避免易错点,提升按钮组件的使用体验。
99 77
|
2天前
|
前端开发 UED 开发者
React 对话框组件 Dialog
本文详细介绍了如何在 React 中实现一个功能完备的对话框组件(Dialog),包括基本用法、常见问题及其解决方案,并通过代码案例进行说明。从安装依赖到创建组件、添加样式,再到解决关闭按钮失效、背景点击无效、键盘导航等问题,最后还介绍了如何添加动画效果和处理异步关闭操作。希望本文能帮助你在实际开发中更高效地使用 React 对话框组件。
96 75
|
7天前
|
前端开发 Java API
React 进度条组件 ProgressBar 详解
本文介绍了如何在 React 中创建进度条组件,从基础实现到常见问题及解决方案,包括动态更新、状态管理、性能优化、高级动画效果和响应式设计等方面,帮助开发者构建高效且用户体验良好的进度条。
35 18
|
22天前
|
存储 前端开发 测试技术
React组件的最佳实践
React组件的最佳实践
|
20天前
|
前端开发 API 开发者
React 文件上传组件 File Upload
本文详细介绍了如何在 React 中实现文件上传组件,从基础的文件选择和上传到服务器,再到解决文件大小、类型限制、并发上传等问题,以及实现多文件上传、断点续传和文件预览等高级功能,帮助开发者高效构建可靠的应用。
48 12
|
15天前
|
存储 前端开发 JavaScript
React 表单输入组件 Input:常见问题、易错点及解决方案
本文介绍了在 React 中使用表单输入组件 `Input` 的基础概念,包括受控组件与非受控组件的区别及其优势。通过具体代码案例,详细探讨了创建受控组件、处理多个输入字段、输入验证和格式化的方法,并指出了常见易错点及避免方法,旨在提升表单的健壮性和用户体验。
27 4
|
19天前
|
前端开发 JavaScript API
React 文件下载组件:File Download
本文详细介绍了如何在React应用中实现文件下载组件,包括基本概念、实现步骤和代码示例。同时,探讨了常见问题如文件类型不匹配、文件名乱码等及其解决方法,旨在提升用户体验和代码可维护性。
38 2
|
1月前
|
前端开发 JavaScript 开发者
颠覆传统:React框架如何引领前端开发的革命性变革
【10月更文挑战第32天】本文以问答形式探讨了React框架的特性和应用。React是一款由Facebook推出的JavaScript库,以其虚拟DOM机制和组件化设计,成为构建高性能单页面应用的理想选择。文章介绍了如何开始一个React项目、组件化思想的体现、性能优化方法、表单处理及路由实现等内容,帮助开发者更好地理解和使用React。
77 9
|
2月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
25天前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
94 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生