【发布时间】:2022-01-21 21:41:43
【问题描述】:
我有一个从快速服务器获取数据的反应应用程序。提取很好,数据显示正确,并且当用户输入与数据集中的某些内容匹配时,搜索功能正常运行。但是,如果用户随后删除了他们的输入,则数据集将不会返回到以前的状态,而是强制用户进行硬刷新。
我将如何解决这个问题,以便当用户删除输入(从“james”到“”)时,页面会过滤回所有数据?
function SearchForm({ data, setData }) {
/*TRACK USER INPUT INTO SEARCH BOX*/
const [searchValue, setSearchValue] = useState("");
/*FRONT END: FILTER THROUH DATA TO FIND MATCHES TO SEARCH VALUE*/
const searchVehicles = (data, searchValue) => {
const searchedValue = searchValue.toUpperCase();
const result = data.filter(
(currenttable) =>
currenttable.last_name.toUpperCase().includes(searchedValue) ||
currenttable.first_name.toUpperCase().includes(searchedValue) ||
currenttable.store.toUpperCase().includes(searchedValue)
);
if (searchValue) {
setData(result);
console.log(result);
} else {
setData(data)
}
};
/*CALL THE FUNCTION WHEN INPUT IS ENETERED*/
const handleChange = (event) => {
setSearchValue(event.target.value);
searchVehicles(data, event.target.value);
console.log(searchValue)
};
/*RESET THE SEARCH BAR AND RENDER ALL DATA */
const handleReset = () => {
setSearchValue("");
};
/*OUTPUT */
return (
<form>
<label htmlFor="search">Search: </label>
<input
className="search-applicant"
type="text"
name="search"
placeholder="Search applicant or store"
onChange={event => handleChange(event)}
value={searchValue}
></input>
<button className="search-btn" onClick={handleReset}>
Refresh
</button>
</form>
);
}
export default SearchForm;
【问题讨论】:
-
一目了然,为什么不用钩子呢? useEffect(() => { setData(data.filter((currenttable) => currenttable.last_name.toUpperCase().includes(searchedValue) || currenttable.first_name.toUpperCase().includes(searchedValue) || currenttable.store。 toUpperCase().includes(searchedValue))) }, [searchValue]) 你可以完全删除 searchVehicle 函数及其调用编辑:我忘记了 toUpperCase 调用,但你明白了
-
清理并简化了代码,但并没有解决主要问题。当您删除表单条目时,页面不会重置,它仍保留在过滤后的版本中
-
当我有机会看看能不能搞清楚的时候,我会尝试做一个快速演示!
标签: reactjs search filter event-handling render