当前位置: 首页 > java >正文

ANTD-TABLE表格字段明细展示

文章目录

  • 1、字段渲染
  • 2、异步请求展示明细
  • 3、hover展示问题
    • 3.1 基本逻辑
    • 3.2 hover时长判断
    • 3.3 render+hover

表格字段明细展示,属于比较小的需求,但是也有一定交互细节,本文选取部分场景。

1、字段渲染

  • render和渲染组件是有区别的。
  • render常见为函数转化,利用页面和全局的变量state来渲染,最终返回Dom结构,偏向于展示和数据处理。函数参数和原来一致。
  • 渲染组件提供了自己的状态,有利于该字段的交互逻辑集中在组件中,尽量少利用外部变量。注意函数参数的变化,由props引入。
  • 命名方式略有不同,函数驼峰即可,组件大写字母开头+驼峰。
import { Table } from "antd";
import React, { useState } from "react";const RenderNameCom = ({ text }) => {const [loading, setLoading] = useState(false);return (<divonClick={() => {setLoading(true);setTimeout(() => {setLoading(false);}, 2000);}}>{loading ? "Loading..." : text}</div>);
};const renderNameFun = (text) => {const textLast = text > 10 ? "..." : text;return <div>{textLast}</div>;
};export const columns = [{title: "Name",dataIndex: "name",render: (text) => <RenderNameCom text={text} />,},{title: "Age",dataIndex: "age",render: renderNameFun,},
];const testPage = () => {return (<Table columns={columns} dataSource={[{ name: "John Doe", age: 32 }]} />);
};export default testPage;

2、异步请求展示明细

  • click点击比较常见,单次点击也比较保守和稳定,配合disabled(或者loading)保证同一时间不在接受触发事件。
  • 获取展开状态visible(新版本使用open属性),可以进行灵活判断,不再进行触发请求。
  • 如果没有disabled禁用,可能连续点击触发多次。
import { Table } from "antd";
import React, { useState } from "react";
import { Button, Popover, Spin, Divider } from "antd";const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));const RenderNameCom = ({ text }) => {const [show, setShow] = useState(false);const [loading, setLoading] = useState(false);const [data, setData] = useState({width: 0,height: 0,top: 0,left: 0,});const onClick = async () => {// 当未展开时,点击可以发起请求;展开后,默认会关闭,阻止多余请求if (show) {return;}try {setLoading(true);await delay(2000);setData({width: 100,height: 100,top: 100,left: 100,});console.log("clicked");setLoading(false);} catch (error) {console.log(error);setLoading(false);}};return (<Popovercontent={loading ? (<Spin />) : (<div><p>Name: {text}</p><Divider /><p>Width: {data?.width}</p><p>Height: {data?.height}</p><p>Top: {data?.top}</p><p>Left: {data?.left}</p></div>)}trigger="click"visible={show}onVisibleChange={(visible) => setShow(visible)}><Button type="link" onClick={onClick} disabled={loading}>{text}</Button></Popover>);
};export const columns = [{title: "Name",dataIndex: "name",render: (text) => <RenderNameCom text={text} />,},
];const testPage = () => {return (<Table columns={columns} dataSource={[{ name: "John Doe", age: 32 }]} />);
};export default testPage;

3、hover展示问题

3.1 基本逻辑

  • 用click的基础代码,改为hover触发基本完成任务
  • 问题在于hover存在鼠标滑过频率很快的问题,误触发概率很大。
import { Table } from "antd";
import React, { useState } from "react";
import { Button, Popover, Spin, Divider } from "antd";const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));const RenderNameCom = ({ text }) => {const [show, setShow] = useState(false);const [loading, setLoading] = useState(false);const [data, setData] = useState({width: 0,height: 0,top: 0,left: 0,});const onClick = async () => {console.log("clicked start");if (show) {return;}try {setLoading(true);await delay(2000);setData({width: 100,height: 100,top: 100,left: 100,});console.log("clicked");setLoading(false);} catch (error) {console.log(error);setLoading(false);}};return (<Popovercontent={loading ? (<Spin />) : (<div><p>Name: {text}</p><Divider /><p>Width: {data?.width}</p><p>Height: {data?.height}</p><p>Top: {data?.top}</p><p>Left: {data?.left}</p></div>)}trigger="hover"visible={show}onVisibleChange={(visible) => setShow(visible)}><Button type="link" onMouseEnter={onClick} disabled={loading}>{text}</Button></Popover>);
};export const columns = [{title: "Name",dataIndex: "name",render: (text) => <RenderNameCom text={text} />,},
];const testPage = () => {return (<Tablestyle={{ paddingTop: "100px" }}columns={columns}dataSource={[{ name: "John Doe", age: 32 }]}/>);
};export default testPage;

