Прямой доступ к дочерней странице без родительских реквизитов

#reactjs

#reactjs

Вопрос:

Извиняюсь, если об этом спрашивали раньше, но нигде не смогли найти удовлетворительного ответа.

У меня есть два компонента — Parent и Child , и два маршрута.

 // App.js
<Route path="/parent" component={Parent} />
<Route path="/child/:name" component={Child} />
 
 // Parent.js
// accessible at /parent

const Parent = () => {
  const history = useHistory()

  const children = [
    { id: 1, name: 'Bob', age: 10, school: 'ABC' },
    { id: 2, name: 'Kate', age: 10, school: 'XYZ' },
  ];

  return (
    <>
    <button
      onClick={history.push({
        to: `/child/${children[0]['name']}`,
        state: children[0],
      })}
    >
      Child 1
    </button>
    <button
    onClick={history.push({
      to: `/child/${children[1]['name']}`,
      state: children[1],
    })}
  >
    Child 2
  </button>
    </>
  );
};
 
 // Child.js
// accessible at /child/:name

const Child = ({ name, age, school }) => {
  return (
   <p>{name}</p>
   <p>{age}</p>
   <p>{school}</p>
  )
}
 

Теперь, если я перейду к Parent , выберите дочерний элемент, я увижу Child компонент со всеми данными. Однако, если я полностью обойду родительскую страницу и перейду непосредственно к /child/Bob URL в браузере, реквизит будет undefined , и я не увижу никаких данных на дочерней странице.

Каково общее решение этой проблемы? Я могу подумать о проверке наличия реквизитов Child и, если их нет, перенаправить на Parent использование history.push() . Это делается для предотвращения Child прямого доступа пользователей.

Ответ №1:

В этом случае вы можете использовать useParams()

проверьте childName , не определено ли тогда,

 const {name} =  useParams();
 

name затем у вас будет параметр Url

Обновить

В конечном итоге идеальная маршрутизация будет работать так: вы всегда отображаете родительский компонент, а затем прокладываете маршруты внутри вашего родительского компонента. Например, для сопоставления основного маршрута / дочернего компонента родительского компонента экспорта, затем внутри родительского компонента есть дочерний элемент маршрута /:name, дочерний элемент экспорта

Главный маршрут

 <Route path={`${match.url}child`} component={Parent} />
 

Внутри родительского элемента передайте столько реквизитов, сколько захотите

 <Route exact path="/child/:name" component={Child} childName={yourVar} />
 

Комментарии:

1. Это решение будет работать в этом простом примере, но что, если я передаю больше реквизитов?

2. да, в конечном итоге идеальная маршрутизация будет работать так: вы всегда визуализируете родительский компонент, а затем прокладываете маршруты внутри своего родительского компонента. Например, для сопоставления основного маршрута / дочернего компонента экспорта родительского компонента, затем внутри родительского компонента есть дочерний элемент маршрута /:name, дочерний элемент экспорта

Ответ №2:

Если вы хотите отобразить другое имя внутри себя h1 в своем дочернем компоненте, то у вас есть потрясающее решение, предоставленное @Tushar. Если вы хотите отобразить значение по умолчанию, когда реквизиты не передаются дочернему элементу ни через маршрут, ни через родителей, тогда вы можете иметь defaultProps в своем компоненте. Например.

 const Child = ({ childName }) => {
  return <h1>{childName}</h1>
}

Child.defaultProps = { childName: 'Whatever value you want to render' };