Bird
Raised Fist0
GraphQLquery~10 mins

Optimistic UI updates in GraphQL - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Optimistic UI updates
User triggers mutation
UI immediately updates (optimistic)
Send mutation request to server
Server processes mutation
Confirm UI
When a user triggers a change, the UI updates right away (optimistic update) before the server confirms. Then the server response either confirms or rolls back the UI.
Execution Sample
GraphQL
mutation AddTodo {
  addTodo(text: "Buy milk") {
    id
    text
  }
}

# UI shows new todo immediately before server response
This mutation adds a todo item and the UI shows it immediately, assuming success.
Execution Table
StepActionUI StateServer ResponseResulting UI State
1User clicks 'Add Todo'No new todo shown yetNo request sent yetNo change
2UI adds todo optimisticallyNew todo 'Buy milk' shownRequest sent to serverNew todo visible
3Server processes mutationNew todo visibleServer returns success with id=101UI confirms todo with id=101
4User sees confirmed todoTodo with id=101 shownNo new responseUI stable
5If server failedNew todo visibleServer returns errorUI removes optimistic todo
💡 Execution ends when server response confirms or rejects the optimistic update
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 5
UI_TodoList[][{text: 'Buy milk', id: null}][{text: 'Buy milk', id: 101}][] if error, else unchanged
Key Moments - 3 Insights
Why does the UI show the new todo before the server responds?
The UI updates optimistically to give instant feedback, as shown in execution_table step 2, improving user experience.
What happens if the server returns an error?
The UI rolls back the optimistic update and removes the todo, as shown in execution_table step 5.
How does the UI know to replace the temporary todo with the confirmed one?
When the server responds with the new todo's id (step 3), the UI updates the todo item to include this id.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the UI state immediately after the user clicks 'Add Todo'?
ANew todo 'Buy milk' is shown optimistically
BNo new todo is shown yet
CTodo with id=101 is shown
DUI removes the todo
💡 Hint
Check execution_table row 1 under 'UI State'
At which step does the UI confirm the todo with the server-assigned id?
AStep 3
BStep 4
CStep 2
DStep 5
💡 Hint
Look at execution_table row 3 under 'Resulting UI State'
If the server returns an error, what happens to the UI_TodoList variable?
AIt keeps the optimistic todo
BIt adds a duplicate todo
CIt removes the optimistic todo
DIt shows a loading spinner
💡 Hint
See variable_tracker after Step 5 and execution_table step 5
Concept Snapshot
Optimistic UI updates:
- UI updates immediately on user action
- Sends mutation to server in background
- On success, UI confirms update
- On failure, UI rolls back
- Improves user experience by reducing wait
Full Transcript
Optimistic UI updates happen when the user triggers a change, and the UI immediately shows the change before the server confirms. This makes the app feel faster. The mutation is sent to the server. If the server confirms success, the UI finalizes the change with server data like IDs. If the server returns an error, the UI removes the optimistic change to stay consistent. This flow helps users see instant feedback while keeping data accurate.

Practice

(1/5)
1. What is the main purpose of using optimisticResponse in GraphQL client updates?
easy
A. To show UI changes immediately before the server responds
B. To delay UI updates until the server confirms
C. To rollback UI changes after server response
D. To fetch data from the server without updating UI

Solution

  1. Step 1: Understand optimisticResponse role

    The optimisticResponse is used to update the UI instantly, assuming the server will succeed.
  2. Step 2: Compare options with purpose

    Only To show UI changes immediately before the server responds describes showing UI changes immediately before server confirmation, which matches the optimistic update concept.
  3. Final Answer:

    To show UI changes immediately before the server responds -> Option A
  4. Quick Check:

    optimisticResponse = immediate UI update [OK]
Hint: Think: optimistic means 'hopeful' update shown early [OK]
Common Mistakes:
  • Confusing optimisticResponse with delayed updates
  • Thinking it rolls back changes automatically
  • Assuming it fetches data without UI change
2. Which of the following is the correct syntax to provide an optimistic response in a GraphQL mutation using Apollo Client?
easy
A. mutation({ variables, optimisticResponse: { id: 1, name: 'Test' } })
B. mutation({ variables, optimisticResponse: { __typename: 'User', id: 1, name: 'Test' } })
C. mutation({ variables, optimistic: { id: 1, name: 'Test' } })
D. mutation({ variables, optimisticResponse: { id: 1 } })

