You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+Material UI表格渲染SVG加密货币图标重复问题求助

解决React+Material UI表格中加密货币SVG图标重复的问题

问题原因

你遇到的图标重复问题,核心原因是map渲染时使用了数组索引作为key。React依赖key来区分列表中的不同元素,如果用索引当key,组件重新渲染时,React可能会复用之前的组件实例,导致图标没有正确更新,出现重复显示的情况。

另外,当前的图标匹配函数用多层if-else,虽然逻辑没问题,但可以优化得更简洁可靠。

解决方案

1. 替换列表渲染的key为唯一标识

把TableRow的key={id}改成key={row.currencyId},每个货币的ID是唯一的,能让React准确识别每一行元素:

{rows.map((row) => (
  <TableRow key={row.currencyId}>
    <TableCell component="th" scope="row">{find_corresponding_icon(row.currencyId)}</TableCell>
    <TableCell align="right">{row.tokenName}</TableCell>
    <TableCell align="right">{row.Amount}</TableCell>
  </TableRow>
))}

2. 优化图标匹配逻辑(可选,更健壮)

用对象映射代替if-else,代码更简洁,也能避免逻辑错误:

// 定义图标映射对象
const iconMap = {
  1: <EthIcon />,
  2: <DaiIcon />,
  3: <UsdtIcon />
};

// 替换原匹配函数
const getTokenIcon = (currencyId) => {
  return iconMap[currencyId] || null; // 无匹配时返回null或默认图标
};

表格中调用优化后的函数:

<TableCell component="th" scope="row">{getTokenIcon(row.currencyId)}</TableCell>

3. 确保SVG组件独立标识(兜底方案)

如果仍有问题,给每个SVG组件加上独立key,避免复用混淆:

const iconMap = {
  1: <EthIcon key="eth-icon" />,
  2: <DaiIcon key="dai-icon" />,
  3: <UsdtIcon key="usdt-icon" />
};

总结

最关键的修复是把列表key从索引换成唯一的currencyId,这能让React正确区分每一行元素,避免组件复用导致的图标重复。优化图标匹配逻辑可提升代码可维护性。

内容的提问来源于stack exchange,提问作者Anurag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:05:37