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

【React 】折叠面板,点击展开时再请求数据

需求背景:使用折叠面板的形式展示数据,面板内部数据需要在打开时请求接口获取。

遇到问题:最开始使用Antd 的折叠面板组件,它对于数据直接渲染是没问题的,但是不好满足打开面板时再动态加载数据的需求,于是自己手写了一个。

效果展示(已脱敏):
在这里插入图片描述

话不多说,以下是手写的组件代码:

面板的header 内容结构可以根据自己需要调整

/* eslint-disable @typescript-eslint/no-unused-vars */
import { DownOutlined, RightOutlined } from '@ant-design/icons';
import { Col, Row } from 'antd';
import { useRef, useState } from 'react';
import './style.less';
// 内容
import TableList from './TableList';/** ===================================* @names: 自定义折叠面板业务组件* @description:* @author:* @date: 2024-06-20*======================================*/export default function CollapseList(props: any) {const [active, setActive] = useState(false);const tableRef = useRef<any>();return (<div className="collapse-item"><div className="collapse-item-header"><Row><Col span={12}><div>test</div></Col><Col span={8}><div>2022-06-20</div></Col><div className="expand">{!active ? (<divclassName="expandIconCpe"onClick={() => {setActive(!active);// 点击展开时调用子组件加载数据的方法请求tableRef.current?.handleGetData();}}>展开<RightOutlined /></div>) : (<divclassName="expandIconCpe"onClick={() => {setActive(!active);}}>收起<DownOutlined /></div>)}</div></Row></div><divclassName={active ? 'collapse-item-content-active' : 'collapse-item-content-hide'}>{/* 面板内容,可以自定义,我这里是封装了一个表格组件 用ref绑定 */}<TableList ref={tableRef} /></div></div>);
}

样式css:

.collapse-item {border-bottom: 1px solid rgba(5, 5, 5, 6%);border-radius: unset;.collapse-item-header {position: relative;padding: 12px 16px;color: rgba(0, 0, 0, 88%);cursor: pointer;.expand {font-size: 12px;position: absolute;right: 16px;}.expandIconCpe {color: #0065ff !important;}}.collapse-item-content-hide {display: none;}.collapse-item-content-active {display: block;background-color: #fff;}.ant-table-tbody > tr:last-child > td {border-bottom: none;}.ant-row {flex-wrap: nowrap;word-break: break-all;}
}

面板内容组件中写接口请求,使用 forwardRef + useImperativeHandle让父组件调用子组件的方法。

核心代码:


import { forwardRef, useImperativeHandle} from 'react';interface TableRef {handleGetData: (params: any) => void;
}
const TableList = forwardRef<TableRef>((props, ref) => {// 子组件中useImperativeHandle(ref, () => ({// handleGetData是暴露给父组件的方法handleGetData: (params: any) => {// 这里可以自定义封装接口请求,然后渲染数据},}));
})export default TableList;

Tips:
为了提高性能,不让每次点击展开都去发起请求,可以在请求成功一次结果后,设置一个标记,下次再点击展开时,判断如果已经标记请求成功过了,就不发起请求,展示上一次结果。

相关文章:

  • STM32CubeIDE提示找不到头文件(No such file or directory)的解决办法
  • python3GUI--ktv点歌软件By:PyQt5(附下载地址)
  • USB - USB在消费领域的应用
  • 【nest】puppeteer 使用 addScriptTag 在页面中添加方法的方式
  • Gnu/Linux 之 C 语言函数列表初步整理
  • Python题目
  • C++基础知识——引用
  • 机器学习课程复习——逻辑回归
  • 图像编辑技术的新篇章:基于扩散模型的综述
  • ubuntu16.04升级cmake版本至3.21.0
  • vuex的配置主要内容
  • k8s集群master故障恢复笔记
  • 华为数通——OSPF
  • linux 简单使用 sftp 和 lftp命令
  • java算法:插入排序
  • Angular2开发踩坑系列-生产环境编译
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Mybatis初体验
  • PAT A1050
  • Shell编程
  • Yeoman_Bower_Grunt
  • 创建一种深思熟虑的文化
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 机器学习 vs. 深度学习
  • 跨域
  • 配置 PM2 实现代码自动发布
  • 七牛云假注销小指南
  • 如何设计一个微型分布式架构?
  • 网络应用优化——时延与带宽
  • 再次简单明了总结flex布局,一看就懂...
  • 【干货分享】dos命令大全
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • # Panda3d 碰撞检测系统介绍
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (function(){})()的分步解析
  • (笔记)M1使用hombrew安装qemu
  • (层次遍历)104. 二叉树的最大深度
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (回溯) LeetCode 78. 子集
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (七)c52学习之旅-中断
  • (三分钟)速览传统边缘检测算子
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转) Face-Resources
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • .net与java建立WebService再互相调用
  • /proc/stat文件详解(翻译)