3.2 hover时长判断

判断鼠标hover时长,决定是否触发事件;基础代码模拟。

const HoverTimer = () => {const [loading, setLoading] = useState(false);const timer = useRef(null);const onMouseEnter = async () => {timer.current = setTimeout(async () => {try {setLoading(true);await delay(2000);console.log("clicked");setLoading(false);} catch (error) {console.log(error);setLoading(false);}}, 1000);};const onMouseLeave = () => {if (timer.current) {clearTimeout(timer.current);}};return (<Buttontype="link"onMouseEnter={onMouseEnter}onMouseLeave={onMouseLeave}loading={loading}>Hover me</Button>);
};

3.3 render+hover

  • hover会自动展开和关闭,可以不再设置show的状态。
  • 注意hover刚开始,定时器未执行,利用defaultData的初始状态进行设置loading
import { Table } from "antd";
import React, { useState, useRef } from "react";
import { Button, Popover, Spin, Divider } from "antd";const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));const RenderNameCom = ({ text }) => {const [loading, setLoading] = useState(false);const defaultData = {width: 0,height: 0,top: 0,left: 0,};const [data, setData] = useState(defaultData);const timer = useRef(null);const onMouseEnter = async () => {console.log("clicked start");setData(defaultData); // 同步清空timer.current = setTimeout(async () => {try {setLoading(true);await delay(2000);setData({width: 100,height: 100,top: 100,left: 100,});console.log("clicked");setLoading(false);} catch (error) {console.log(error);setLoading(false);}}, 1000);};const onMouseLeave = () => {if (timer.current) {clearTimeout(timer.current);}};return (<Popovercontent={loading || data?.width === 0 ? (<Spin />) : (<div><p>Name: {text}</p><Divider /><p>Width: {data?.width}</p><p>Height: {data?.height}</p><p>Top: {data?.top}</p><p>Left: {data?.left}</p></div>)}trigger="hover"><Buttontype="link"onMouseEnter={onMouseEnter}onMouseLeave={onMouseLeave}disabled={loading}>{text}</Button></Popover>);
};export const columns = [{title: "Name",dataIndex: "name",render: (text) => <RenderNameCom text={text} />,},
];const testPage = () => {return (<div><Tablestyle={{ paddingTop: "100px" }}columns={columns}dataSource={[{ name: "John Doe", age: 32 }]}/></div>);
};export default testPage;
http://www.xdnf.cn/news/19652.html

相关文章:

  • (MySQL)分布式锁
  • k8s知识点汇总2
  • 【 HarmonyOS 】错误描述:The certificate has expired! 鸿蒙证书过期如何解决?
  • K8S-etcd数据库的相关操作
  • 吴恩达机器学习补充:决策树和随机森林
  • 中越跨境物流管理系统的设计与实现(原创)
  • DiffusionGPT-LLM驱动的文本生成图像系统
  • 【高等数学】第十章 重积分——第五节 含参变量的积分
  • 焦耳热技术助力顶刊研究:薄层质子交换膜实现高效水电解制氢
  • 【STM32】在链接脚本中指定DMA Buffer的地址
  • 智慧班牌系统基于Java+Vue技术栈构建,实现教育信息化综合管理。
  • shell脚本编辑(小白基础学习)
  • 从拿起简历(resume)重新找工作开始聊起
  • 【算法】算法题核心类别与通用解题思路
  • git基础命令
  • React中纯 localStorage 与 Context + useReducer + localStorage对比
  • HTML应用指南:利用GET请求获取MSN财经股价数据并可视化
  • IDEA Spring属性注解依赖注入的警告 Field injection is not recommended 异常解决方案
  • 【0426】insert into 内核实现之 找到 buffe, 插入 tuple (2)
  • YOLO 目标检测:YOLOv4数据增强、CIoU Loss、网络结构、CSP、SPPNet、FPN和PAN
  • 模型量化(Model Quantization) 和低精度计算(Low-Precision Computing)
  • 程序员与杀毒软件:一场不必要的“战争”?程序员用什么杀毒软件?-优雅草卓伊凡
  • pandas自学笔记16 pandas可视化
  • 2025年职场人士专业证书选择与分析
  • 免费GIS服务器方案:OGC标准3DTiles服务发布与跨平台渲染实践
  • word运行时错误‘53’,文件未找到:MathPage.WLL,更改加载项路径完美解决
  • 漏洞挖掘 渗透测试思路图总结
  • 洛谷 P1115 最大子段和
  • Onion-LO(已开源)——LIDAR里程计的统一框架
  • LeetCode 面试经典 150_滑动窗口_串联所有单词的子串(32_30_C++_困难)(滑动窗口:控制起点和滑动距离)