React18-模拟列表数据实现基础表格功能

news2024/11/14 13:53:42

文章目录

  • 分页功能
  • 分页组件有两种
      • 接口参数
      • 分页类型
      • 用户列表参数类型
  • 模拟列表数据
  • 分页触发方式
  • 实现
    • 目录

分页功能

在这里插入图片描述

分页组件有两种

table组件自带分页

<Table
  bordered
  rowKey="userId"
  rowSelection={{ type: 'checkbox' }}
  pagination={{
    position: ['bottomRight'],
    pageSize: pagination.pageSize,
    current: pagination.current,
    showQuickJumper: true,
    showSizeChanger: true,
    onChange: (page, pageSize) => {
      setPagination({
        current: page,
        pageSize
      })
    }
  }}
  dataSource={data}
/>

分页组件

<Pagination
  pageNum={pagination.pageNum}
  pageSize={pagination.pageSize}
  total={pagination.total}
  onChange={(pageNum: number, pageSize: number) => {
    setPagination({
      current: page,
      pageSize
    })
  }}
/>

接口参数

{
  pageNum: 1,
  pageSize: 10,
  userId: '',
  userName: '',
  state: ''
}

分页类型

export interface PageParams {
  pageNum: number | undefined
  pageSize?: number | undefined
}

用户列表参数类型

export interface Params extends PageParams {
	userId?: number
	userName?: string
	state?: number
}

模拟列表数据

const list = Array.from({length:20})
				.fill({})
				.map((item:any)=>{
					item = {...data.list[0]}
					item.userId = Math.random()
					return item
				})

分页触发方式

  1. 进入页面,模拟初始化列表
  2. 点击搜索,初始化列表
  3. 点击页码,更新列表
  4. 点击每页条数, 更新列表

实现

目录

在这里插入图片描述
system/index.tsx

import api from "@/api";
import { PageParams, User } from "@/types/api";
import { formatDate } from "@/utils";
import { Button, Form, Input, Select, Space, Table } from "antd";
import { ColumnsType } from "antd/es/table";
import { useEffect, useState } from "react";

