You need to enable JavaScript to run this app. React 如何通过复选框组件实现按状态筛选展示表格数据
优惠活动
大模型
产品
解决方案
定价
更多

React 如何通过复选框组件实现按状态筛选展示表格数据

实现步骤

1. 对齐状态值映射,避免大小写匹配失效

首先把复选框选项值和本地JSON的STATUS字段值做统一映射,避免因为大小写不一致(比如复选框存的是小写pending,JSON里是"Pending")导致筛选失效:

// 统一状态映射规则
const STATUS_VALUE_MAP = {
  all: "all",
  pending: "Pending",
  "in progress": "In Progress",
  dispensed: "Dispensed"
}

2. 完善复选框的状态存储与交互逻辑

你已经为复选框绑定了组件状态,这里建议把所有筛选项的勾选状态存在同一个状态对象里,比散落存多个独立状态更好维护,同时处理“全部”选项和其他单项的联动逻辑:

import { useState } from 'react'
// 组件内状态:存储每个筛选项的勾选状态,默认选中“全部”
const [selectedFilters, setSelectedFilters] = useState({
  all: true,
  pending: false,
  "in progress": false,
  dispensed: false
})

// 复选框变更的事件处理函数
const onFilterToggle = (e) => {
  const { name, checked } = e.target
  setSelectedFilters(prev => {
    // 处理点击“全部”的场景
    if (name === STATUS_VALUE_MAP.all) {
      return checked
        // 勾选全部时,取消其他所有单选项的选中
        ? { all: true, pending: false, "in progress": false, dispensed: false }
        // 取消全部勾选时,保留原有状态不做改动
        : prev
    }
    // 处理点击单个状态选项的场景
    const nextState = { ...prev, all: false, [name]: checked }
    // 如果所有单选项都被取消勾选,自动切回“全部”选中状态
    const hasAnySingleSelected = Object.keys(nextState)
      .filter(key => key !== "all")
      .some(key => nextState[key])
    if (!hasAnySingleSelected) nextState.all = true
    return nextState
  })
}

对应的MUI复选框绑定要注意把每个Checkbox的name属性设成和上面状态对象的key完全一致:

// 举个单个复选框的绑定示例
<FormControlLabel
  control={
    <Checkbox
      name="pending"
      checked={selectedFilters.pending}
      onChange={onFilterToggle}
    />
  }
  label="待处理"
/>

3. 实现表格数据的动态筛选

用useMemo根据当前选中的筛选条件,从本地原始JSON数据中过滤出需要展示的表格行,避免重复遍历带来的性能损耗:

import { useMemo } from 'react'
// 假设rawPatientData是你引入的本地JSON文件中的全量患者表格数据
const renderTableRows = useMemo(() => {
  // 如果“全部”处于选中状态,直接返回全量原始数据
  if (selectedFilters.all) return rawPatientData
  // 收集所有被勾选的单状态对应的实际STATUS值
  const matchedStatusList = Object.keys(selectedFilters)
    .filter(key => key !== "all" && selectedFilters[key])
    .map(key => STATUS_VALUE_MAP[key])
  // 过滤出STATUS在匹配列表内的行
  return rawPatientData.filter(row => matchedStatusList.includes(row.STATUS))
}, [rawPatientData, selectedFilters])

最后把表格组件的渲染数据源,从原来的rawPatientData替换成上面计算得到的renderTableRows即可。

开发注意事项:

  • 逐行核对本地JSON内STATUS字段的实际值(大小写、空格),确保和映射表内的值完全匹配,这是最常见的筛选失效原因
  • 补充筛选后的空状态逻辑,当匹配结果为空时展示对应的提示文案,避免渲染空白表格
  • 上述逻辑天然兼容多选场景(同时勾选待处理、进行中两个选项),不需要额外修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 02:57:03