reactjs - 我的搜索输入和分页没有触发 Reactjs 中的任何内容
问题描述
我对反应还很陌生。我的搜索输入和分页按钮没有触发任何内容,控制台中也没有出现任何内容,我的代码有什么问题?
我尝试将每个功能都放入App.js
其中以使其更清洁。
应用程序.js
import React, { Component } from "react";
import List from './List';
let API = 'https://swapi.co/api/people/';
class App extends Component {
constructor(props) {
super(props);
this.state = {
results: [],
search: '',
currentPage: 1,
todosPerPage: 3
};
this.handleClick = this.handleClick.bind(this);
this.updateSearch = this.updateSearch.bind(this);
}
componentWillMount() {
this.fetchData();
}
fetchData = async () => {
const response = await fetch(API);
const json = await response.json();
this.setState({ results: json.results });
};
handleClick(event) {
this.setState({
currentPage: Number(event.target.id)
});
}
updateSearch(event) {
this.setState({
search: event.target.value.substr(0, 20)
});
}
render() {
return (
<div>
<List data={this.state} />
</div>
);
}
}
export default App;
List.js
import React, { Component } from 'react';
import Person from './Person';
class List extends Component {
render() {
const { data } = this.props;
const { results, search, updateSearch, handleClick, currentPage, todosPerPage } = data;
const indexOfLastTodo = currentPage * todosPerPage;
const indexOfFirstTodo = indexOfLastTodo - todosPerPage;
const currentTodos = results.slice(indexOfFirstTodo, indexOfLastTodo).filter(item => {
return item.name.toLowerCase().indexOf(search) !== -1;
});
const renderTodos = currentTodos.map((item, number) => {
return (
<Person item={item} key={number} />
);
});
const pageNumbers = [];
for (let i = 1; i <= Math.ceil(results.length / todosPerPage); i++) {
pageNumbers.push(i);
}
const renderPageNumbers = pageNumbers.map(number => {
return (
<li className="page-link" key={number} id={number} onClick={handleClick} style={{cursor: "pointer"}}>{number}</li>
);
});
return (
<div className="flex-grow-1">
<h1>Personnages de Star Wars</h1>
<form className="mb-4">
<div className="form-group">
<label>Rechercher</label>
<input
className="form-control"
type="text"
placeholder="luke skywalker..."
value={search}
onChange={updateSearch}
/>
</div>
</form>
<div className="row mb-5">{renderTodos}</div>
<nav aria-label="Navigation">
<ul id="page-number" className="pagination justify-content-center">{renderPageNumbers}</ul>
</nav>
</div>
);
}
}
export default List;
如果我输入它,输入的值不会改变一点,如果我右键单击页码,控制台会得到我Uncaught DOMException: Failed to execute 'querySelectorAll' on 'Element': '#4' is not a valid selector.
任何想法 ?
解决方案
问题是,在List
课堂上你尝试取走updateSearch
和handleClick
取走data
(反过来来自this.props
)。但是updateSearch
和handleClick
从来没有放在里面data
。如果您将这些方法中的任何一个记录到控制台,您将看到它们是未定义的。
要解决此问题,您需要传递updateSearch
和handleClick
from App
to List
。你可以通过在data
props 中包含方法,或者直接将它们作为它们自己的 props 传递(我会推荐)来做到这一点。
例如,您可以将 的render
方法更改为App
如下所示:
render() {
return (
<div>
<List
data={this.state}
updateSearch={ this.updateSearch }
handleClick={ this.handleClick }
/>
</div>
);
}
然后在你的render
方法中List
可以这样做:
const { data, updateSearch, handleClick } = this.props;
并从下面的解构中删除这两种方法的定义data
。
推荐阅读
- ubuntu - 无法使用 dpkg 在 Ubuntu 中安装任何软件包,出现“软件包架构与系统不匹配”
- reactjs - 单击时将表格行数据传递给子组件
- r - ggplot2:添加尺寸图例和颜色图例:只有一个自动出现
- angular - 来自 Angular 应用程序和 msal 的 Azure AD B2C:加载自定义 UI Html
- c# - SQL 服务器连接到 ASP.NET Core 网站
- java - 如何创建分组的 Swagger 注释 - 此位置不允许注释
- php - 当我在 PHP 中使用 json_decode 解码以下数据时出现 Invalid json 错误
- keras - 语音识别中的描述文本
- elasticsearch - 在弹性搜索中使用 match_phrase_prefix 未获得匹配
- google-bigquery - Query History on BigQuery Last 3 Months