export default function UserList() {
    const [form] = Form.useForm();
    const [data, setData] = useState<User.UserItem[]>([])
    const [total, setTotal] = useState(0)
    const [pagination, setPagination] = useState({
        current: 1,
        pageSize: 10
    })

    // 获取用户列表
    const getUserList = async (params: PageParams) => {
        const values = form.getFieldsValue()
        const data = await api.getUserList({
            ...values,
            pageNum: params.pageNum,
            pageSize: params.pageSize
        });
        const list = Array.from({ length: 50 })// 模拟数据
            .fill({})
            .map((item: any) => {
                item = { ...data.list[0] }
                item.userId = Math.random()
                return item
            })

        // setData(data.list)
        // setTotal(data.page.total)
        setData(list) // 模拟数据
        setTotal(list.length)// 模拟数据
        setPagination({
            current: data.page.pageNum,
            pageSize: data.page.pageSize,
        })
    }

    useEffect(() => {
        getUserList({
            pageNum: pagination.current,
            pageSize:  pagination.pageSize
        })
    }, [pagination.current, pagination.pageSize])// 在Page切换时候,进行依赖收集,修改其中的pageNum,与pageSize,完成列表更新

    // 搜索
    const handleSearch = ()=>{
        getUserList({
            pageNum: 1,
            pageSize: pagination.pageSize
        })
    }

    // 重置表单
    const handleReset = ()=>{
        form.resetFields()
    }
    // const dataSource = [
    //   {
    //     _id: '',
    //     userId: 0,
    //     userName:'',
    //     userEmail: '',
    //     deptId: '',
    //     state: 0,
    //     mobile: '',
    //     job: '',
    //     role: 0,
    //     roleList: '',
    //     createId: 0,
    //     deptName: '',
    //     userImg: '',
    //   }
    // ];


    // https://ant-design.antgroup.com/components/table-cn
    const columns: ColumnsType<User.UserItem> = [
        {
            title: '用户ID',
            dataIndex: 'userId',
            key: 'userId',
        },
        {
            title: '用户名称',
            dataIndex: 'userName',
            key: 'userName',
        },
        {
            title: '用户邮箱',
            dataIndex: 'userEmail',
            key: 'userEmail',
        },
        {
            title: '用户角色',
            dataIndex: 'role',
            key: 'role',
            render(role: number) {
                return {
                    0: '超级管理员',
                    1: '管理员',
                    2: '体验管理员',
                    3: '普通用户'
                }[role]
            }
        },
        {
            title: '用户状态',
            dataIndex: 'state',
            key: 'state',
            render(state: number) {
                return {
                    1: '在职',
                    2: '试用期',
                    3: '离职',
                }[state]
            }
        },
        {
            title: '注册时间',
            dataIndex: 'createTime',
            key: 'createTime',
            render(createTime: string) {
                return formatDate(createTime)
            }
        },
        {
            title: '操作',
            render(record, values) {
                return <Space>
                    <Button type="text">编辑</Button>
                    <Button type="text" danger>删除</Button>
                </Space>
            }
        },
    ];
    return <div className="user-list">
        <div className="search-form">
            <Form
                layout="inline"
                form={form}
                initialValues={{ state: 0 }}
            >
                <Form.Item name="userId" label="用户ID">
                    <Input placeholder="请输入用户ID" />
                </Form.Item>

                <Form.Item name="userName" label="用户名称">
                    <Input placeholder="请输入用户名称" />
                </Form.Item>


                <Form.Item name="state" label="状态">
                    <Select style={{ width: 120 }}>
                        <Select.Option value={0}>所有</Select.Option>
                        <Select.Option value={1}>在职</Select.Option>
                        <Select.Option value={2}>试用期</Select.Option>
                        <Select.Option value={3}>离职</Select.Option>
                    </Select>
                </Form.Item>


                <Form.Item>
                    <Space>
                        <Button type="primary" onClick={handleSearch}>搜索</Button>
                        <Button type="default" onClick={handleReset}>重置</Button>
                    </Space>

                </Form.Item>
            </Form>
        </div>
        <div className="base-table">
            <div className="header-wrapper">
                <div className="title">用户列表</div>
                <div className="action">
                    <Button type="primary">新增</Button>
                    <Button type="primary" danger>批量删除</Button>
                </div>
            </div>
            <Table
                bordered
                pagination={{
                    position:['bottomRight'],
                    current: pagination.current,
                    pageSize:pagination.pageSize,
                    total,
                    showQuickJumper: true,
                    showSizeChanger:true, // 控制分页器一直有,如果不设置,那么只有total>50时,展示分页器
                    showTotal:(total)=>`总共${total}`,
                    onChange:(page, pageSize)=>{
                        setPagination({
                            current: page,
                            pageSize: pageSize
                        })
                    }
                }}
                rowKey='userId'
                rowSelection={{
                    type: 'checkbox'
                }}
                dataSource={data}
                columns={columns}
            />
        </div>
    </div>
}

api/index.tsx

import { User } from '@/views/system/user'
import qs from 'qs'
export default {
  getUserList(params: User.Params) {
    // mock
    console.log('userList请求参数')
    console.log(qs.stringify(params))
    if (params.pageNum > 1) {
      return fetch('/system/userEmpty.json?' + qs.stringify(params))
        .then(res => res.json())
        .then(res => {
          return {
            ...res.data,
            data: {
              page: {
                pageNum: params.pageNum,
                pageSize: params.pageSize,
                total: 0
              },
              list: [{}]
            }
          }
        })
    } else {
      return fetch('/system/user.json?' + qs.stringify(params))
        .then(res => res.json())
        .then(res => res.data)
    }
  }
}

public/system/user.json

