【发布时间】:2020-05-06 04:10:15
【问题描述】:
当从 onClick 事件处理程序调用时,无法通过异步函数持久化更改。 我有我正在调用的函数:
retrieveData = async () =>{
try {
console.log(1)
console.log(this.state.ID)
const url = this.baseUrl + "api/" + this.state.ID
let response = await fetch(url, {mode: "cors"})
const data = await response.text()
this.setState({testVal: data})
console.log(data)
} catch (e) {
console.error(e)
}
}
当我将其内容放入 componentDidMount() 并对状态 ID 进行硬编码时,上述函数起作用。但不是当我尝试像这样调用检索到的数据函数时,所以我假设以下 sn-p 是错误所在。
render() {
return(
<div>
<div>
<form>
<label>
ID:
<input type="text" onChange={e => this.setState({ID: e.target.value})}/>
</label>
<input type="submit" onClick={async () =>{await this.retrieveData();}}/>
</form>
</div>
<div>
{this.state.ID}
{this.state.testVal}
</div>
</div>
);
}
我对 reactJS 还很陌生,所以我相信这很简单。当我点击提交按钮时,我看到控制台吐出1,然后是我刚刚输入的ID,然后两者立即消失。当我检查是否发生了 fecth 时,我没有看到任何对 api 的调用,就像我使用带有 componentDidMount() 的硬编码 url 进行测试时一样,但我希望能够接受用户输入,只是有点不确定如何去做。我相信我已经检查了我能找到的每一个 SO 问题,所以我真的迷路了。如果需要更多信息,请告诉我,谢谢。
【问题讨论】:
-
我建议为每个异步操作添加一个 try/catch 并检查是否发生任何错误。添加
{mode: "cors"}将无法解决您正在向其发出请求的服务器的各种 CORS 错误。这也可能在请求级别失败,在.text(),如果它不是文本,而是 application/json -
@AlexanderStaroselsky 我继续添加了 try catch,我没有收到任何错误,从我的角度来看,似乎 fetch 甚至从未尝试过。
-
您在开发者工具的网络选项卡中没有看到任何请求?
-
@AlexanderStaroselsky 我重新检查过,我需要尝试拍照,因为它发生得太快了。它确实发出了请求,但只是一瞬间,它出现在我的网络选项卡上,然后立即消失。
-
我会在几个我知道问题是什么的情况下提交答案。
标签: reactjs async-await onclick