Итак, у меня есть три компонента (Search, Pages, HanddlesApi) плюс App.js, и я передаю реквизиты через функции другим дочерним компонентам без проблем.
Компонент Search передает свое состояниеuserInput для компонента HandleApi и обновляет API, используя componentDidUpdate. (это прекрасно работает, np здесь).
Я добавил компонент Pages, чтобы обновить номер страницы API, чтобы пользователь мог переходить между страницами контента. Это работает, но с проблемами. Пользователь может выполнять поиск и циклически обрабатывать страницы, но если они введут новый запрос, они окажутся на том же номере страницы нового запроса. Например, если я искал «утки» и переходил на следующую страницу (2). Затем выполнил поиск «собак», которые попадали бы на вторую страницу «собак»
Поэтому мой вопрос заключается в том, как сбросить состояние для моего компонента «Страницы», только когда пользователь вводит новый запрос?
Я видел, что componentWillReceiveProps устарел, поэтому я не могу его использовать. getDerivedStateFromProps показалось, что это может быть хорошей идеей, но из того, что я прочитал, его следует использовать только в редких случаях.
Итак, два наиболее вероятных варианта - это использовать componentDidUpdate так, как я этого не делаю. понимать или использовать ключ?
В общем, я просто не понимаю, что делать
В моем компоненте HanddlesApi я передаю следующее в API:
q: this.props.inputValue ? this.props.inputValue : 'news',
page: this.props.pageNum ? this.props.pageNum: 0
затем ..
componentDidMount() {
this.fetchNews()
}
componentDidUpdate(prevProps, prevState) {
if (this.props.inputValue !== prevProps.inputValue || this.props.pageNum !== prevProps.pageNum) {
this.setState({
news: []
}, this.fetchNews);
}
}
Затем в моем компоненте страниц у меня есть
import React, { Component } from 'react'
class Pages extends Component {
constructor(props) {
super(props)
this.state = {
nextPage: 1,
prevPage: 0
}
}
handleNextClick = () => {
this.setState({
nextPage: this.state.nextPage + 1,
})
}
handlePrevClick = () => {
this.setState({
prevPage: this.state.prevPage - 1,
})
}
render() {
return (
<div className='pageNav'>
<button className="PrevButton" onClick={() => {
this.handlePrevClick()
this.props.onNextButtonClick(this.state.prevPage)
}}>Previous </button>
<button className="nextButton" onClick={() => {
this.handleNextClick()
this.props.onNextButtonClick(this.state.nextPage)
}}>Next </button>
</div>
)
}
}
export default Pages
Компонент поиска
import React, { Component } from 'react';
class SearchBar extends Component {
constructor(props) {
super(props)
this.state = {
inputValue: ""
}
}
handleChange = (e) => {
this.setState({
inputValue: e.target.value
})
}
handleSubmit = (e) => {
e.preventDefault()
this.props.onSubmittedSearch(this.state.inputValue)
}
render() {
//{this.props.onSubmittedSearch(this.state.inputValue)}
return (
<section>
<form onSubmit={this.handleSubmit}>
<label htmlFor="searching"></label>
<input type="text" placeholder="Search Something" value={this.state.inputValue} onChange={this.handleChange} />
<button type="submit">Search </button>
</form>
</section>
)
}
}
export default SearchBar
App.js
class App extends Component {
constructor(props) {
super(props)
this.state = {
inputValue: null,
pageNum: 1
}
}
// used to pass props from SearchBar to NewsList
onSubmittedSearch = (inputValue) => {
this.setState({
inputValue: inputValue
})
}
onNextButtonClick = (pageNum) => {
this.setState({
pageNum: pageNum
})
}
render() {
return (
<main>
<SearchBar onSubmittedSearch={this.onSubmittedSearch} />
<NewsList inputValue={this.state.inputValue} pageNum={this.state.pageNum} />
<Pages onNextButtonClick={this.onNextButtonClick} />
<Footer />
</main>
)
}
}
export default App;