{
    "code": 0,
    "data": {
      "page": {
        "pageNum": 1,
        "pageSize": 10,
        "total": 10
      },
      "list": [
        {
          "userImg": "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png",
          "createTime": "2023-11-22T10:44:25.532Z",
          "userId": 1000016,
          "userName": "JackMa",
          "userEmail": "jackma@mars.com",
          "mobile": "17011221122",
          "sex": 0,
          "deptId": "",
          "deptName": "",
          "job": "前端工程师",
          "state": 1,
          "role": 2,
          "createId": 1000002,
          "lastLoginTime": "2024-01-30T15:47:11.116Z",
          "roleList": "655dbedb11c02c8597dce76f"
        },
        {
          "userId": 100017,
          "userName": "JackBean",
          "userEmail": "jackbean@mars.com",
          "deptId": "655dbef811c02c8597dce77a",
          "deptName": "大前端",
          "state": 1,
          "role": 1,
          "roleList": "655dbedb11c02c8597dce76f",
          "createId": 1000002,
          "userImg": "",
          "createTime": "2023-11-22T08:52:47.963Z",
          "lastLoginTime": "2023-11-22T09:21:22.314Z",
          "__v": 0
        },
        {
          "userId": 100018,
          "userName": "9549587",
          "userEmail": "9549587@mars.com",
          "deptId": "",
          "deptName": "",
          "state": 1,
          "role": 1,
          "roleList": "",
          "createId": 1000002,
          "userImg": "http://api-driver.marsview.cc/3f9393c68f57ac57704652f00.png",
          "createTime": "2023-11-22T08:52:47.963Z",
          "lastLoginTime": "2024-01-30T06:53:57.530Z",
          "__v": 0,
          "job": "测试"
        },
        {
          "userId": 100020,
          "userName": "1366143860",
          "userEmail": "1366143860@mars.com",
          "deptId": "6568c7254a54800ac8d5b18e",
          "deptName": "部门5",
          "state": 1,
          "role": 1,
          "roleList": "",
          "createId": 1000002,
          "userImg": "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png",
          "createTime": "2023-11-22T08:52:47.963Z",
          "lastLoginTime": "2023-12-21T07:41:46.976Z",
          "mobile": "13072361279",
          "job": "前端1"
        },
        {
          "userId": 100022,
          "userName": "413401333",
          "userEmail": "413401333@mars.com",
          "deptId": "6582ae994a54800ac8d76b80",
          "deptName": "前端",
          "state": 1,
          "role": 1,
          "roleList": "6582aeb44a54800ac8d76b88",
          "createId": 1000002,
          "userImg": "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png",
          "createTime": "2023-11-22T08:52:47.963Z",
          "lastLoginTime": "2024-01-02T02:16:53.036Z",
          "job": "前端"
        },
        {
          "userId": 100023,
          "userName": "1050732226",
          "userEmail": "1050732226@mars.com",
          "deptId": "",
          "deptName": "大前端",
          "state": 1,
          "role": 1,
          "roleList": "",
          "createId": 1000002,
          "userImg": "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png",
          "createTime": "2023-11-22T08:52:47.963Z",
          "lastLoginTime": "2024-01-06T05:55:34.501Z"
        },
        {
          "userId": 100024,
          "userName": "191337035",
          "userEmail": "191337035@mars.com",
          "deptId": "",
          "deptName": "大前端",
          "state": 1,
          "role": 1,
          "roleList": "",
          "createId": 1000002,
          "userImg": "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png",
          "createTime": "2023-11-22T08:52:47.963Z",
          "lastLoginTime": "2024-01-06T05:56:01.926Z"
        },
        {
          "userId": 100025,
          "userName": "717210290",
          "userEmail": "717210290@mars.com",
          "deptId": "",
          "deptName": "大前端",
          "state": 1,
          "role": 1,
          "roleList": "",
          "createId": 1000002,
          "userImg": "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png",
          "createTime": "2023-11-22T08:52:47.963Z",
          "lastLoginTime": "2024-01-06T05:56:16.764Z"
        },
        {
          "userId": 100027,
          "userName": "475721797",
          "userEmail": "475721797@mars.com",
          "deptId": "",
          "deptName": "大前端",
          "state": 1,
          "role": 1,
          "roleList": "",
          "createId": 1000002,
          "userImg": "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png",
          "createTime": "2023-11-22T08:52:47.963Z",
          "lastLoginTime": "2024-01-06T06:10:25.195Z"
        },
        {
          "userId": 100028,
          "userName": "1667519970",
          "userEmail": "1667519970@mars.com",
          "deptId": "",
          "deptName": "大前端",
          "state": 1,
          "role": 1,
          "roleList": "",
          "createId": 1000002,
          "userImg": "https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png",
          "createTime": "2023-11-22T08:52:47.963Z",
          "lastLoginTime": "2024-01-06T06:02:09.986Z"
        }
      ]
    },
    "msg": ""
  }

