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

React列表项单选实现咨询:点击li触发过滤时如何设置单选

实现li元素单选功能的方案

你的代码逻辑上已经实现了单选——每次点击li时,filters.category会被更新为当前项的取值,同一时刻category只会存储一个选中的分类值,所以数据层面已经是单选模式。但目前缺少视觉反馈,用户无法直观看到哪个li处于选中状态,需要补充这部分实现。

1. 添加选中状态的视觉标识

给当前选中的li添加专属样式类,通过判断filters.category与li的取值是否匹配来动态设置类名:

// 先定义分类数组,避免重复代码
const categories = [
  'Access Control System',
  'Accessories',
  'Auto Door System',
  'Backup Battery',
  'Card & Weigand Reader',
  'CCTV Recorders',
  'CCTV Security Camera System',
  'Display Monitor',
  'Draka Cable',
  'IP PBX System'
];

// 渲染部分用map循环生成li
<ul>
  {categories.map(category => (
    <li
      key={category}
      onClick={makeFilter('category', category)}
      className={filters.category === category ? 'selected' : ''}
    >
      {category}
    </li>
  ))}
</ul>

然后在CSS中定义选中样式:

.selected {
  background-color: #f0f0f0;
  font-weight: 600;
  color: #2196f3;
  /* 可根据需求调整样式 */
}

2. 优化makeFilter函数(可选但推荐)

由于React的setState是异步操作,使用函数式更新可以确保拿到最新的state值,避免闭包导致的状态更新异常:

const makeFilter = (property, newFilterValue) => () => {
  setFilters(prevFilters => ({
    ...prevFilters,
    [property]: newFilterValue,
  }));
};

效果说明

完成以上修改后,点击任意li时:

  • 数据层面:filters.category会被设置为当前li的分类值,自动覆盖之前的选中项,实现单选逻辑
  • 视觉层面:被选中的li会应用selected样式,用户能清晰看到当前选中的分类

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:45:25