因此,我使用 Next.js 并构建了一个带有输入的基本搜索页面,并将查询后的结果存储在状态数组中。问题是当我使用退格快速清除输入字段时,它会显示最后一个关键字的结果。
我相信我以错误的方式使用 React 状态。
这是我使用 meilisearch 查询搜索的方式:
const [search, setSearch] = useState([]);
const [showSearch, setShowSearch] = useState(false);
async function onChange(e) {
if (e.length > 0) {
await client.index('sections')
.search(e)
.then((res) => {
const list = res.hits.map((elm) => ({
title: elm.Title,
content: elm.formattedContent
}));
setSearch(list);
setShowSearch(true);
});
} else {
setSearch([]);
setShowSearch(false);
}
}
这是输入字段和搜索结果:
<div className="searchPage wrapper">
<input
type="text"
aria-label="Search through site content"
placeholder="Search your keywords"
onChange={(e) => onChange(e.target.value);}
/>
{showSearch && (
<div className="searchPageResults">
<p className="suggested">Top Results</p>
{search.length > 0 ? (
<ul>
{search.map((item, index) => (
<li key={`search-${index}`}>
<Link href={`/${item.slug}`}>
<a role="link">
{item.title}
</a>
</Link>
<p>{item.content}</p>
</li>
))}
</ul>
) : (
<p className="noResults">No results found</p>
)}
</div>
)}
</div>
防止这种情况的最佳做法是什么?
您可以在此处查看实时实施:https ://budgetbasics.openbudgetsindia.org/search
要重现该问题:
- 搜索一些东西,例如:
Budget
- 显示结果后,按住退格键,当字段被清除时,搜索结果显示为
b
- 如果我选择字段中的所有文本并使用退格键将其删除,则问题不存在。