React + Antd 填坑(二)使用 Antd 中的 Table 组件 key 值报错

简述

这篇文章主要是讲解React + Antd 项目中遇到的一些常见错误以及解决方案,算是这个系列中的第一篇填坑文。
算是给自己留个笔记,如今分享出来呢,是希望给有需要的同学一些帮助,如有不完善请多多谅解。

问题

问题:Warning: Each child in a list should have a unique “key” prop.
场景:使用 Antd 中的 Table 组件

关于上面这个问题,首先翻译一下,就是说:“ 循环中的每一个子对象必须有一个唯一的Key属性 ”。
之所以出现上面的这个问题,一般是由于对 Antd 的 table 不熟悉造成的,混淆了 Column 中的 key 和此处报错的 key。

例如:

const myColumns: any = [
    {
      title: 'ID',
      dataIndex: 'id',
      key: 'id',
    },
    {
      title: '姓名',
      dataIndex: 'name',
      key: 'name',
    },
  ];
  
const dataSource:any[] = []
  
<Table dataSource={dataSource} columns={myColumns} />;

一般情况下都会以为这个key可以当做循环中所设置的key值,那是想当然,不但是你想错了,我也想错了,看完官方文档发现这完全就不是那么一回事。

官方关于这里的解释也很直接:

React 需要的 key,如果已经设置了唯一的 dataIndex,可以忽略这个属性

那么问题出在哪儿呢?我也不知道!
那还是还是看官方文档吧!
你会发现在 Table 的API中有这么一个属性 rowKay。

注解:rowKey 表格行 key 的取值,可以是字符串或一个函数
类型:string | function(record): string
默认值:key

这个值才是真正 tbody 中数据循环中需要设置的key值。

问题找到了就上解决方案。

解决方案

<Table
	// 表格行 key 的取值,可以是字符串或一个函数
   	rowKey={record => record.id}
/>;

加单吧,确实,就是这么简单的一句话。

注解

数据要进行循环遍历需要设置key值,那么为什么要设置这个Key值呢?
因为React 在解析 JSX 语法模板的时候会生成虚拟DOM节点,虚拟DOM中就要使用到这个Key,这也是新旧虚拟DOM节点进行比对的重要数据之一,算是 Diff 算法中的一种规则。
如果有兴趣的可以去了解一下虚拟DOM,可以去 github 上看一下 snabbdom,这个算是diff算法的鼻祖,Vue的源码就借鉴了snabbdom【snabbdom】

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
React使用Ant Design的Table组件,在表格添加操作列并结合Dropdown和Menu组件可以实现更丰富的交互效果。 首先,我们需要导入相关的组件和样式: ```jsx import { Table, Dropdown, Menu, Button } from 'antd'; import { DownOutlined } from '@ant-design/icons'; import 'antd/dist/antd.css'; ``` 然后,在表格的columns定义操作列,并使用Dropdown和Menu组件来定制操作菜单: ```jsx const columns = [ ...其他列定义, { title: '操作', key: 'action', render: (text, record) => ( <Dropdown overlay={menu}> <Button> 操作 <DownOutlined /> </Button> </Dropdown> ), }, ]; const menu = ( <Menu> <Menu.Item key="1"> <a target="_blank" rel="noopener noreferrer" href="#"> 编辑 </a> </Menu.Item> <Menu.Item key="2"> <a target="_blank" rel="noopener noreferrer" href="#"> 删除 </a> </Menu.Item> </Menu> ); ``` 以上代码,columns定义了表格的列,其操作列使用render属性来渲染。在render方法,我们使用Dropdown组件来包裹Button,并将Menu作为overlay传入。 menu定义了操作菜单的内容,其使用Menu.Item来定义菜单项,通过设置key属性来区分不同的菜单项。菜单项可以是一段文本或者其他React元素,这里我们使用a标签来模拟菜单项的操作。 最后,在Table组件将columns配置为表格的列: ```jsx <Table columns={columns} dataSource={data} /> ``` 以上是在React使用Ant Design的Table组件添加操作列并结合Dropdown和Menu的写法,通过这种方式,我们可以方便地在表格定制各种操作的菜单。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值