Вам нужно добавить exact
к вашим /
маршрутам, если вы не хотите видеть InputContainer
и StagesList
, пока вы находитесь на :stage_id
маршруте.
<div className="row">
<Route path='/' exact component={InputContainer}/>
<Route path='/' exact component={() => <StagesList todos={this.props.todos}/>} />
<Route path='/:stage_id' render={(props) => <Stage {...props} todos={this.props.todos}/>} />
</div>
В вашем компоненте Stage
также есть ошибка.
todo.id
- это целое число, но stage_id
- это строка.Чтобы исправить это, вы можете преобразовать оба в строку, например
let stage = todos.filter((todo) => String(todo.id) === String(id));
UPD:
Если вы хотите видеть компоненты StageList
и Stage
в любое время, вам нужно исправитьStage
компонент.Компонент Stage
обновляет свое значение state.stage
только один раз, когда срабатывает componentDidMount
.Все последующие обновления не обновляют значение stage.stage
.Вы можете реализовать метод componentWillReceiveProps
жизненного цикла и обновлять значение stage.stage
при каждом изменении реквизита.В качестве альтернативы вы не используете state.stage
и вычисляете значение stage
на лету в методе render
, например:
class Stage extends React.Component {
getStage = () => {
const todos = this.props.todos || [];
let id = this.props.match.params.stage_id;
return todos.filter((todo) => String(todo.id) === String(id))[0];
}
render() {
const stage = this.getStage();
if (!stage) return null;
return <div className="col-12 col-sm-12 col-md-12 col-lg-12">
<SectionTitle title="Single stage"/>
<div>Id: {stage.id}</div>
<div>Distance: {stage.distance}</div>
<div>Duration: {stage.duration.hours}:{String(stage.duration.minutes).padStart(2, "0")}:{String(stage.duration.seconds).padStart(2, "0")}</div>
<div>Average speed: {stage.avgSpeed} km/h</div>
<div>Max speed: {stage.maxSpeed} km/h</div>
</div>
}
}