React async data fetch не извлекает данные при статической сборке

  • Я создаю статический сайт, используя Sanity.io и Gatsby.js.
  • Данные хранятся через Sanity, а я получаю их через GROQ.
  • Хост и сборка находятся на Netlify.

Проблема в том, что при построении я получаю только результат рендеринга Loading. Это действительно работает в разработке. (что, я уверен, из-за горячей загрузки)

Как мне создать рендеринг (асинхронную) выборку данных для сборки? Я не хочу, чтобы это было в componentDidMount() или useEffect(), потому что, насколько я понимаю, запрос будет на стороне клиента. это привело бы к запросу api для каждой загрузки страницы, верно? Вместо этого я просто хочу построить одну.

Могу ли я приостановить сборку / рендеринг, если еще нет данных?

Ниже мой упрощенный код

    import React from "react"
    import useSWR from "swr"
    import client from "../../../../../sanityClient"
    import BlockCarousel from "../blockCarousel/blockCarousel"

    const BlockCarouselBlog = ({ block }) => {
      const skip = 0
      const limit = block.itemAmount ? block.itemAmount : 10
      const params = { skip, limit: skip + limit - 1 }
      let {
        data,
        error,
      } = useSWR(
        '*[_type == "blog"] | order(_createdAt asc) [$skip..$limit]',
        query => client.fetch(query, params)
      )

      if (error) console.log(error)
      if (!data) return <div>Loading</div>

      block.blocks = data

      return <BlockCarousel block={block} />

    }
    export default BlockCarouselBlog

.


person Tim    schedule 30.03.2020    source источник


Ответы (1)


Если вы хотите использовать GROQ для получения данных таким способом и не хотите делать это на стороне клиента, вы, вероятно, захотите либо создать собственный исходный плагин, который создает узлы GraphQL с помощью API-интерфейсов Gatsby, либо определить функцию предварительной сборки, которая извлечет все ваши данные и сделает их доступными в статических файлах JSON или аналогичных, а затем импортирует их в ваши компоненты или загрузит их на стороне клиента.

Использование GROQ с Gatsby без использования GraphQL для статически визуализируемых компонентов потребует много дополнительной работы, и вы потеряете большую часть ценности Gatsby по сравнению с чем-то вроде Next.js.

person coreyward    schedule 31.03.2020