React + Apollo Client - Cache 編-

このセクションではこれまでで作ったTodoアプリにcache機能を追加します。

cacheとは

 ウェブページを訪れたときにそのページの情報を一時保存する仕組みのことです。そうすることで次回からページの表示スピードが上がります。cookieと似ていますが保存するのはユーザーのIDやEmailではなく、ページの情報などを保存します。

cache in Apollo client

Apollo client ではsrc/index.jsで記述したInMemoryCache()によって様々なcacheを実装できます。

まずTodoを新規作成したときにcache更新を行うようにかいていきましょう。src/pages/addTodo.jsにあるaddTTodoMutationにupdateのコールバック関数を追加します。


    // src/pages/addTodo.js
            
    const [addTodo] = useMutation(ADD_TODO, {
        variables: {
            content
        },
        update: (store, { data }) => {     // <ー追加
            const  todos  =  store.readQuery({
                query: GET_TODOS
            });
            store.writeQuery({
                query: GET_TODOS,
                data: {
                  listing:  [ ...todos.listing, data.addTodo ]
                  
                }
            });
        },
        onCompleted: () => {
            history.push('/')
        }
    })
                    

readQueryListingQueryを読み込み、writeQueryで更新を行います。Query編で作成したListingのQueryを読み込みます。

続いてupdateTodoをおこなったときにcacheを更新するようにかいていきましょう。


    // src/pages/todoListing.js

   updateTodo({
       variables: {
           id: parseInt(id),
           content: todo
       },

       update: (store) => {
          const  todos  =  store.readQuery({
              query: GET_TODOS
          });

          const updateTodoListing = todos.listing.map(pickedTodo => {
              if(pickedTodo.id ===  parseInt(id)){
                  return {
                      ...pickedTodo,
                      content: todo
                  }
              }
              return pickedTodo
          })

          store.writeQuery({
              query: GET_TODOS,
              data: {
                  listing: updateTodoListing
              }
          });

       }
   })
                    

先ほどと同様にupdateのなかにかいています。GET_TODOSを取得した後にupdateTodoListingと定義し、データ変更を施した新しいTodoのarrayをwriteQueryGET_TODOSに挿入しています。

このセクションのコードはこちらに置いておくので各自確認してみてください。

また、自身で先ほどのセクションで追加した、deleteTodo関数にもcacheの更新の追加を付けてみてください。

ここまでで簡単なApollo Client + React.jsのチュートリアルを終了します。このほかにも様々な機能があり、これからArticlesで紹介していくので是非チェックしてみてください。