![](/img/trans.png)
[英]Why my code is not fetching updated details from API's even after changing state in React JS?
[英]Why my state value is not updated in fetching url
我想在搜索按鈕被點擊時獲取數據,為此我做了一個函數,我改變了數據的狀態,然后我獲取了數據。 但問題出在我提供的獲取鏈接中,它取的是該數據狀態的初始值,而不是單擊搜索按鈕后更改的值。 代碼:
<form className="d-flex">
<input
onChange={(e) =>
this.setState({ instant_data: e.target.value })
}
className="form-control me-2"
type="search"
placeholder="Search"
aria-label="Search"
/>
<button
className="btn btn-outline-success"
type="submit"
onClick={this.searchNews}
>
Search
</button>
</form>
constructor() {
super();
this.state = {
instant_data: "",
data: "",
search_data: [],
};
}
searchNews = async (e) => {
e.preventDefault();
this.setState({
data: this.state.instant_data,
});
const link = `https://newsapi.org/v2/everything?q=${this.state.data}&apiKey=API_KEY`;
const raw_data = await fetch(link);
const data = await raw_data.json();
console.log(data);
};
這是因為 this.setState 不是立即更改,有時需要一些時間來設置它所以你不應該使用this.state.data
而是使用this.state.instant_data
代替:
const link = `https://newsapi.org/v2/everythingq=${this.state.instant_data}&apiKey=API_KEY`;
從文檔中;
setState() 不會立即改變
this.state
而是創建一個掛起的狀態轉換。 調用此方法后訪問this.state
可能會返回現有值。 無法保證對 setState 調用的同步操作,並且可能會批量調用以提高性能。
建議 -> 傳遞回調函數:
this.setState({
data: this.state.instant_data,
}, () => {
const link = `https://newsapi.org/v2/everything?q=${this.state.data}&apiKey=API_KEY`;
const raw_data = await fetch(link);
const data = await raw_data.json();
console.log(data);
});
將您的輸入更改為:
<input
onChange={(e) => this.setState({ instant_data: e.target.value })}
className="form-control me-2"
type="search"
placeholder="Search"
aria-label="Search"
value={this.state.instant_data} <--- added this here
/>
並將您的searchNews
功能更改為:
searchNews = async (e) => {
e.preventDefault()
const link = `https://newsapi.org/v2/everything?q=${this.state.instant_data}&apiKey=API_KEY`
const raw_data = await fetch(link)
const data = await raw_data.json()
console.log(data)
}
要旨
// this is async operation
this.setState({
data: this.state.instant_data,
});
所以你最終先調用然后更新狀態變量data
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.