Извлеките данные GraphQL в gatsby-browser.js (или лучшее решение, пожалуйста) - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь выполнить GraphQL запрос внутри replaceRouterComponent из gatsby-browser.js ( API браузера gatsby ). Принимая во внимание, что я могу получить доступ к данным из Содержательные .

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

Вот вопрос -

Внутри компонента TripAdvisor.js Я монтирую скрипты в componentDidMount, тогда как locationId основан на данных this.props.tripAdvisorId, извлеченных из отдельных posts, созданных в * 1026 содержательной *. Каждый post (свойство) имеет отдельного locationId, который при изменении в сценарии src представляет отзывы, относящиеся к теме.

componentDidMount () {
    const tripadvisorLeft = document.createElement("script");
    tripadvisorLeft.src = "https://www.jscache.com/wejs?wtype=selfserveprop&uniq=789&locationId=" + this.props.tripAdvisorId + "&lang=en_AU&rating=true&nreviews=0&writereviewlink=true&popIdx=true&iswide=true&border=false&display_version=2";
    tripadvisorLeft.async = true;
    document.body.appendChild(tripadvisorLeft);

    const tripadvisorRight = document.createElement("script");
    tripadvisorRight.src = "https://www.jscache.com/wejs?wtype=selfserveprop&uniq=998&locationId=" + this.props.tripAdvisorId + "&lang=en_AU&rating=false&nreviews=4&writereviewlink=false&popIdx=false&iswide=true&border=false&display_version=2";
    tripadvisorRight.async = true;
    document.body.appendChild(tripadvisorRight);
}

У меня также есть функция внутри componentDidMount на уровне страницы для перезаписи данных из сценария TripAdvisor, описанного выше. Сценарий TripAdvisor создает функцию с именем injectselfserveprop *** (где *** - случайные числа). Без этого функция не вызывается при достижении компонента с помощью Link

/ шаблоны / свойства / reviews.js

componentDidMount() {
  Object.keys(window).forEach((key) => {
      if (key.match(/^injectselfserveprop[0-9]+$/)) {
          window[key]();
      }
  });
}

В том же файле / templates / properties / reviews.js Я использую shouldComponentUpdate до return false, поскольку он останавливает TripAdvisor от непрерывного обновления между страницами (вызывая его сломать) при использовании link

shouldComponentUpdate() {
  return false;
}

Теперь, где это решение разваливается, это изменение locationId скрипта src. Он отлично работает, если мне не нужно менять locationId на post.

Сбой, когда link на другой post с другим locationId и компонент рецензирования не обновляется. Однако затем link прочь и вернитесь к новым отзывам.

Вы можете видеть, что это происходит здесь и следуя этим шагам -

  1. Нажмите эту ссылку и прокрутите вниз, чтобы увидеть обзоры, связанные с Chatelaine
  2. Затем в меню> выберите Varenna> выберите Обзоры в горизонтальном меню, и вы по-прежнему видите рецензии Chatelaine.
  3. Теперь нажмите> Расположение в горизонтальном меню>, затем снова нажмите Обзоры>, чтобы получить правильные отзывы и рассчитать Varenna.

Здесь есть репозиторий GitHub для полного сайта здесь . Два файла для поиска находятся в /src/templates/properties/reviews.js и src/components/properties/TripAdvisor.js

Теперь я обрисовал свою проблему, и я считаю, что лучшее решение - это gatsby-browser.js, заключив сценарий TripAdvisor в replaceRouterComponent с условным оператором, применимым только к страницам, которые напрямую обращаются к reviews.js через Link.

Однако я не могу найти решение по использованию данных tripAdvisorID внутри gatsby-browser.js ( API браузера gatsby ). Принимая во внимание, что я могу получить доступ к данным из Содержательные , используя GraphQL .

Если у вас есть другое решение, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 24 мая 2018

Что ж, если ваша проблема заключается в обновлении компонента, возможно, проблема в том, как вы справляетесь с побочными эффектами (выборка componentDidMount в TripAdvisor).

Насколько я вижу, все данные, которые вы получаете в реквизитах, хороши, и они должны быть извлечены, но есть ошибка. componentDidMount будет ТОЛЬКО БУДЕТ ПОЗВАНО РАЗ , и в этот раз компонент загружается на страницу впервые. Таким образом, не имеет значения, что ваши реквизиты меняются и что вы визуализируете снова, код в componentDidMount больше не будет вызываться .

Вы можете исправить это двумя способами. Скорее вы добавляете ключ в

 <TripAdvisor key={tripAdvisorId} name={name} starRating={starRating} location={location} tripAdvisorId={tripAdvisorId} * />

Таким образом, реакция будет размонтировать предыдущий TripAdvisor и смонтировать новый, вызвав, таким образом, метод componentDidMount снова ... Что может быть проблемой, если вам нужно перемонтировать все только для разных данных из реквизита ... ..

Я мог бы порекомендовать вам другой способ, который также рекомендуется в Реактивной документации. Вместо того, чтобы реализовывать ваши изменения в componentDidMount, внесите их в componentDidUpdate(prevProps, prevState) (ПРИМЕЧАНИЕ. необходимо сохранить ваш выбор по this.props.tripAdvisorId !== prevProps.tripAdvisorId или вы попадете в бесконечный цикл).

Я думаю, что это проблема для вас, чтобы обновить данные, ничего не связанного с Гэтсби ... Но прокомментируйте меня, если проблема не исчезнет, ​​и я мог бы подробнее изучить проблемы GraphQL, с которыми вы сталкиваетесь.

...