Как получить предыдущий URL в реагировать Гэтсби - PullRequest
0 голосов
/ 01 марта 2019

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

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

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

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

Гэтсби выдаст ошибку во время производственной сборки, так как 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/router Location для передачи его другим компонентам.

С этим мы можем написать собственный компонент 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:

-  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 ingatsby-ssr.js и gatsby-browser.js.

0 голосов
/ 01 марта 2019

Вы можете передать состояние, используя компонент 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 на следующей странице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...