Solution

  1. Step 1: Recall optimisticResponse structure

    The optimisticResponse must include the __typename field to match the GraphQL schema type.
  2. Step 2: Check each option for __typename

    Only mutation({ variables, optimisticResponse: { __typename: 'User', id: 1, name: 'Test' } }) includes __typename: 'User' along with id and name, making it syntactically correct.
  3. Final Answer:

    mutation({ variables, optimisticResponse: { __typename: 'User', id: 1, name: 'Test' } }) -> Option B
  4. Quick Check:

    Include __typename in optimisticResponse [OK]
Hint: Always add __typename in optimisticResponse object [OK]
Common Mistakes:
  • Omitting __typename causes errors
  • Using 'optimistic' instead of 'optimisticResponse'
  • Providing incomplete optimisticResponse data
3. Given this mutation call with optimisticResponse:
client.mutate({
  mutation: ADD_TODO,
  variables: { text: 'Buy milk' },
  optimisticResponse: {
    __typename: 'Mutation',
    addTodo: {
      __typename: 'Todo',
      id: 'temp-id',
      text: 'Buy milk',
      completed: false
    }
  }
})
What will the UI show immediately after this mutation is called but before the server responds?
medium
A. An error message about missing id
B. No change until server responds
C. A new todo with id 'temp-id' and text 'Buy milk' shown
D. A blank todo item with no text

Solution

  1. Step 1: Analyze optimisticResponse content

    The optimisticResponse provides a new todo with id 'temp-id', text 'Buy milk', and completed false.
  2. Step 2: Understand UI behavior

    The UI will immediately show this new todo item with the given fields before server confirmation.
  3. Final Answer:

    A new todo with id 'temp-id' and text 'Buy milk' shown -> Option C
  4. Quick Check:

    optimisticResponse shows temporary UI data [OK]
Hint: optimisticResponse data appears instantly in UI [OK]
Common Mistakes:
  • Expecting no UI change before server response
  • Thinking optimisticResponse causes errors
  • Assuming blank or incomplete UI display
4. You wrote this optimisticResponse but the UI does not update immediately:
optimisticResponse: {
  addTodo: {
    id: 'temp-id',
    text: 'Buy milk',
    completed: false
  }
}
What is the most likely reason for this issue?
medium
A. optimisticResponse should be a function
B. Variables object is empty
C. Mutation name is incorrect
D. Missing __typename fields in optimisticResponse

Solution

  1. Step 1: Check optimisticResponse structure

    The optimisticResponse must include __typename for each object to match the schema.
  2. Step 2: Identify missing fields

    The given optimisticResponse lacks __typename fields, causing Apollo Client to ignore it.
  3. Final Answer:

    Missing __typename fields in optimisticResponse -> Option D
  4. Quick Check:

    __typename required for optimisticResponse to work [OK]
Hint: Always add __typename to every object in optimisticResponse [OK]
Common Mistakes:
  • Forgetting __typename causes no UI update
  • Assuming variables affect optimisticResponse directly
  • Thinking optimisticResponse must be a function
5. You want to implement an optimistic UI update for a mutation that toggles a user's 'active' status. The server might reject the change. Which approach best ensures UI consistency?
hard
A. Use optimisticResponse to toggle status immediately and handle errors to revert if needed
B. Wait for server response before updating UI to avoid inconsistencies
C. Update UI without optimisticResponse and ignore server errors
D. Use optimisticResponse but do not handle errors, assuming success

Solution

  1. Step 1: Understand optimistic UI with possible server rejection

    Optimistic UI shows changes immediately but must handle errors to keep UI correct.
  2. Step 2: Evaluate options for best practice

    Use optimisticResponse to toggle status immediately and handle errors to revert if needed uses optimisticResponse for instant UI update and error handling to revert if server rejects, ensuring consistency.
  3. Final Answer:

    Use optimisticResponse to toggle status immediately and handle errors to revert if needed -> Option A
  4. Quick Check:

    Optimistic update + error handling = consistent UI [OK]
Hint: Combine optimisticResponse with error handling for safe UI [OK]
Common Mistakes:
  • Ignoring error handling causes UI mismatch
  • Waiting for server loses optimistic UI benefits
  • Assuming optimisticResponse alone guarantees correctness