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

React中如何条件渲染全部、活跃、已完成三类待办事项列表?

实现待办事项列表切换的解决方案

核心思路

通过状态跟踪当前筛选类型,根据筛选条件过滤待办数组后再渲染,而非直接渲染全部数据。

具体实现步骤

  1. 添加筛选状态
    在组件内部定义状态记录当前选中的筛选类型,初始值设为'all'以默认显示全部事项:
import { useState } from 'react';

// ... 保留组件原有状态(如todos、bool等)
const [filter, setFilter] = useState('all');
  1. 编写过滤逻辑
    根据当前筛选状态,返回对应的待办事项数组:
const getFilteredTodos = () => {
  if (filter === 'active') {
    return todos.filter(item => !item.completed); // 筛选未完成的活跃事项
  } else if (filter === 'completed') {
    return todos.filter(item => item.completed); // 筛选已完成的事项
  }
  return todos; // 默认返回全部事项
};
  1. 修改渲染逻辑
    将原直接渲染todos的代码,替换为渲染过滤后的数组:
// 替换原有的todos.map部分
{
  getFilteredTodos().map((item, index) =>
    item.isEditing ? <TodoEditForm item={item} key={index} editTask={editTask} /> :
    <Todo item={item} key={index}
      toggleCompleted={toggleCompleted}
      removeTodo={removeTodo}
      toggleEdit={toggleEdit} />
  )
}
  1. 给切换按钮绑定事件
    为三个按钮添加点击事件,更新筛选状态:
<div className='toggle-todos-wrapper'>
  <button className="toggle-todos-button btn btn-light" onClick={() => setFilter('all')}>All</button>
  <button className="toggle-todos-button btn btn-light" onClick={() => setFilter('active')}>Active</button>
  <button className="toggle-todos-button btn btn-light" onClick={() => setFilter('completed')}>Completed</button>
</div>

完整修正后的组件return部分

return (
  <div className='card'>
    <TodoForm addTodo={addTodo} />
    <div className='list-group'>
      {
        getFilteredTodos().map((item, index) =>
          item.isEditing ? <TodoEditForm item={item} key={index} editTask={editTask} /> :
          <Todo item={item} key={index}
            toggleCompleted={toggleCompleted}
            removeTodo={removeTodo}
            toggleEdit={toggleEdit} />
        )
      }
    </div>
    <div className='toggle-todos-wrapper'>
      <button className="toggle-todos-button btn btn-light" onClick={() => setFilter('all')}>All</button>
      <button className="toggle-todos-button btn btn-light" onClick={() => setFilter('active')}>Active</button>
      <button className="toggle-todos-button btn btn-light" onClick={() => setFilter('completed')}>Completed</button>
    </div>
  </div>
)

问题说明

你之前尝试的三元运算符仅控制了"Active"/"Completed"文本的显示,未对渲染的待办数组做过滤,因此全部事项依然会显示。通过上述步骤,先根据筛选状态过滤数组,再渲染过滤后的结果,即可实现列表切换效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:03:17