react模糊搜索怎么实现
实现React模糊搜索的方法
在React中实现模糊搜索通常需要结合输入框的状态管理和搜索算法。以下是几种常见的方法:
使用第三方库如Fuse.js
Fuse.js是一个轻量级的模糊搜索库,可以方便地集成到React项目中。
安装Fuse.js:

npm install fuse.js
示例代码:
import React, { useState } from 'react';
import Fuse from 'fuse.js';
const data = ['Apple', 'Banana', 'Orange', 'Mango'];
function SearchComponent() {
const [searchTerm, setSearchTerm] = useState('');
const fuse = new Fuse(data, {
keys: [''],
threshold: 0.4
});
const results = searchTerm ? fuse.search(searchTerm).map(result => result.item) : data;
return (
<div>
<input
type="text"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<ul>
{results.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
</div>
);
}
使用原生JavaScript实现简单模糊搜索
对于简单的模糊搜索需求,可以使用JavaScript的字符串方法实现。

import React, { useState } from 'react';
const data = ['Apple', 'Banana', 'Orange', 'Mango'];
function SearchComponent() {
const [searchTerm, setSearchTerm] = useState('');
const filteredData = data.filter(item =>
item.toLowerCase().includes(searchTerm.toLowerCase())
);
return (
<div>
<input
type="text"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<ul>
{filteredData.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
</div>
);
}
使用正则表达式实现更灵活的搜索
正则表达式可以提供更灵活的匹配模式。
import React, { useState } from 'react';
const data = ['Apple', 'Banana', 'Orange', 'Mango'];
function SearchComponent() {
const [searchTerm, setSearchTerm] = useState('');
const filteredData = data.filter(item => {
const regex = new RegExp(searchTerm, 'i');
return regex.test(item);
});
return (
<div>
<input
type="text"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<ul>
{filteredData.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
</div>
);
}
使用Debounce优化性能
对于大数据集,可以使用debounce技术减少搜索频率。
import React, { useState, useEffect } from 'react';
import { debounce } from 'lodash';
const data = [...]; // 大数据集
function SearchComponent() {
const [searchTerm, setSearchTerm] = useState('');
const [filteredData, setFilteredData] = useState(data);
const debouncedSearch = debounce(term => {
const results = data.filter(item =>
item.toLowerCase().includes(term.toLowerCase())
);
setFilteredData(results);
}, 300);
useEffect(() => {
debouncedSearch(searchTerm);
return () => debouncedSearch.cancel();
}, [searchTerm]);
return (
<div>
<input
type="text"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<ul>
{filteredData.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
</div>
);
}
对象数组的模糊搜索
当搜索对象数组时,可以指定要搜索的属性。
import React, { useState } from 'react';
import Fuse from 'fuse.js';
const data = [
{ name: 'Apple', category: 'Fruit' },
{ name: 'Carrot', category: 'Vegetable' },
{ name: 'Banana', category: 'Fruit' }
];
function SearchComponent() {
const [searchTerm, setSearchTerm] = useState('');
const fuse = new Fuse(data, {
keys: ['name', 'category'],
threshold: 0.4
});
const results = searchTerm ? fuse.search(searchTerm).map(result => result.item) : data;
return (
<div>
<input
type="text"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<ul>
{results.map((item, index) => (
<li key={index}>{item.name} - {item.category}</li>
))}
</ul>
</div>
);
}
这些方法可以根据具体需求选择使用,Fuse.js提供了最全面的模糊搜索功能,而简单场景下原生JavaScript实现可能更轻量。




