<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eric Endo</title>
    <description>The latest articles on DEV Community by Eric Endo (@endoooo).</description>
    <link>https://dev.to/endoooo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F584993%2F975bcea8-8b28-4f2e-8fe8-b1d4722cf040.png</url>
      <title>DEV Community: Eric Endo</title>
      <link>https://dev.to/endoooo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/endoooo"/>
    <language>en</language>
    <item>
      <title>Avoiding refetch to update Apollo Client cached data (React)</title>
      <dc:creator>Eric Endo</dc:creator>
      <pubDate>Sat, 27 Feb 2021 14:19:20 +0000</pubDate>
      <link>https://dev.to/endoooo/avoiding-refetch-to-update-apollo-client-cached-data-react-2j8</link>
      <guid>https://dev.to/endoooo/avoiding-refetch-to-update-apollo-client-cached-data-react-2j8</guid>
      <description>&lt;h3&gt;
  
  
  TLDR
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Include updated fields in &lt;code&gt;mutation&lt;/code&gt; response: Apollo will do their magic 🪄 and update the cached data. No need to &lt;code&gt;refetch()&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;If you use &lt;a href="https://www.apollographql.com/docs/react/"&gt;Apollo Client&lt;/a&gt; (with &lt;a href="https://www.apollographql.com/docs/react/api/react/hooks/"&gt;hooks&lt;/a&gt; please!) in your React project, chances are that you have already done something like this to update the data after a mutation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;GET_POST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gql&lt;/span&gt;&lt;span class="s2"&gt;`
  query GetPost($id: ID!) {
    post(id: $id) {
      id
      title
      description
    }
  }
`&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UPDATE_POST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gql&lt;/span&gt;&lt;span class="s2"&gt;`
  mutation UpdatePost(
    $id: ID!,
    $title: "String,"
    $description: "String"
  ) {
    updatePost(
      id: $id,
      title: "$title,"
      description: "$description"
    ) {
      id
    }
  }
`&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;PostDetails&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;refetch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;LIST_POSTS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;updatePost&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useMutation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;UPDATE_POST&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;editPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;formValues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;updatePost&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;formValues&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;refetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;-- do we really need it?&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// ...render and other component parts&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Can we avoid the &lt;code&gt;refetch()&lt;/code&gt; after &lt;code&gt;updatePost()&lt;/code&gt; (thus avoiding one unnecessary request)? Yes, by simply adding some fields to the mutation return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;const UPDATE_POST = gql`
&lt;/span&gt;  mutation UpdatePost(
    $id: ID!,
    $title: "String,"
    $description: "String"
  ) {
    updatePost(
      id: $id,
      title: "$title,"
      description: "$description"
    ) {
      id
&lt;span class="gi"&gt;+     title
+     description
&lt;/span&gt;    }
  }
&lt;span class="err"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why does this work? To answer this, we need to understand two Apollo concepts first: data caching and cache updating.&lt;/p&gt;

&lt;p&gt;For the &lt;a href="https://www.apollographql.com/docs/react/caching/cache-configuration/"&gt;caching&lt;/a&gt; part:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Apollo Client stores the results of its GraphQL queries in a normalized, in-memory cache. This enables your client to respond to future queries for the same data without sending unnecessary network requests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For the &lt;a href="https://www.apollographql.com/blog/demystifying-cache-normalization/"&gt;updating&lt;/a&gt; part:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In order for Apollo Client to update the cache automatically, we have to remember to &lt;strong&gt;always return the new data in operation responses&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;query&lt;/code&gt; responses, that’s the point. The entire purpose of a query is to return data and cache it.&lt;/p&gt;

&lt;p&gt;But for &lt;code&gt;mutations&lt;/code&gt;, like &lt;code&gt;editTodo&lt;/code&gt; that change a single entity, we should be able to update the item automatically if we return the value in the mutation response.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, for &lt;code&gt;mutations&lt;/code&gt; like this one from the example (a single entity with id), just &lt;strong&gt;include updated fields in the mutation response: Apollo will do their magic 🪄 and update the cached data. No need to &lt;code&gt;refetch()&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;But... what about other cases, when entities have no &lt;code&gt;id&lt;/code&gt; field or &lt;code&gt;mutations&lt;/code&gt; that change data related to the updated entity, for example?&lt;/p&gt;

&lt;p&gt;This &lt;a href="https://www.apollographql.com/blog/demystifying-cache-normalization/"&gt;Apollo Blog post&lt;/a&gt; (already linked in the updating part) talks about some strategies for those cases - but we can talk more about those cases in one (or more) post(s) in the future.&lt;/p&gt;




&lt;p&gt;PS 1: English is not my native language. Feel free to suggest any corrections, point grammatical errors, and etc.&lt;/p&gt;

&lt;p&gt;PS 2: check the &lt;a href="https://dev.to/endoooo/como-evitar-refetch-para-atualizar-os-dados-do-apollo-client-react-5d9l"&gt;original post here&lt;/a&gt; (in Brazilian Portuguese)&lt;/p&gt;




