本文详解如何在 react 中为含多层结构的数据(如分组+选项列表)构建精准、可复原的搜索功能,支持按子项字段模糊匹配,并解决清空输入后无法恢复原始数据的关键问题。
在 React 应用中,对嵌套结构(如 groups → options → label)实现搜索时,常见误区是直接覆盖原始数据源,导致清空搜索框后无法还原完整列表。正确做法是:始终保留原始数据(groups)作为唯一可信源,仅在渲染时动态过滤,而非修改状态中的数据结构。
以下是一个健壮、可维护的实现方案:
import React, { useState } from "react";
const groups = [
{
name: "Male 9 A",
options: [
{ label: "Team 1", selected: false },
{ label: "Team 2", selected: false },
{ label: "Team 3", selected: false },
{ label: "Team 4", selected: false },
{ label: "Team 5", selected: false }
]
},
{
name: "Male 9 B",
options: [
{ label: "Team 1B", selected: false },
{ label: "Team 2B", selected: false },
{ label: "Team 3B", selected: false },
{ label: "Team 4B", selected: false },
{ label: "Team 5B", selected: false }
]
}
];
export default function App() {
const [searchTerm, setSearchTerm] = useState("");
// ? 核心搜索逻辑
:返回过滤后的 groups 副本
const filteredGroups = searchTerm
? groups
.filter((group) =>
group.options.some((option) =>
option.label.toLowerCase().includes(searchTerm.toLowerCase())
)
)
.map((group) => ({
name: group.name,
options: group.options.filter((option) =>
option.label.toLowerCase().includes(searchTerm.toLowerCase())
)
}))
: groups; // 清空时还原全部数据
return (
setSearchTerm(e.target.value)}
placeholder="Search teams (e.g., 'Team 1B')"
/>
Search Results:
{JSON.stringify(filteredGroups, null, 2)}
);
}⚠️ 关键注意事项
通过这种「状态最小化 + 衍生计算」的设计,你的搜索功能将兼具准确性、可维护性与用户友好性。