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

React结合Strapi GraphQL场景下移除重复JSX元素的方案咨询

解决方案

两种实现方式都可行,可根据你的项目改造成本选择:

优先推荐:GraphQL层面处理

因为proposals和chatRequests字段完全一致,仅业务场景有区分,你可以在Strapi后端自定义一个聚合查询,直接将两个表的数据合并后按id去重再返回前端。这种方式可以减少无效数据传输,也降低前端的计算负担,是长期维护成本最低的方案。

次选:前端JS层面处理

如果暂时不想调整后端查询逻辑,也可以在前端完成去重,但不要先转成JSX元素再过滤,应该先对原始接口返回的数据去重后再渲染为JSX,实现起来更简单性能也更好:

// 合并接口返回的两个原始数据数组
const mergedRawData = [...proposals, ...chatRequests]
// 基于全局唯一的id字段去重,调整数组顺序可以控制重复时保留哪一侧的条目
const uniqueData = Array.from(new Map(mergedRawData.map(item => [item.id, item])).values())
// 统一渲染为卡片组件,注意key直接用item.id不要用遍历index,避免渲染异常
const cardList = uniqueData.map(item => (
  <ChatListCard
    key={item.id}
    prop1={item.prop1}
    prop2={item.prop2}
    prop3={item.prop3}
  />
))

如果你一定要在拼接后的JSX数组上做过滤也可以实现,但不推荐,性能更差且依赖卡片组件传入id属性,示例代码如下:

const idSet = new Set()
const filteredCards = [].concat(
  array1.map((item,index)=> <Card key={item.id} id={item.id} prop1={item.prop1} ... />),
  array2.map((item,index)=> <Card key={item.id} id={item.id} prop1={item.prop1} ... />)
).filter(card => {
  if (idSet.has(card.props.id)) return false
  idSet.add(card.props.id)
  return true
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 06:45:02