javascript - React 组件中的 onChange 未按预期运行
问题描述
我正在为一个简单的 React 应用程序编写一个组件,这是我的代码:
import React from "react";
import { Component } from "react";
import { Link } from "react-router-dom";
import Book from "./Book";
import * as BooksAPI from "./BooksAPI";
class SearchBooks extends Component {
state = {
query: "",
searchedBooks: []
};
updateQuery = query => {
this.setState({ query: query });
console.log(this.state.query);
if (this.state.query) {
BooksAPI.search(this.state.query).then(books => {
this.setState({ searchedbooks: books });
});
}
};
render() {
return (
<div className="search-books">
<div className="search-books-bar">
<Link className="close-search" to="/">
Close
</Link>
<div className="search-books-input-wrapper">
<input
type="text"
placeholder="Search by title or author"
value={this.state.query}
onChange={event => {
this.updateQuery(event.target.value);
}}
/>
</div>
</div>
<div className="search-books-results">
<ol className="books-grid">
{this.state.searchedBooks.map(book => (
<div key={book.id}>
<Book
book={book}
updateShelf={this.props.updateShelf}
updateBooks={this.props.updateBooks}
/>
</div>
))}
</ol>
</div>
</div>
);
}
}
export default SearchBooks;
它应该是一个搜索栏,当用户键入查询时列出从 API 返回的书籍我有两个问题。首先是当发送 API 调用时,查询不包含用户输入的最后一个字母。第二个即使调用 API 并返回 this.state.searchedBooks 数组仍然是空的。这是我第一次使用 React,所以我会感谢任何形式的帮助
解决方案
ReactsetState()
是一个异步函数。它是异步的,因为 React 可以将多个setState()
调用批处理在一起。
由于其性质,当您尝试使用this.state.query
aftersetState()
时,状态尚未更新。为了实现您的目标,您可以使用 的第二个参数setState()
,它在状态更新后充当回调函数。
this.setState({ query: query }, () => {
console.log(this.state.query);
if (this.state.query) {
BooksAPI.search(this.state.query).then(books => {
this.setState({ searchedbooks: books });
});
}
});
推荐阅读
- translation - 是否可以从翻译中创建新的 .po 文件?
- bash - 理解 shuf 工作原理的 bash 脚本问题
- vue.js - 不加载 Vuetify 安装
- c - 如何检查是否在 C 中正确释放了 struct 的内存?
- nginx - Nginx文件服务器典型配置
- java - Spring Boot API - 如何确保没有并发问题
- arrays - 在数组 mongodb 中使用 concat 的问题
- vue.js - Vue js如何使用从index.html到docs文件夹的路由
- javascript - 为什么跨站点使用限制 iframe DOM 访问?
- python - 我可以在python中的一行代码之间添加注释而不注释整行吗?