Как получить предыдущий URL-адрес в реакции Гэтсби

Я довольно хорошо знаком с React.js, но новичок в Gatsby.

Я хочу определить URL предыдущей страницы в Gatsby?

Если он использует историю браузера, я думаю, что предыдущий URL-адрес должен быть сохранен в document.referrer.

extempl 01.03.2019 11:28

Нет, это пусто. Я ничего не получаю внутри него.

Profer 01.03.2019 11:34

Возможный дубликат Как получить URL предыдущей страницы с помощью JavaScript?

Soroush Chehresa 01.03.2019 11:58

@soroushchehresa Нет, это не дубликат. Пожалуйста, обратитесь к вопросу. Я имею отношение к Гэтсби и событию, я не поставил тег javascript. А также сборка gatsby не будет выполнять переменную окна. Поэтому, пожалуйста, заберите свой закрытый голос.

Profer 01.03.2019 12:01
Поведение ключевого слова "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) для оценки ваших знаний,...
9
4
10 497
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Вы можете передать состояние с помощью компонента Link:

import React from 'react';
import { Link } from 'gatsby';

const PrevPage = () => (
  <div>
    <Link
      to = {`/nextpage`}
      state = {{ prevPath: location.pathname }}
    >
      Next Page
    </Link>
  </div>
)

const NextPage = (props) => (
  <div>
    <p>previous path is: {props.location.state.prevPath}</p>
  </div>
);

Тогда у вас есть доступ к prevPath из this.props.location.state на следующей странице.

Спасибо!!! Невозможно сделать это с Гэтсби, и поэтому я пойду с вашим ответом выше.

Profer 02.03.2019 06:57

@Profer Не упоминай об этом;)

Soroush Chehresa 02.03.2019 14:32

@Profer Почему ты говоришь, что с Гэтсби это невозможно? В этом ответе показано, как это сделать с помощью компонента Gatsby Link (который основан на компоненте Reach Router Link).

coreyward 02.03.2019 22:20

@coreyward, потому что приведенный выше ответ - просто уловка. Если есть способ, то Гэтсби сам предоставит некоторую опору или константу.

Profer 03.03.2019 11:36

@Profer Как это трюк? Gatsby сам предоставляет state опору Link и передает переданное ему значение компоненту страницы следующей страницы. Это задокументировано здесь..

coreyward 03.03.2019 22:47

@coreyward прав. Передача состояния в компонент Link — это функция Gatsby Link, которая расширена из API-интерфейса Reach/маршрутизатора.

Vien Tang 10.03.2019 22:49

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

itdoesntwork 23.10.2019 15:33

Полный кредит Ответ @soroushchehresa - этот ответ просто дополнен.

Gatsby выдаст ошибку во время производственной сборки, поскольку location недоступен во время рендеринга на стороне сервера. Вы можете обойти это, сначала проверив объект window:

class Page extends React.Component {
  state = {
    currentUrl: '',
  }

  componentDidMount() {
    if (typeof window == 'undefined') return
    this.setState({ currentUrl: window.location.href })
  }

  render() {
    return (
      <Link to = "..." state = {{ prevUrl: this.state.currentUrl }}>
    )
  }
}

Но это требует, чтобы мы реализовывали это на каждой странице, что утомительно. Gatsby уже настроил @reach/router для рендеринга на стороне сервера, так что мы можем подключиться к его реквизитам location. Только компоненты маршрутизатора получают эти реквизиты, но мы можем использовать компонент @reach/routerLocation, чтобы передать его другим компонентам.

При этом мы можем написать собственный компонент Link, который всегда передает предыдущий URL-адрес в своем состоянии:

// ./src/components/link-with-prev-url.js

import React from 'react'
import { Location } from '@reach/router'
import { Link } from 'gatsby'

const LinkWithPrevUrl = ({ children, state, ...rest }) => (
  <Location>
    {({ location }) => (
                      //make sure user's state is not overwritten
      <Link {...rest} state = {{ prevUrl: location.href, ...state}}>
        { children }
      </Link>
    )}
  </Location>
)

export { LinkWithPrevUrl as Link }

Затем мы можем импортировать наш пользовательский компонент Link вместо Gatsby Link:

-  import { Link } from 'gatsby'
+  import { Link } from './link-with-prev-url'

Теперь каждый компонент страницы Gatsby получит эти предыдущие реквизиты URL:

const SomePage = ({ location }) => (
  <div>previous path is {location.state.prevUrl}</div>
);

Вы также можете рассмотреть возможность создания контейнера, в котором хранится состояние для клиентской стороны, и использовать wrapRootElement или wrapPageElement как в gatsby-ssr.js, так и в gatsby-browser.js.

Гладкий. Мне это нравится.

coreyward 03.03.2019 22:48

На самом деле я наткнулся на первоначальный ответ через документы Гэтсби и надеялся избежать скуки. Спасибо, что разъяснили это, чтобы создать оптимизированный подход — отличная идея! Я смотрел на onRouteUpdate API в gatsby-browser.js, который предоставляет location, prevLocation, но, насколько я могу судить, он делает их доступными только для использования за пределами моих компонентов Gatsby/React.

Victor 04.03.2019 17:21

Эти ответы частично верны. Если вы устанавливаете состояние с помощью Link API, то состояние сохраняется в истории браузера.

Итак, если вы перейдете от Page1 к Page2, то, например, state.prevUrl будет правильно установлено на Page1

Но если вы перейдете к Page3 из Page2, а затем снова выполните браузер, то state.prevUrl все равно будет Page1, что неверно.

Лучший способ справиться с этим — добавить что-то подобное в gatsby-browser.js.

export const onRouteUpdate = ({ location, prevLocation }) => {
  if (location && location.state)
    location.state.referrer = prevLocation ? prevLocation.pathname : null
}

таким образом, у вас всегда будет предыдущий URL-адрес, доступный на месте.

Я решил свою проблему с помощью приведенного ниже фрагмента кода. Вот реф ссылка https://github.com/gatsbyjs/gatsby/issues/10410

// gatsby-browser.js
exports.onRouteUpdate = () => {
  window.locations = window.locations || [document.referrer]
  locations.push(window.location.href)
  window.previousPath = locations[locations.length - 2]
}

Теперь вы можете получить previousPath доступ из любого места.

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