2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【GraphQL × Relay】Fragmentを@inlineで読み込む

Last updated at Posted at 2022-06-06

Fragmentをinlineで読み込む方法

主にRelayでFragmentを展開する方法として「useFragment」と「readInData」があり、useFragmentを使うのが基本ですが、useFragmentでデータがうまく取れず、代わりにreadInDataを試したところうまく動いたため、その時の備忘録です。
※この記事のAPIはGithub Graphql Apiを使っています

import { graphql } from 'react-relay'

export const repositoryQuery = graphql`
  query repositoryQuery {
    repository(owner: "Yosuke23" name: "nextjs_relay_demo") {
      ...repositoryFragment
    },
    user(login: "Yosuke23") {
      ...userFragment
    }
  }
`

このrepositoryFragmentをuseFragmentではなくreadInDataで読み込みたい場合は、、、


import { graphql } from "relay-runtime";

export const repositoryFragment = graphql`
    fragment repositoryFragment on Repository @inline{
         name
         url
         createdAt
    }
`

fragmentオブジェクトの頭に@inlineを指定してコンパイラーを走らせます

👇がこのfragmentの読み込み方法です

import {repositoryFragment$key as repositoryFragmentRef} from '../../queries/__generated__/repositoryFragment.graphql';
import { repositoryFragment } from '../../queries/repositoryFragment';
import { useQueryLoader, readInlineData } from 'react-relay'
import type {repositoryQuery as repositoryQueryType} from '../../queries/__generated__/repositoryQuery.graphql';
import {repositoryQuery} from '../../queries/repository';

  const [, loadRepositoryQuery] = useQueryLoader(repositoryQuery, initialRepositoryRef!)
  useEffect
    (() => {
      loadRepositoryQuery({})
    }, [])

まず大元のクエリであり、repositoryFragmentを含むrepositoryQueryをロード。
repositoryQueryをロードしてもrepositoryFragmentは展開されないのでuseFragmentもしくは readInlineData(今回はこっち)でFragmentオブジェクトを「使える様に」展開。


  const githubRepositoryData = readInlineData<repositoryFragmentRef>(repositoryFragment, githubDemoContext?.data?.repository ?? null);

repositoryFragmentRefはrepositoryFragmentコンパイル時に生成されるKey型
第一引数は、普通にrepositoryFragment自体のgraphqlファイルで第二引数は実際そのfragment
箇所にセットされる実データ。
$key型に合う様に渡してあげる。
これで、fragmentデータの取得ができました。

参考:https://relay.dev/docs/api-reference/graphql-and-directives/#inline

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?