Клиент React

#reactjs #graphql #client #apollo

#reactjs #graphql #клиент #apollo

Вопрос:

У меня есть следующий компонент React, который выполняет запрос. В перехватчике useEffect я жду результирующих данных, чтобы сопоставить их с новым объектом и передать его в презентационный дочерний компонент.

 import Content from './Content'

export const Component: FC<ComponentProps> = ({
  getGenericLandingPageQuery,
  uid,
  id,
}) => {
  const { data, loading } = useQuery(getGenericLandingPageQuery, {
    variables: {
      uid,
      id,
    },
  })

  const genericLandingPageInitialState: GenericLandingPageInitialStateTypes = {
    meta: undefined,
    contentSlices: [],
    // ...more initial state settings
  }

  const [genericLandingPageState, setGenericLandingPageState] = useState(genericLandingPageInitialState)

  /*
   * Page data
   */
  useEffect(() => {
    if (isValid(data)) {
      const contentSlices = isValid(body)
        ? data.body.map((slice: SectionTypes) => {
          const { slice_type } = slice
          return {
            type: slice_type,
            ...slice,
          }
        })
        : []

      const meta: MetaProps = {
        title: cms_meta_title,
        description: cms_meta_description,
        robots: contextMeta.robots ?? cms_meta_robots,
        canonical: cms_meta_canonical_url,
      }
      const newGenericLandingPageState = {
        ...genericLandingPageState,
        meta,
        contentSlices,
      }
      setGenericLandingPageState(newGenericLandingPageState)
    }
  }, [data])

  console.log(genericLandingPageState)

  return (
      <Content
        sections={genericLandingPageState.contentSlices}
        meta={genericLandingPageState.meta}
      />
  )
}
  

Если запрос извлекается из сети, все в порядке, и содержимое будет отображаться с данными. Когда данные запускаются во второй раз и содержимое передается из кэша, срабатывает перехват useEffect и вызывается setState с новыми данными.

К сожалению, console.log, расположенный чуть выше инструкции render, не будет содержать данные, с которыми вызывается setState в перехватчике, но содержит данные initialState, с помощью которых была инициализирована переменная состояния.

Если я изменю политику выборки на «только для сети», все будет работать нормально.

Кто-нибудь знает, что здесь происходит не так?