public/system/userEmpty.json

{
    "code": 0,
    "data": {},
    "msg": ""
  }

在切换分页时候看到参数发生变化
在这里插入图片描述

搜索时候可以看到搜索参数传入
在这里插入图片描述
代码地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1424416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何下载52pojie、CSDN、简书、Myitmx、博客园的文章?(最新教程)

使用的油猴插件&#xff0c;具体怎么安装问一下度娘。 我用的火狐&#xff0c;点点点就行了&#xff0c;省事 先安装油猴拓展&#xff0c;启用一下 Tampermonkey – 下载 &#x1f98a; Firefox 扩展&#xff08;zh-CN&#xff09; 在安装插件 SaveToPDF 脚本安装后&#…

svn 安装路径

SVN客户端安装&#xff08;超详细&#xff09; 一、SVN客户端安装 1、下载安装包地址&#xff1a;https://tortoisesvn.net/downloads.html 此安装包是英文版的&#xff0c;还可以下载一个语言包&#xff0c;在同界面的下方 一直点击下一步&#xff0c;直到弹出选择红框 然…

3. Mybatis的XML配置文件(重点)

目录 1 Mybatis的XML配置文件 1.1 XML配置文件规范 1.2 XML配置文件实现 1.3 MybatisX的使用 2. Mybatis动态SQL 2.1 什么是动态SQL 2.2 动态SQL-if 2.2.1 条件查询 2.2.2更新 2.3 动态SQL-foreach 2.4 动态SQL-sql&include 1.mybatis入门 2.mybatis基本操作 1…

linux☞ Centos 基础篇

切换用户 重启系统、退出 su 用户 ### su switch user 重启系统 reboot 退出当前账户 logout 或者 exit 或者 CtrlD 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet&#xff1a;指明网卡类型为以太网 DEVICEens33&#xff1a;指定当前配置的…

Skywalking的Trace Profiling 代码级性能剖析功能应用详解

代码级性能剖析 Skywalking 提供了Trace Profiling功能对具体出现问题的span进行代码级性能剖析。 代码级性能剖析就是利用方法栈快照&#xff0c;并对方法执行情况进行分析和汇总。并结合有限的分布式追踪 span 上下文&#xff0c;对代码执行速度进行估算。性能剖析激活时&a…

性能测试工具架构

背景 性能测试工具&#xff08;LoadRunner为例&#xff09; 性能测试工具通常是指那些用来支持压力、负载测试&#xff0c;能够录制和生成脚本、设置和部署场景、产生并发用户和向系统施加持续压力的工具。 性能测试工具录制的是服务端与应用之间的通信数据&#xff0c;而不是…

transformer_正余弦位置编码代码笔记

transformer_正余弦位置编码代码笔记 transformer输入的序列中&#xff0c;不同位置的相同词汇可能会表达不同的含义&#xff0c;通过考虑位置信息的不同来区分序列中不同位置的相同词汇。 位置编码有多种方式&#xff0c;此处仅记录正余弦位置编码 正余弦位置编码公式如下&…

Android 9.0 SystemServer进程读写sdcard权限的修改

1.前言 在9.0的系统rom定制化开发中,在一些系统进程中,也就是在SystemServer的进程中,其中系统服务中会要求读写Sdcard的一些功能,然后 默认是没有读取sdcard权限的,而在app中可以申请sdcard读写权限在系统服务中就不能申请权限,接下来看怎么授权实现sdcard授权 如图: 2…

【笔记】CSDN文本编辑操作(持续更新中......)

文章目录 1、修改字体颜色和字号2、首行悬进两个字符3、图片居中4、字体、文字颜色、居中5、高亮6、重点标注7、加粗 1、修改字体颜色和字号 <html><head><meta http-equiv"Content" content"text/html;charsetutf-8" /><title>修…

Qt QScrollArea 不显示滚动条 不滚动

