javascript - 搜索引擎 - 状态值与输入值不同
问题描述
搜索引擎不起作用,即:当我输入例如奶牛时进入 devtools 和网络选项卡我有 http://api/Routes/Search?word = co 当我添加空格时我有:http:// api / Routes / Search?word = cow 和搜索,当我删除所有内容时,我得到:http:// api / Routes / Search?word = c,例如我将添加空格然后显示所有结果,因为它应该很奇怪......
<input type="text" placeholder="search.." value={this.state.search} onChange={this.searchingRoute} />
searchingRoute = (e) => {
this.setState({
search: e.target.value
})
if (this.state.search.length === 0) {
fetch(`http://api/Routes`, {
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + sessionStorage.getItem("access_token")
}
})
.then(response => {
if (response.ok) {
return response;
}
throw Error(response.status)
})
.then(response => response.json())
.then(data =>
this.setState({
route: [...data],
})
)
.catch(error => console.log(error))
}
fetch(`http://api/Routes/Search?word=${this.state.search}`, {
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + sessionStorage.getItem("access_token")
}
})
.then(response => {
if (response.ok) {
return response;
}
throw Error(response.status)
})
.then(response => response.json())
.then(data =>
this.setState({
route: [...data],
})
)
.catch(error => console.log(error))
}
解决方案
这setState
是异步代码,这就是为什么在您的searchingRoute
函数中的第一if
条语句中,它返回旧版本的搜索。
有两种方法可以处理:第一种方法:
searchingRoute = (e) => {
if (e.target.value.length === 0) {
...
}
}
第二种方法:
searchingRoute = (e) => {
this.setState({ search: e.target.value });
};
componentDidUpdate(prevProps, prevState) {
if (this.state.search !== prevState.search) {
this.handleSearch();
}
};
handleSearch = () => {
const { search } = this.state;
// handling search code...
}
此外,我建议在您的搜索中添加一个 debounce 方法,因为您不希望搜索查询您的服务器每个按下的字母,但在用户停止按下一个字母大约 1 秒或 500 毫秒之后。你可以在这里了解更多信息:在 React.js 中执行去抖动
推荐阅读
- spring-boot - 如何将 SQL 表与 elasticsearch 索引相关联?
- java - Log4j2 导出 XML 配置
- excel - 多个分节符 - 如何仅将页眉和页脚添加到第一个部分?
- entity-framework-core - EF Core:传递给 HasQueryFilter 的委托仅在使用配置类时调用一次。为什么?
- c - C编程:scanf后无意清除了输入缓冲区?
- typescript - Nestjs,我无法从模块的静态函数访问我的环境变量
- excel - 如何设置搜索条件,从数据透视表搜索数据,如果找到一个或所有标准,从数据透视表复制数据并在输出选项卡中过去
- azure-cosmosdb - Pymongo find_one_and_update 返回 null (Azure Cosmos DB)
- python - 如何在一个情节matplotlib中绘制不同的情节
- docker - 无法通过 LAN 连接到 docker 容器,只能连接 localhost