&lt;p&gt;Cover background image by &lt;a href="https://unsplash.com/@spacex?utm_source=devto&amp;amp;utm_medium=referral"&gt;SpaceX&lt;/a&gt;&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>apollo</category>
      <category>react</category>
    </item>
    <item>
      <title>Como evitar refetch para atualizar os dados do cache do Apollo Client (React)?</title>
      <dc:creator>Eric Endo</dc:creator>
      <pubDate>Tue, 23 Feb 2021 19:51:55 +0000</pubDate>
      <link>https://dev.to/endoooo/como-evitar-refetch-para-atualizar-os-dados-do-apollo-client-react-5d9l</link>
      <guid>https://dev.to/endoooo/como-evitar-refetch-para-atualizar-os-dados-do-apollo-client-react-5d9l</guid>
      <description>&lt;h3&gt;
  
  
  TLDR
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Inclua os valores atualizados no retorno da &lt;code&gt;mutation&lt;/code&gt;. O Apollo vai fazer sua mágica 🪄 e atualizar os dados do cache, sem precisarmos utilizar o &lt;code&gt;refetch()&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Se você usa &lt;a href="https://www.apollographql.com/docs/react/"&gt;Apollo Client&lt;/a&gt; (com &lt;a href="https://www.apollographql.com/docs/react/api/react/hooks/"&gt;hooks&lt;/a&gt;, por favor!) na sua aplicação React, chances de você já ter feito algo desse tipo para atualizar os dados após uma &lt;code&gt;mutation&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;GET_POST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gql&lt;/span&gt;&lt;span class="s2"&gt;`
  query GetPost($id: ID!) {
    post(id: $id) {
      id
      title
      description
    }
  }
`&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UPDATE_POST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gql&lt;/span&gt;&lt;span class="s2"&gt;`
  mutation UpdatePost(
    $id: ID!,
    $title: "String,"
    $description: "String"
  ) {
    updatePost(
      id: $id,
      title: "$title,"
      description: "$description"
    ) {
      id
    }
  }
`&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;PostDetails&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;refetch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;LIST_POSTS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;updatePost&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useMutation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;UPDATE_POST&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;editPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;formValues&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;updatePost&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;formValues&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nx"&gt;refetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- precisamos mesmo disso?&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// ...render e demais partes do component&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O ponto é: esse &lt;code&gt;refetch()&lt;/code&gt; após o &lt;code&gt;updatePost()&lt;/code&gt; pode ser evitado (consequentemente evitando uma requisição desnecessária), simplesmente adicionando alguns campos no retorno da &lt;code&gt;mutation&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;const UPDATE_POST = gql`
&lt;/span&gt;  mutation UpdatePost(
    $id: ID!,
    $title: "String,"
    $description: "String"
  ) {
    updatePost(
      id: $id,
      title: "$title,"
      description: "$description"
    ) {
      id
&lt;span class="gi"&gt;+     title
+     description
&lt;/span&gt;    }
  }
&lt;span class="err"&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por que isso funciona? Pra entender melhor, precisamos entender dois conceitos do Apollo: como ele cacheia os dados, e como ele atualiza os dados cacheados.&lt;/p&gt;

&lt;p&gt;Para a parte do &lt;a href="https://www.apollographql.com/docs/react/caching/cache-configuration/"&gt;cacheamento&lt;/a&gt; (tradução livre):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;o Apollo Client armazena os resultados de suas queries GraphQL em um cache normalizado, na memória. Isso possibilita que seu cliente responda a queries futuras envolvendo os mesmos dados sem enviar requisições de rede desnecessariamente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para a parte da &lt;a href="https://www.apollographql.com/blog/demystifying-cache-normalization/"&gt;atualização&lt;/a&gt; (tradução livre):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Para o Apollo Client conseguir atualizar o cache automaticamente, temos que lembrar de &lt;strong&gt;sempre retornar os novos dados nas respostas das operações&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para respostas de &lt;code&gt;queries&lt;/code&gt;, esse é o ponto. Todo o propósito de uma query é retornar dados e cacheá-los.&lt;/p&gt;

&lt;p&gt;Mas para &lt;code&gt;mutations&lt;/code&gt;, como o &lt;code&gt;editTodo&lt;/code&gt; que alterar uma única entidade, nós devemos ser capazes de atualizar o item automaticamente se retornarmos o valor na resposta da mutation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Então para &lt;code&gt;mutations&lt;/code&gt; como essa do exemplo, de uma única entidade e que possua id, basta &lt;strong&gt;incluírmos os valores atualizados no retorno da mutation que o Apollo faz sua mágica 🪄 e atualiza os dados do cache, sem precisarmos utilizar o &lt;code&gt;refetch()&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Mas... e quando estamos falando de outros casos, quando as entidades não possuem um campo &lt;code&gt;id&lt;/code&gt;, ou de &lt;code&gt;mutations&lt;/code&gt; que impactam dados derivados da entidade atualizada, por exemplo?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.apollographql.com/blog/demystifying-cache-normalization/"&gt;Este post do Apollo Blog&lt;/a&gt; (que eu já linkei na parte da atualização) fala de algumas estratégias - mas isso pode ser algo para discutirmos mais em um (ou alguns) post(s) futuro(s).&lt;/p&gt;




&lt;p&gt;Imagem de fundo da capa por &lt;a href="https://unsplash.com/@spacex?utm_source=devto&amp;amp;utm_medium=referral"&gt;SpaceX&lt;/a&gt;&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>apollo</category>
      <category>react</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
