antd的table组件中渲染columns的时候无法正确获取到父组件的state问题——个人记录

问题描述

首先我使用的是函数式组件(因为封装的原因 我将以下代码都写在了父组件函数里面)

然后在父组件中我定义了一个state 用于记录某个作用的id
在这里插入图片描述
初始值是333 (这333后面有用)
但是在显示组件的时候 我利用useEffect函数 发起请求 获取后端最新的deptid 然后使用setDeptid对deptid进行从新的赋值
在这里插入图片描述
当重新赋值deptid之前 我是已经渲染 table的columns
下图是columns中的某一个 操作列
在这里插入图片描述
如上图 删除按钮是一个deleteItem的函数
在这里插入图片描述
如图所示该函数执行会输出了父组件的state但是该输出却是333 并不是最新的数据

原因分析

究其原因发现原来 是我掉进了闭包陷阱当中
在渲染table的时候 我将之前的deptid放到了deleteItem中 由此形成了一个闭包 在内存中将之前的333缓存了起来 然后当你再次点击按钮触发deleteItem函数的时候 该值重新从缓存中拿出来 那么显示的就是之前的值,而在类组件中是不会存在这种问题的

解决方案

如上图所示 解决方案是在父组件中使用一个useRef钩子 来保存最新的数据 需要用的时候 直接console.log(countRef.current)即可
在这里插入图片描述

参考文献

添加链接描述

ReactAntd下使用Table组件的summary属性可以通过自定义Table组件render方法来实现。 首先,你需要从接口获取到汇总数据,并将其存储在组件state。 然后,在Table组件,你需要设置summary属性为一个函数,该函数接收tableData和columns作为参数,然后返回一个JSX元素,用于显示汇总数据。 最后,你可以使用Antd的Sticky组件来将summary固定在表头。 以下是一个示例代码: ```jsx import React, { useState, useEffect } from 'react'; import { Table, Sticky } from 'antd'; const columns = [ { title: 'Name', dataIndex: 'name', }, { title: 'Age', dataIndex: 'age', }, { title: 'Address', dataIndex: 'address', }, ]; const MyTable = () => { const [tableData, setTableData] = useState([]); const [summaryData, setSummaryData] = useState({}); useEffect(() => { // 从接口获取汇总数据,并将其存储在state fetchData(); }, []); const fetchData = async () => { const response = await fetch('api/summary'); const data = await response.json(); setSummaryData(data); }; const renderSummary = (data, columns) => { // 根据columns和汇总数据生成JSX元素 return ( <tr> {columns.map((column, index) => ( <td key={index}>{data[column.dataIndex]}</td> ))} </tr> ); }; return ( <> <Sticky> <Table columns={columns} dataSource={tableData} summary={renderSummary(summaryData, columns)} /> </Sticky> </> ); }; export default MyTable; ``` 在上面的代码,我们通过useState和useEffect来获取汇总数据,并且使用renderSummary函数来渲染汇总数据。最后,我们将Table组件包裹在Sticky组件,以将summary固定在表头。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值