I started writing because I had an issue, but I have resolved it and wanted to mention how much graphQL has helped simplify my code base.
There are many fields that I update independently (e.g. onBlur) to make the user experience fluid. I’ve found that I can create one query with all the needed fields to change, then only pass in the variables I want to actually update.
This is key, in that Apollo with update the cache correctly for those independently changing values. When I click on different items, I don’t need to worry about updating that cache manually (which is possible, but more complicated). For cache-updating to work correctly, the fields you return in the mutation must match the fields in your query.
Here’s an example:
const GET_ITEM = gql`
  query GetItem($id: ID) {
    item(id: $id) {
      id
      description
      criteria
    }
  }
`;
const UPDATE_ITEM = gql`
  mutation UpdateItem($id: ID, $description: String, $criteria: String) {
    itemUpdate(data: {
      id: $id
      description: $description
      criteria: $criteria
    }) {
      id
      description
      criteria
    }
  }
`;
The code to handle mutations is very straightforward after using an event that listens to field changes:
  const [updateItem] = useMutation(UPDATE_ITEM);
  const handleFieldChange = (key: string, value: string) => {
    updateItem({
      variables: {
        id: itemId,
        [key]: value,
      }
    });
  };