У меня есть чистое приложение React (без контейнера внешнего состояния), в котором я использую react-router. В этом приложении у меня есть компонент <SearchMain />, который содержит двух дочерних компонентов, компонент <Search />, в основном форму, содержащую элементы для выполнения поиска, и компонент <DisplayResults />, который отображает результаты в табличной форме.
Внутри компонента <Search /> у меня есть две кнопки, одна используется для отображения данных в табличной форме, а другая - для отображения данных в календарной форме. События onClick двух кнопок связаны с родительским компонентом <Search /> с помощью двух стрелочных функций, переданных как props, updateTableData и handleShowCalendar.
Обе функции выполняют поиск и сохраняют результат в this.state.searchResults. updateTableData показывает результаты в компоненте <DisplayResults />, handleShowCalendar хочет показать результаты в календаре из другого компонента <DisplayCalendar />, связанного с маршрутом '/ displayCalendar'.
Я хотел бы использовать декларативный компонент <Redirect /> вместо использования history.push(). В приведенном ниже решении я могу отправлять данные через строку запроса URL-адреса, но это не то решение, которое я ищу, я хотел бы передавать такие данные так же, как реквизиты передаются от родительских компонентов к дочерним. Я поискал информацию в Интернете, но не смог найти решения своей проблемы. Самое близкое, что я нашел, - это использовать
<Route
path='/displayCalendar'
render = {(props) => <DisplayCalendar {...props} searchResults = {this.state.searchResults} />}
/>
но как я могу программно изменить <Route /> и передать состояние моего компонента нажатием кнопки с помощью <Redirect />?
export class SearchMain extends React.Component<RouteComponentProps<{}>, State> {
constructor(props: any)
{
super(props);
this.state = {...};
...
}
...
updateTableData(searchParams: SearchParameters) {
this.makeRequest(searchParams);
}
handleShowCalendar(searchParams: SearchParameters) {
this.makeRequest(searchParams);
this.setState({
...this.state,
redirectToCalendar: true
});
}
public render() {
const { loading, showCalendar, redirectToCalendar, searchResults } = this.state;
if (redirectToCalendar)
return (<Redirect to = {{
pathname: '/displayCalendar',
search: JSON.stringify(this.state.searchResults)
}} />)
return (<div>
<Row>
<Search search = {(searchParams) =>
this.updateTableData(searchParams)} showCalendar = {(searchParams) => this.handleShowCalendar(searchParams)} />
{searchResults && <DisplayResults searchResults = {searchResults} /> }
</Row>
</div>);
}
Возможный дубликат Как передать параметры с помощью history.push в react-router v4?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проверьте stackoverflow.com/questions/44121069/… и stackoverflow.com/questions/44127739/…