Функция навигации в Gatsy возвращает неопределенное значение

Столкнулся с проблемой с функцией navigate() в Gatsy, с помощью функции навигации можно передать объект вторым параметром на другую страницу. Сделал как в документации, но при получении данных получаю undefined.

const Panel = () => {

  const [name, setName] = useState('')

  useEffect (() => {
    if (name !== undefined) {
      setName('Hello World')
    }
  }, [name])

  const handleRedirect = () => {
    navigate('/cabinet/', { state: { name }})
  }

  return (
      <div>
        <button onClick = {handleRedirect}>Redirect</button>
      <div>
  )
}

const Cabinet = ({location}) => {

  console.info(location.state.name) // undefined

  return (
    <div>
        <h1>{location.state.name}</h1>
    </div>
  )
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема связана с таймингами/асинхронностью. Ваша встроенная функция navigate выглядит хорошо, однако вы устанавливаете name (с помощью установщика setName) после того, как происходит навигация. Кроме того, вам не хватает key для состояния. Попробуйте что-то вроде:

  const handleRedirect = () => {     
    if (name) navigate('/cabinet', {state: {'name': name}}); // Try hardcoding Hello World for debugging purposes {'name'; 'Hello World'}
  }

Затем в компоненте кабинета:

const Cabinet = ({location}) => {

  console.info(location.state.name) // will be your Hello World

  return (
    <div>
        <h1>{location.state.name}</h1>
    </div>
  )
}

В качестве альтернативы вы можете использовать подход async/await, например:

  const setNameFunction = ()=>{
      setName('Hello World')
    
      return name 
   }

  const handleRedirect = async () => {
    let  nameFromFunction= await setNameFunction;

    navigate('/cabinet/', { state: { 'name': nameFromFunction }}) // use if (nameFromFunction) navigate('/cabinet/', { state: { name: nameFromFunction }}) alternatively
  }

Этот второй подход сделает экосистему динамичной, позволяя вам передавать пользовательское имя на основе некоторой логики, которую вам нужно будет добавить (передавая name в качестве параметра через эти функции).

Кроме того, вы можете искать свое состояние в компоненте Cabinet, используя объект window в window.history.state.

Спасибо за код, но все же undefined когда я хочу получить данные из {местоположения} в другом компоненте

stepbystep 14.12.2020 08:11

Можете ли вы попробовать что-то вроде: const handleRedirect = () => { setName("Hello World"); if (name) navigate('/cabinet/', { state: { name }}) }. По сути, установка имени в той же функции, в которой запускается навигация.

Ferran Buireu 14.12.2020 08:16

Я понял вашу проблему @Bavarius, используйте navigate, например: navigate("/cabinet/", { state: { yourName: name },}) По сути, вам не хватает ключа

Ferran Buireu 14.12.2020 08:28

Я пробую это { state: { name: name }}, но получаю ошибку при вызове location.state.nameTypeError: Cannot read property 'state' of undefined

stepbystep 14.12.2020 08:34

Можете ли вы отладить весь объект props или location, чтобы проверить, что он получает?

Ferran Buireu 14.12.2020 08:37
location - не определено после отладчика
stepbystep 14.12.2020 08:41

Давайте продолжим обсуждение в чате.

Ferran Buireu 14.12.2020 09:00

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