Я добавляю дополнительную информацию здесь, так как мне нужно было сделать дополнительные вещи, чтобы мой код работал.
Ответы, приведенные выше, ответили на мой вопрос, но я должен был сделать некоторые дополнительные действия для содержащихся компонентов, чтобы сделать так, как мне нужно, например,
- доступ к «this» в компонентах, когда SearchForm вызывает обратный вызов (т. е. метод handleFormSubmit компонентов)
- отображает начальное значение в поле ввода SearchForm в одном из случаев (то есть на странице результатов поиска показывают критерии, переданные ему)
Повторно используемый компонент, определенный как функция с крючками (https://reactjs.org/docs/hooks-intro.html)
import React, { useState } from 'react';
export default function SearchForm (props) {
// if a value was passed into this component, use it as the initial search criteria
const [searchCriteria, setSearchCriteria] = useState(props.value ? props.value : '');
const handleSubmit = (evt) => {
evt.preventDefault();
if (searchCriteria.length > 0){
props.onFormSubmit(searchCriteria)
}
}
return (
<form onSubmit={handleSubmit}>
<input type="text"
value={searchCriteria}
onChange={(event) => setSearchCriteria(event.target.value)}/>
<button />
</form>
);
}
Использование 1: Поле поиска в заголовок : при отправке формы она перенаправляется на «страницу результатов поиска»
import React from 'react';
import { withRouter} from 'react-router-dom';
import SearchForm from './SearchForm'
class SearchBox extends React.Component {
componentDidMount() {
// bind the SearchForm's callback method, so in "handleFormSubmit" we can use "this"
this.handleFormSubmit = this.handleFormSubmit.bind(this);
}
handleFormSubmit(criteria){
this.props.history.push('/searchresultspage/'+ criteria)
}
render() {
return (
<SearchForm onFormSubmit={this.handleFormSubmit} />
);
}
}
// The following is needed so that the "this.props.history.push" in "handleSumbit" causes routing to happen
export default withRouter(SearchBox)
Использование 2: окно поиска на странице результатов поиска
- при первом отображении страницы результатов поиска ее поле поиска должно содержать критерии поиска, переданные этой странице (т. Е. Из поля поиска в заголовке)
- поиск должен быть выполнен и результаты отображаются
- пользователь может изменить выполнить поиск в поле поиска и выполнить новый поиск
Код:
import React from 'react';
import SearchForm from './SearchForm'
export default class SearchResultsPage extends React.Component {
state = {
searchResults: [],
}
componentDidMount() {
// bind the SearchForm's callback method, so in "handleFormSubmit" we can use "this"
this.handleFormSubmit = this.handleFormSubmit.bind(this);
this.performSearch(this.props.criteria);
}
handleFormSubmit(criteria){
this.performSearch(criteria)
}
performSearch(criteria) {
// do whatever to do a search and get results (e.g. store in this.state.searchResults)
}
render() {
return (
<div>
{/* Pass the initial search criteria to the search form */}
<SearchForm value={this.props.criteria} onFormSubmit={this.handleFormSubmit} />
{/* do whatever to display the "this.state.searchResults */}
</div>
);
}
}