React Router: маршрут, определенный в дочернем компоненте, не работает

Я работаю над веб-приложением React с использованием маршрутизатора React.

Объекты Route, определенные в основном компоненте-оболочке, работают нормально, но если я попытаюсь определить Route для дочернего компонента, любая ссылка, указывающая на него, не сможет отобразить желаемый компонент.

Вот фрагмент кода, который пытается объяснить ситуацию:

class MainWrapper extends Component {

render() {
        return (
                <div className = "App">
                    <Switch>
                        <Route exact path = "/a" component= {A}/>
                    </Switch>

                </div>
        );
    }
}


const A = () => {
   return (
      <div>
         <Route exact path = "/b" component = {B}/>
         <Link to = "/b"/>
      </div>
   ) 
}


const B = () => {
   return (<div>HELLO</div>)
}

В моем приложении ссылка, указывающая на «/ b», не отображает компонент B, например, свойство компонента не было передано

Почему это не сработает?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
2 243
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

У вас есть где-нибудь Router? Кроме того, вы не закрыли тег Link.

Да, у меня где-то определен маршрутизатор (в родительском компоненте MainWrapper). Я исправлю опечатку во фрагменте (это не настоящий код, он отлично компилируется)

Adriano Todaro 31.08.2018 21:20
Ответ принят как подходящий

Вы указываете «точный путь» в обоих маршрутах, поэтому для рендеринга B ваш путь должен быть точно «/ b», но при связывании с «/ b» компонент A будет отключен, потому что для рендеринга A вы должны быть на точном пути »/ a ". Вам следует изменить свой подход. Можно было бы удалить "точное" и включить "/ a" в вашу ссылку:

class MainWrapper extends Component {

render() {
    return (
            <div className = "App">
                <Switch>
                    <Route path = "/a" component= {A}/>
                </Switch>

            </div>
    );
    }
}


const A = () => {
  return (
    <div>
       <Route path = "/b" component = {B}/>
       <Link to = "/a/b"/>
    </div>
  ) 
}


const B = () => {
  return (<div>HELLO</div>)
}

если B является дочерним по отношению к A, URL-адрес должен быть /a/b вместо /b, поэтому вам просто нужно обновить компонент A с помощью этого кода.

const A = ({match}) => {
  return (
     <div>
        <Route exact path = {`${match.url}/b`} component = {B}/>
        <Link to=to = {`${match.url}/b`}/>
     </div>
  ) 
};

См. Документацию здесь

Вам нужно обернуть его в Switch, и вы должны удалить опору exact из вашего маршрута /b.

const A = ({match}) => {
   return (
      <div>
        <Switch>
          <Route path = {`${match.url}/b`} component = {B}/>
        </Switch>
        <Link to = "a/b"/>
      </div>
   ) 
}

Другие вопросы по теме