为什么我的搜索栏结果在我使用 React API 键入时没有动态显示
Why are my search bar results not displaying dynamically as I type using React API
我有一个搜索栏,它获取输入值并通过 axios.get(/products/search?q={} ...) 和 [=44 将其发送到 API =]是可能产品的列表。
从技术上讲,returned 列表会在用户在搜索框中键入内容时显示。这对我不起作用。
如果我将应用 return 作为搜索输入查询,它会按预期逐个字母地显示它,但是当我尝试 return 数据地图时,它不会仅在重新加载页面时动态更新结果。
const SearchBar = () => {
const [data, setData] = useState([]);
const [query, setQuery] = useState("");
useEffect(() => {
const fetchData = async () => {
try {
const response = await axios.get(`/products/search?q=${query}`);
console.log(data.results);
setData(response.data);
} catch (error) {
console.log(error);
}
};
fetchData();
}, []);
const handleFilter = (event) => {
event.preventDefault();
const search = event.target.value
.toLowerCase()
.normalize("NFD") //.normalize and .replace help by ignoring diacriticals from the data field
.replace(/[\u0300-\u036f]/g, "");
// HERE IS WHERE I SET THE query FOR THE API
setQuery(search);
};
return (
// the Search box
<div className="search">
<div className="searchInputs">
<input type="text" placeholder="Search ..." onChange={handleFilter} />
</div>
{/* search result suggestions list */}
{query.length != 0 && (
<div className="dataResult">
{data.results.map((product, index) => {
return (
<a className="dataItem" key={product._id}>
{product.name}
</a>
);
})}
</div>
)}
</div>
);
};
export default SearchBar;
搜索啤酒:
对 React 组件进行任意更改并保存:
再次随机修改并保存到react组件
镜像输入 onChange,动态工作
由于您对查询进行了更改,您需要在 useEffect 挂钩中添加 [query] 作为第二个参数,以便在每次 query
更改时使组件 re-render。
您是否尝试将 query
添加为 useEffect
的依赖项?
像这样:
useEffect(() => {
// do something
}, [query]);
如果可行,请小心,因为每次用户写入任何字符时,它都会发送请求。最好使用一些弹跳或某种方式不要立即 运行 函数,而是在 2 秒后。 (setTimeout
可能)
我有一个搜索栏,它获取输入值并通过 axios.get(/products/search?q={} ...) 和 [=44 将其发送到 API =]是可能产品的列表。
从技术上讲,returned 列表会在用户在搜索框中键入内容时显示。这对我不起作用。
如果我将应用 return 作为搜索输入查询,它会按预期逐个字母地显示它,但是当我尝试 return 数据地图时,它不会仅在重新加载页面时动态更新结果。
const SearchBar = () => {
const [data, setData] = useState([]);
const [query, setQuery] = useState("");
useEffect(() => {
const fetchData = async () => {
try {
const response = await axios.get(`/products/search?q=${query}`);
console.log(data.results);
setData(response.data);
} catch (error) {
console.log(error);
}
};
fetchData();
}, []);
const handleFilter = (event) => {
event.preventDefault();
const search = event.target.value
.toLowerCase()
.normalize("NFD") //.normalize and .replace help by ignoring diacriticals from the data field
.replace(/[\u0300-\u036f]/g, "");
// HERE IS WHERE I SET THE query FOR THE API
setQuery(search);
};
return (
// the Search box
<div className="search">
<div className="searchInputs">
<input type="text" placeholder="Search ..." onChange={handleFilter} />
</div>
{/* search result suggestions list */}
{query.length != 0 && (
<div className="dataResult">
{data.results.map((product, index) => {
return (
<a className="dataItem" key={product._id}>
{product.name}
</a>
);
})}
</div>
)}
</div>
);
};
export default SearchBar;
搜索啤酒:
对 React 组件进行任意更改并保存:
再次随机修改并保存到react组件
镜像输入 onChange,动态工作
由于您对查询进行了更改,您需要在 useEffect 挂钩中添加 [query] 作为第二个参数,以便在每次 query
更改时使组件 re-render。
您是否尝试将 query
添加为 useEffect
的依赖项?
像这样:
useEffect(() => {
// do something
}, [query]);
如果可行,请小心,因为每次用户写入任何字符时,它都会发送请求。最好使用一些弹跳或某种方式不要立即 运行 函数,而是在 2 秒后。 (setTimeout
可能)