实时搜索是一种在用户输入时动态获取并显示搜索结果的技术,它通过以下方式工作:
import React, { useState, useEffect } from 'react';
function RealTimeSearch() {
const [query, setQuery] = useState('');
const [results, setResults] = useState([]);
const [loading, setLoading] = useState(false);
useEffect(() => {
if (query.trim() === '') {
setResults([]);
return;
}
const timer = setTimeout(() => {
fetchData(query);
}, 300); // 防抖延迟
return () => clearTimeout(timer);
}, [query]);
const fetchData = async (searchTerm) => {
setLoading(true);
try {
const response = await fetch(`/api/search?q=${encodeURIComponent(searchTerm)}`);
const data = await response.json();
setResults(data);
} catch (error) {
console.error('Error fetching data:', error);
} finally {
setLoading(false);
}
};
return (
<div>
<input
type="text"
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Search..."
/>
{loading && <div>Loading...</div>}
<ul>
{results.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
</div>
);
}
export default RealTimeSearch;
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function RealTimeSearch() {
const [query, setQuery] = useState('');
const [results, setResults] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
useEffect(() => {
const cancelToken = axios.CancelToken.source();
if (query.trim() === '') {
setResults([]);
return;
}
const timer = setTimeout(() => {
fetchData(query, cancelToken);
}, 300);
return () => {
clearTimeout(timer);
cancelToken.cancel('Operation canceled due to new request.');
};
}, [query]);
const fetchData = async (searchTerm, cancelToken) => {
setLoading(true);
setError(null);
try {
const response = await axios.get(`/api/search`, {
params: { q: searchTerm },
cancelToken: cancelToken.token
});
setResults(response.data);
} catch (err) {
if (!axios.isCancel(err)) {
setError('Failed to fetch results');
console.error('Error:', err);
}
} finally {
setLoading(false);
}
};
return (
<div>
<input
type="text"
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Search..."
/>
{loading && <div>Loading...</div>}
{error && <div style={{ color: 'red' }}>{error}</div>}
<ul>
{results.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
</div>
);
}
export default RealTimeSearch;
原因: 没有实现防抖或防抖时间设置不合理 解决: 使用防抖技术,合理设置延迟时间(通常300-500ms)
原因: 请求返回顺序不确定,可能导致旧请求结果覆盖新请求 解决: 使用取消令牌取消之前的请求,或比较请求ID
原因: 大数据量返回或复杂渲染导致 解决:
原因: 前端和后端不在同一域名下 解决:
通过以上实现和优化,你可以构建一个高效、可靠的实时搜索功能,提升应用的用户体验。
没有搜到相关的文章