Working with Fragments

1. Defining Named Fragments

ElementSyntax
Definitionfragment Name on Type { fields }
Spread...Name
Type conditionRequired, must match where spread

Example: Named fragment

fragment UserCard on User {
  id
  name
  avatar { url }
}

{
  me { ...UserCard }
  search(q: "x") { ... on User { ...UserCard } }
}

2. Using Fragment Spreads

FormDetail
Spread...FragmentName
ValidityFragment type must overlap with parent type
CycleForbidden — fragments cannot recurse

3. Creating Inline Fragments

Example: Inline fragment

{
  hero {
    name
    ... on Droid { primaryFunction }
    ... on Human { homePlanet }
  }
}
UseDetail
Type narrowingSelect fields specific to a concrete type
Directive scoping... @include(if: $b) { ... }

4. Reusing Fragments

StrategyBenefit
Co-locate fragments with componentsUI tree drives data needs
Compose fragmentsParent spreads child fragment
CodegenGenerates typed accessors per fragment

5. Using Type Conditions

Parent TypeAllowed Conditions
ObjectSame type only
InterfaceSelf or any implementer
UnionAny member type

6. Nesting Fragments

Example: Composed fragments

fragment Avatar on User { avatar { url } }
fragment UserCard on User { id name ...Avatar }
fragment PostCard on Post { id title author { ...UserCard } }

7. Using Fragment Variables

AspectDetail
StatusEXPERIMENTAL (Relay-style)
Syntaxfragment F on T @argumentDefinitions(n: { type: "Int!" })
Use...F @arguments(n: 5)

8. Organizing Fragment Libraries

PatternDetail
Per componentUserCard.fragment.graphql
Shared libraryfragments/userFields.graphql
Codegen near-filesUserCard.tsx + UserCard.generated.ts

9. Using Interface Fragments

Example: Interface fragment

fragment NodeId on Node { id __typename }

{
  node(id: "x") {
    ...NodeId
    ... on User { email }
    ... on Post { title }
  }
}

10. Using Union Fragments

Example: Union with fragments

fragment SuccessFields on LoginSuccess { token user { id } }
fragment ErrorFields on InvalidCredentials { message }

mutation { login(...) {
  __typename
  ...SuccessFields
  ...ErrorFields
} }