У меня есть компонент, который всегда должен отображаться, но должен быть видимым, только если не найдено ни одного маршрута (<Iframe isVisible={ifNoRoutesMatched} />
).
Пока я не нашелхороший способ проверить, так ли это.Я пошел по этому ужасному пути установки переменной в состояние с обертками компонентов, но должен быть лучший способ !?Также для этого нужны withRouter
и PureComponent
, иначе catchAllWrapper
вызывает бесконечный цикл рендеринга:
class App extends PureComponent {
state = {
routeMatched: false,
}
catchAllWrapper = () => {
this.setState({ routeMatched: false });
return null;
}
routeWrapper = (RouteComponent) => {
const RouteWrapper = (props) => {
this.setState({ routeMatched: true });
return <RouteComponent {...props} />;
};
return RouteWrapper;
}
render() {
return (
<div className="App">
<Navigation />
<Switch>
<Route path="/chat" component={this.routeWrapper(Chat)} />
...more routes...
<Route component={this.catchAllWrapper} />
</Switch>
<Iframe isVisible={!this.state.routeMatched} />
</div>
);
}
}
export default withRouter(App);
Я бы предпочел сравнить ручной массив строк маршрута, чем добавить эту сложность!
this.props.match
содержит информацию только о том, какой маршрут соответствовал соответствующему компоненту, поэтому он довольно бесполезен.
Есть ли лучший способ сделать это?
Вариант использования: это iframe, у которого на некоторых маршрутах загружено устаревшее приложение, поэтому его не следует уничтожать и перерисовывать между маршрутами