javascript - React.js:为什么搜索过滤器不起作用?
问题描述
我正在尝试进行工作搜索输入。我正在通过Hooks/useCountries组件中的useEffect中获取的数据进行过滤,侦听App.js中的输入并在Searchbar组件 中为handleChange传递道具。有东西不见了,我不知道是什么。这是codesandbox和Hooks/useCountries组件的链接
import React, { useState, useEffect } from "react";
export default function useCountries(search) {
const [data, setData] = useState([]);
const [error, setError] = useState(null);
const fetchData = () => {
fetch("https://restcountries.eu/rest/v2/all")
.then((res) => res.json())
.then((result) => setData(result))
.catch((err) => console.log("error"));
};
useEffect(() => {
const searchResult =
data &&
data
.filter((item) => item.name.toLowerCase().includes(search))
.map((element) => <div>{element.name}</div>);
}, []);
useEffect(() => {
fetchData();
}, []);
return [data, error];
}
应用程序.js
import React, { useState } from "react";
import SearchBar from "./components/SearchBar";
import useCountries from "./Hooks/useCountries";
import MainTable from "./components/MainTable";
import "./App.scss";
export default function App() {
const [search, setSearch] = useState("");
const [data, error] = useCountries(search);
const handleChange = (e) => {
setSearch(e.target.value);
};
return (
<div className="App">
<SearchBar handleChange={handleChange} search={search} />
<MainTable countries={data} />
</div>
);
}
搜索栏组件
import React, { useState } from "react";
import "./SearchBar.scss";
export default function Searchbar({ handleChange, search }) {
return (
<div className="SearchBar">
<input
className="input"
type="text"
placeholder="search country ..."
value={search}
onChange={handleChange}
/>
</div>
);
}
解决方案
因此,在您的useCountries
钩子中,您需要更新 useEffect 以在搜索更改时触发。否则,它会在第一次加载钩子时运行,但以后不再运行。我也不完全确定您的逻辑试图在您当前的useEffect
. 我已经发布了一个可能的更新,它也将您的搜索更改为正则表达式,以解决用户可能不会输入小写字母的可能性。如果这不适用于您的用例,请告诉我,我可以调整它。
import React, { useState, useEffect } from "react";
export default function useCountries(search) {
const [data, setData] = useState([]);
const [error, setError] = useState(null);
const [searchResults, setSearchResults] = useState(null);
const fetchData = () => {
fetch("https://restcountries.eu/rest/v2/all")
.then((res) => res.json())
.then((result) => setData(result))
.catch((err) => console.log("error"));
};
useEffect(() => {
if (search) {
const searchCriteria = new RegExp(search, "i");
setSearchResults(
data
.filter((item) => searchCriteria.test(item.name))
.map((element) => <div>{element.name}</div>)
);
} else {
setSearchResults(null);
}
}, [search]);
useEffect(() => {
fetchData();
}, []);
return [data, error, searchResults];
}
在 App.js 中添加:
const [data, error, searchResults] = useCountries(search);
这是你的沙箱的分支,它适用于: CodeSandbox
推荐阅读
- asp.net - 如何将不同实体中的项目动态添加到 ASP.NET Core MVC 中的列表中
- wordpress - 如何编辑已经存在的 Wordpress 主题?
- node.js - mongodb匹配和组2查询合二为一
- json - 我如何在 artifactory 上托管 json 文件,artifcatory 可以用作网络服务器吗
- firebase - 颤振:FlutterFcmService - 致命:找不到回调
- batch-file - 尝试使用批处理将输入写入正在运行的控制台应用程序时出错
- react-native - 使用expo在react-native项目中基于多个条件禁用按钮
- javascript - json数据到treeview javascript
- r - R:lapply with data.table 慢,有更快的选择吗?
- python - 在python中计算每组相同的条目