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

React中如何基于状态实现复选框过滤展示接口返回数据的功能

实现方案

步骤1:绑定复选框与publisher状态,实现勾选状态同步

首先编写状态更新函数,同步复选框的勾选结果到publisher状态:

const handlePublisherChange = (e) => {
  const { name, checked } = e.target;
  setPublisher(prev => ({
    ...prev,
    [name]: checked
  }));
};

编写复选框的JSX结构,注意input的name属性要和publisher状态的键一一对应:

<div className="checkbox-group">
  <label>
    <input
      type="checkbox"
      name="Nin"
      checked={publisher.Nin}
      onChange={handlePublisherChange}
    />
    Nintendo
  </label>
  <label>
    <input
      type="checkbox"
      name="MS"
      checked={publisher.MS}
      onChange={handlePublisherChange}
    />
    Microsoft
  </label>
  <label>
    <input
      type="checkbox"
      name="SN"
      checked={publisher.SN}
      onChange={handlePublisherChange}
    />
    Sony
  </label>
</div>

步骤2:基于状态生成过滤后的展示数据

不直接修改原始的data状态(保留全量基准数据),使用useMemo派生过滤后的结果,依赖项变化时才会重新计算,避免不必要的重复过滤,1000条量级的数据性能完全足够。
首先定义状态键和发行商全称的映射关系:

const publisherMap = {
  Nin: "Nintendo",
  MS: "Microsoft",
  SN: "Sony"
};

使用useMemo计算过滤结果:

// 组件顶部先引入useMemo
import { useMemo } from 'react';

// 组件内部计算过滤后的数据
const filteredData = useMemo(() => {
  // 提取所有被选中的发行商全称
  const selectedPublishers = Object.entries(publisher)
    .filter(([_, isChecked]) => isChecked)
    .map(([key]) => publisherMap[key]);
  
  // 没有勾选任何复选框时返回全量数据
  if (selectedPublishers.length === 0) return data;
  
  // 过滤出匹配选中发行商的条目
  return data.filter(item => selectedPublishers.includes(item.Publisher));
}, [data, publisher]);

步骤3:渲染商品列表

把原有渲染逻辑中用的data替换成上面生成的filteredData即可:

<div className="product-list">
  {filteredData.map(item => (
    <div key={item.id} className="product-card">
      {/* 原有卡片渲染逻辑 */}
      <h3>{item.productName}</h3>
      <p>发行商:{item.Publisher}</p>
    </div>
  ))}
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:24:03