Один из возможных способов - использовать избыточность, но вы не указали, что хотите ее использовать.
Так что вы можете использовать этот другой способ, который я бы не предпочел обычному.
Вы можете передать функцию в качестве реквизита в маршрутизаторе
<Route exact path='/dev' render={(props) => (
<Developer {...props} getURL={this.getURLFromDeveloper}/>
)}/>
<Route path='/' render={(props) => (
<Launcher {...props} URL={this.state.URL}/>
)}/>
(способ передачи функции может меняться в зависимости от того, как вы внедрили маршрутизатор, который вы здесь не показали). Таким образом, функция getURLFromDeveloper () может быть связана с состоянием класса, отображающего маршруты.
getURLFromDeveloper(URL){
this.setState({URL})
}
Для ясности, родительский элемент обоих этих компонентов имеет URL-адрес переменной состояния, а также функцию getURLFromDeveloper (), которая передается в качестве опоры в компоненте маршрутизатора Developer. Когда URL-адрес изменяется в компоненте разработчика, позвоните
this.props.getURL(<new value of the URL>);
это вызовет функцию getURLFromDeveloper для родителя, которая изменит состояние родителя и запустит повторное рендеринг.
Теперь повторное рендеринг будет проходить по пути "/ dev", который является последним путем, который вы нажали в истории, поэтому вам нужно перейти по пути, который отображает компонент Launcher, чтобы получить доступ к новому значению this.props.URL
Редактировать: поскольку у вас есть отдельный файл Routes.js. Вы должны определить функцию getURLFromDeveloper () и состояние «URL», где вы визуализируете компонент Route в вашем приложении.
render(){
return (
<Routes getURL={this.getURLFromDeveloper} URL={this.state.URL}/>
)}
In Routes.js
const Routes = (props) => (
<Router>
<div>
<Route component={LauncherApp}/>
<Switch>
<Route exact path='/dev' render={(props) => (
<Developer {...props} getURL={props.getURL}/>
)}/>
<Route path='/' render={(props) => (
<Launcher {...props} URL={props.URL}/>
)}/>
</Switch>
</div>
</Router>
);