使用QScrollArea时&#xff0c;发现添加的控件超出QScrollArea 并没有显示&#xff0c;且没有滚动条效果 原因是 scrollArea指的是scrollArea控件本身的大小&#xff0c;肉眼能看到的外形尺寸。 scrollAreaWidgetContents指的是scrollArea控件内部的显示区域&#xff0c;里面可…

Spring Boot第一天

SpringBoot概述 Spring Boot是Spring提供的一个子项目&#xff0c;用于快速构建Spring应用程序 传统方式构建Spring应用程序 导入依赖繁琐 项目配置繁琐 为了简化如此繁琐的配置流程&#xff0c;SpringBoot这一子项目提供了如下特性 SpringBoot特性 起步依赖 本质上就是一个…

【Java程序设计】【C00203】基于(JavaWeb+SSM)的超市进出货管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的超市进出货管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的超市进货管理系统 本系统分为管理员和员工2个功能模块。 管理员&#xff1a;管理员进入主页面&#xff0c…

会计试算平衡

目录 一. 试算平衡的意义二. 试算平衡的原理和内容三. 试算平衡表 \quad 一. 试算平衡的意义 \quad ①验证错误 ②便于编制会计报表 试算表根据各分类账借贷余额汇总编制而成&#xff0c;依据试算表编制会计报表将比直接依据分类账来编制更为方便,拥有大量分类账的企业尤为便捷…

springboot集成rocketmq-spring-boot-starter的坑(避坑指南)

1.说明版本&#xff08;解决方法&#xff09; springboot版本&#xff1a;2.2.2.RELEASE RocketMQ版本&#xff1a;rocketmq-spring-boot-starter 2.2.2 2.坑 rocketmq-spring-boot-starter的版本一开始&#xff0c;使用的是2.2.0版本&#xff0c;一直出现一个问题&#x…

SIT10505V 供电,±40V 接口耐压,1Mbps 高速 CAN 总线收发器

SIT1050 是一款应用于 CAN 协议控制器和物理总线之间的接口芯片&#xff0c;可应用于卡车、公交、 小汽车、工业控制等领域&#xff0c;速率可达到 1Mbps &#xff0c;具有在总线与 CAN 协议控制器之间进行差分信 号传输的能力。 特点 ➢ 完全兼容 “ ISO 11898 ” 标…

Python+Selenium+Unittest 之selenium15--等待时间

在正常的自动化过程中&#xff0c;如果整篇代码中没有加等待时间的话&#xff0c;有时候可能页面跳转或者还没开始点击就执行到下一个流程了&#xff0c;这时候因为页面没有加载完毕&#xff0c;所以有可能会导致找不到对应的元素而报错&#xff0c;因此我们需要在整个代码流程…

做好测试用例的分析 ? 是做好软件测试的必要步骤。

目录 1.测试用例的分析指标 2.可能原因的论证 3.确定原因的解决方案 测试用例作为测试人员最重要的输出物之一 &#xff0c;它的作用不仅仅是能保证需求覆盖 &#xff0c;提高测试覆盖率等 。通过对执行后的测试用例分析 &#xff0c;你也可以发现更多在编写上&#xff0c;执…

案例四:误Ghost分区恢复

1、案例 小王电脑最近有点问题&#xff0c;于是打算将电脑系统重装系统&#xff0c;原本5个分区&#xff0c;第一个区是操作系统区&#xff0c;后4个用户数据区&#xff0c;在一次GHOST时失误&#xff0c;做完发现硬盘只有一个系统区&#xff0c;两个数据区消失了&#xff0c;…

[力扣 Hot100]Day20 旋转图像

题目描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 出处 思路 旋转时每四个位置为一组进行swap操作&#xff0c;找好对…

phpstudy安装并运行redis

对于一个菜鸟来说&#xff0c;任何一个小步骤都可能研究半天&#xff0c;比如“phpstudy安装并运行redis”这一问题&#xff0c;解决好后第一时间记录下来&#xff0c;方便日后查看&#xff0c;也为遇到同样困难的小伙伴提供个参考&#xff01; 一、phpstudy安装redis 1.打开…