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

React中点击按钮筛选数组并展示结果功能不生效问题排查

问题原因

你的代码存在3个核心错误导致筛选功能异常:

  • 接口返回的id是数字类型,你在filter判断时用严格相等===和字符串'1'/'2'对比,类型不匹配永远筛选不到结果
  • 直接修改了存储接口原始全量数据的fetchData状态,筛选后全量数据会被覆盖,点击「Show all」也无法恢复完整列表
  • renderdata函数的else分支没有写return,无数据时不会渲染提示内容

修复后的完整代码

import React, {useEffect, useState} from "react";
import axios from 'axios';
import "./style.css";

export default function App() {
  // 保留原始全量数据,永远不修改
  const [originalData, setOriginalData] = useState([]);
  // 存储筛选后的数据,渲染用这个状态
  const [filteredData, setFilteredData] = useState([]);
  const [loading, setLoading] = useState(true);
  const [isError, setIsError] = useState(false);

  const url = 'https://jsonplaceholder.typicode.com/todos';

  useEffect(() => {
      let mounted = true;
      const loadData = async () => {
          try {
              const response = await axios(url);
              if (mounted) {
                  setOriginalData(response.data);
                  // 初始默认展示全部数据
                  setFilteredData(response.data);
                  setLoading(false);
                  setIsError(false);
              }
          } catch (err) {
              setIsError(true)
              setLoading(false);
              setOriginalData([]);
              setFilteredData([]);
              console.log(err);
          }
      };
      loadData();
      return () => {
          mounted = false;
      };
  },[url]);


  const renderdata = () => {
    if (filteredData.length) {
      return (
        <div>{filteredData.map(inner => {
          return (
            <React.Fragment key={inner.id}>
            <p>{inner.title}</p>
            </React.Fragment>
          )
        })}</div>
      )
    } else {
      // 补全return逻辑
      return <p>No data to display!</p>
    }
  }

  const handle1 = () => {
    // 用原始全量数据筛选,id改为数字匹配
    const result1 = originalData.filter((inner) => inner.id === 1);
    setFilteredData(result1);
  }

  const handle2 = () => {
    const result2 = originalData.filter((inner) => inner.id === 2);
    setFilteredData(result2);
  }

  const handleAll = () => {
    // 直接恢复原始全量数据
    setFilteredData(originalData);
  }


  return (
    <div>
      <button onClick={handleAll}>Show all</button>
      <button onClick={handle1}>Filter by id 1</button>
      <button onClick={handle2}>Filter by id 2</button>
      {renderdata()}
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:36:05