react-router — Link со строковой формой работает, но не с формой объекта

#reactjs #react-router

#reactjs #react-router

Вопрос:

Я использую react-router и Link просто отлично, как показано ниже:

   <nav>
    ...
    {sidebarCollections.map((c, i) => (
      <Link to={`/collection?id=${c.id}`} key={c.id}>
        {c.name}
      </Link>
    ))}
  </nav>
  

Но теперь мне нужно передать некоторые данные через Link .

Я узнал в документах React Router, которые Link могут в качестве альтернативы использовать объект с полем состояния, что как раз то, что мне нужно. Пример из документов:

 <Link
  to={{
    pathname: "/courses",
    search: "?sort=name",
    hash: "#the-hash",
    state: { fromDashboard: true }
  }}
/>
  

Поэтому я пытаюсь:

  <nav>
    ...
    {sidebarCollections.map((c, i) => (
     <Link
        to={{
          pathname: `/collection?id=${c.id}`,
          // state: { name: "test"}
        }}
        key={c.id}
      >
        {c.name}
      </Link>
    ))}
 </nav>

  
  

Итак, я попробовал выше, и, неожиданно, это не рендеринг. Я пытался комментировать state и использовать только pathname поле для соответствия строковой форме, с которой я работал раньше, но тоже безрезультатно.

Что происходит и как я могу передать некоторые данные по ссылке в мой компонент? Это из-за функции map или интерполяции строк, которая, возможно, каким-то образом ее портит?

Спасибо

Ответ №1:

Параметры запроса не могут быть добавлены внутри pathname поля при использовании синтаксиса объекта. Его необходимо включить в качестве search поля. В итоге я выбрал это в качестве решения:

    <Link
        to={{
          pathname: `/collection`,
          search: `?id=${c.id}`,
          state: { name: c.name },
        }}
        key={i}
      >
        {sc.name}
   </Link>
  

И затем в моем компоненте я могу получить доступ к состоянию с помощью:

 location.state.name