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

React实现Tab切换筛选指定Region对象数组数据的技术问询

实现Tab切换筛选数组元素

问题背景

我有一个对象数组,已经通过映射渲染出全部内容,现在需要实现Tab切换筛选功能:点击对应Tab(如'US'、'EU'等)时,只展示匹配对应region的数组元素。以下是我当前的JS逻辑和Tab组件代码,需要完善功能:

const showRegion = () =>  {
  if(selectedTab === 'us') {
    console.log(vendors.data.region)
  }
  if(selectedTab === 'ca') {
    console.log('YOU HIT THE ca TAB')
  }
  if(selectedTab === 'cb') {
    console.log('YOU HIT THE cb TAB')
  }
  if(selectedTab === 'eu') {
    console.log('YOU HIT THE eu TAB')
  }
  if(selectedTab === 'top') {
    console.log('YOU HIT THE top TAB')
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js">

  const [selectedTab, setSelectedTab] = useState(query.get('region') ?? 'all')
  
    <TabUnstyled
                  className={selectedTab === 'all' ? 'active' : ''}
                  value="all"
                  id="All"
                >
                  {width > 500 ? 'All Vendors' : 'All'}
                </TabUnstyled>
                <TabUnstyled
                  className={selectedTab === 'us' ? 'active' : ''}
                  value="us"
                  id="US"
                  
                >
                  {width > 500 ? 'United States Vendors' : 'United States'}
                </TabUnstyled>
                <TabUnstyled
                  className={selectedTab === 'ca' ? 'active' : ''}
                  value="ca"
                  id="CA"
                >
                  {width > 500 ? 'Canada-USD Vendors' : 'Canada-USD'}
                </TabUnstyled>
                <TabUnstyled
                  className={selectedTab === 'cb' ? 'active' : ''}
                  value="cb"
                  id="CB"
                >
                  {width > 500 ? 'Canada-CAD Vendors' : 'Canada-CAD'}
                </TabUnstyled>
                <TabUnstyled
                  className={selectedTab === 'eu' ? 'active' : ''}
                  value="eu"
                  id="EU"
                >
                  {width > 500 ? 'Europe Vendors' : 'Europe'}
                </TabUnstyled>
                <TabUnstyled
                  className={selectedTab === 'top' ? 'active' : ''}
                  value="top"
                  id="topVendorTab"
                >
                  {width > 500 ? 'Top Ocean Vendors' : 'Top Ocean'}
                </TabUnstyled>
</script>

解决方案

1. 给Tab添加点击事件,更新选中状态

给每个TabUnstyled组件添加点击事件,点击时调用setSelectedTab更新当前选中的Tab值:

<TabUnstyled
  className={selectedTab === 'all' ? 'active' : ''}
  value="all"
  id="All"
  onClick={() => setSelectedTab('all')}
>
  {width > 500 ? 'All Vendors' : 'All'}
</TabUnstyled>
<TabUnstyled
  className={selectedTab === 'us' ? 'active' : ''}
  value="us"
  id="US"
  onClick={() => setSelectedTab('us')}
>
  {width > 500 ? 'United States Vendors' : 'United States'}
</TabUnstyled>
// 其余Tab组件同理,依次添加onClick事件

2. 编写筛选逻辑,过滤数组

替换原来的showRegion函数,改成返回过滤后数组的逻辑,根据selectedTab的值筛选:

const filteredVendors = () => {
  // 选中'all'时返回全部数据
  if (selectedTab === 'all') {
    return vendors.data;
  }
  // 'top'标签单独处理,假设筛选isTop为true的供应商
  if (selectedTab === 'top') {
    return vendors.data.filter(vendor => vendor.isTop);
  }
  // 其他region标签匹配对应字段
  return vendors.data.filter(vendor => vendor.region === selectedTab);
};

3. 使用过滤后的数组渲染内容

在渲染供应商列表的位置,用filteredVendors()替代原数组进行映射:

{filteredVendors().map(vendor => (
  // 这里是你的供应商卡片/列表项渲染逻辑
  <div key={vendor.id}>{vendor.name}</div>
))}

完整优化后的逻辑示例

const [selectedTab, setSelectedTab] = useState(query.get('region') ?? 'all');

const filteredVendors = () => {
  if (selectedTab === 'all') return vendors.data;
  if (selectedTab === 'top') return vendors.data.filter(v => v.isTop);
  return vendors.data.filter(v => v.region === selectedTab);
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:40:38