{"id":4121,"date":"2023-02-15T10:56:19","date_gmt":"2023-02-15T01:56:19","guid":{"rendered":"https:\/\/weseek.co.jp\/tech\/?p=4121"},"modified":"2023-04-17T11:19:03","modified_gmt":"2023-04-17T02:19:03","slug":"swr-ver-2-0-%e3%81%ae-optimistic-updates-%e6%a5%bd%e8%a6%b3%e7%9a%84-ui-%e6%9b%b4%e6%96%b0%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6","status":"publish","type":"post","link":"https:\/\/weseek.co.jp\/tech\/4121\/","title":{"rendered":"SWR ver 2.0 \u306e Optimistic Updates (\u697d\u89b3\u7684 UI \u66f4\u65b0)\u306b\u3064\u3044\u3066"},"content":{"rendered":"<p>\u3053\u3093\u306b\u3061\u306f\u3001\u30b7\u30b9\u30c6\u30e0\u30a8\u30f3\u30b8\u30cb\u30a2\u306e Kota \u3067\u3059\u3002\u4eca\u56de\u306f\u5c11\u3057\u524d\u306b\u767a\u8868\u3055\u308c\u305f SWR ver 2.0 \u306b\u4fbf\u5229\u3067\u65b0\u3057\u3044\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u8ffd\u52a0\u3055\u308c\u305f\u306e\u3067\u3001\u7c21\u5358\u306b\u89e3\u8aac\u3057\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p><!--more--><\/p>\n\n<h1>\u4eca\u56de\u8ffd\u52a0\u3055\u308c\u305f\u30aa\u30d7\u30b7\u30e7\u30f3<\/h1>\n<ul>\n<li>optimisticData\n<ul>\n<li>\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u5373\u5ea7\u306b\u66f4\u65b0\u3059\u308b\u305f\u3081\u306e\u30c7\u30fc\u30bf\u3001\u307e\u305f\u306f\u73fe\u5728\u306e\u30c7\u30fc\u30bf\u3092\u53d7\u3051\u53d6\u308a\u65b0\u3057\u3044\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u3092\u8fd4\u3059\u95a2\u6570<\/li>\n<\/ul>\n<\/li>\n<li>populateCache\n<ul>\n<li>\u30ea\u30e2\u30fc\u30c8\u30df\u30e5\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u7d50\u679c\u3092\u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u66f8\u304d\u8fbc\u3080\u304b\u3069\u3046\u304b\u3001\u307e\u305f\u306f\u30ea\u30e2\u30fc\u30c8\u30df\u30e5\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u7d50\u679c\u3068\u73fe\u5728\u306e\u30c7\u30fc\u30bf\u3092\u5f15\u6570\u3068\u3057\u3066\u53d7\u3051\u53d6\u308a\u3001\u30df\u30e5\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u7d50\u679c\u3092\u8fd4\u3059\u95a2\u6570<\/li>\n<\/ul>\n<\/li>\n<li>rollbackOnError\n<ul>\n<li>\u30ea\u30e2\u30fc\u30c8\u30df\u30e5\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u304c\u30a8\u30e9\u30fc\u3060\u3063\u305f\u5834\u5408\u306b\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3059\u308b\u304b\u3069\u3046\u304b\u3001\u307e\u305f\u306f\u767a\u751f\u3057\u305f\u30a8\u30e9\u30fc\u3092\u5f15\u6570\u3068\u3057\u3066\u53d7\u3051\u53d6\u308a\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3059\u308b\u304b\u3069\u3046\u304b\u306e\u771f\u507d\u5024\u3092\u8fd4\u3059\u95a2\u6570<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u516c\u5f0f\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306f <a href=\"https:\/\/swr.vercel.app\/docs\/mutation#optimistic-updates\">\u3053\u3061\u3089<\/a> \u3067\u3059\u3002<br \/>\n\u516c\u5f0f\u306e\u30d6\u30ed\u30b0\u306f <a href=\"https:\/\/swr.vercel.app\/blog\/swr-v2#optimistic-ui\">\u3053\u3061\u3089<\/a> \u3067\u3059\u3002<\/p>\n<h1>\u89e3\u8aac<\/h1>\n<p>\u516c\u5f0f\u30d6\u30ed\u30b0\u3067\u306f\u3001\u7c21\u5358\u306a Todo \u306e\u8ffd\u52a0\u304c\u4f8b\u3068\u3057\u3066\u8a18\u8f09\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre><code class=\"language-javascript\">await addNewTodo(&#039;New Item&#039;)<\/code><\/pre>\n<p><code>addNewTodo<\/code> \u306f, Todo \u30ea\u30b9\u30c8\u306b\u65b0\u3057\u3044 Todo \u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306e Promise \u3082\u3057\u304f\u306f\u3001\u975e\u540c\u671f\u95a2\u6570\u3067\u3001\u66f4\u65b0\u5f8c\u306e\u30c7\u30fc\u30bf\u3092\u8fd4\u3057\u307e\u3059\u3002<br \/>\n\u3053\u308c\u307e\u3067\u306f\u3001Todo \u304c\u8ffd\u52a0\u3055\u308c\u305f\u5834\u5408\u3001 UI \u3078\u306e\u8868\u793a\u306f\u3001 mutate \u3092\u901a\u3057\u3066\u30b5\u30fc\u30d0\u306b\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9001\u4fe1\u3057\u3001\u30ea\u30e2\u30fc\u30c8\u3067\u6700\u65b0\u306e\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u3001\u8fd4\u3063\u3066\u304d\u305f\u30ec\u30b9\u30dd\u30f3\u30b9\u5185\u306e\u30c7\u30fc\u30bf\u3092\u4f7f\u3063\u3066 UI \u5074\u3092\u66f4\u65b0\u3059\u308b\u3068\u3044\u3063\u305f\u6d41\u308c\u3067\u3057\u305f\u3002<\/p>\n<pre><code class=\"language-javascript\">const { mutate, data } = useSWR(&#039;\/api\/todos&#039;)\n\nreturn &lt;&gt;\n  &lt;ul&gt;{\/* \u30c7\u30fc\u30bf\u306e\u8868\u793a *\/}&lt;\/ul&gt;\n\n  &lt;button onClick={async () =&gt; {\n    await addNewTodo(&#039;New Item&#039;)\n    mutate()\n  }}&gt;\n    Add\n  &lt;\/button&gt;\n&lt;\/&gt;<\/code><\/pre>\n<p><img src=\"https:\/\/i.imgur.com\/jBRSm7c.png\" alt=\"\" \/><br \/>\n\u203b\u3000\u753b\u9762\u306f\u5f8c\u8ff0\u3059\u308b\u516c\u5f0f\u306e example<\/p>\n<h1>\u554f\u984c\u70b9<\/h1>\n<p>\u3082\u3057\u4eee\u306b <code>await addNewTodo(&#039;New Item&#039;)<\/code> \u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u6642\u9593\u304c\u639b\u304b\u3063\u305f\u5834\u5408\u3001\u30ec\u30b9\u30dd\u30f3\u30b9\u304c\u8fd4\u3063\u3066\u304f\u308b\u307e\u3067\u306e\u9593\u3001\u66f4\u65b0\u524d\u306e Todo \u30ea\u30b9\u30c8\u304c\u8868\u793a\u3055\u308c\u305f\u307e\u307e\u306e\u72b6\u614b\u306b\u306a\u308a UX \u304c\u4f4e\u4e0b\u3057\u3066\u3057\u307e\u3044\u307e\u3059\u3002<\/p>\n<h1>\u65b0\u30aa\u30d7\u30b7\u30e7\u30f3<\/h1>\n<p>\u4eca\u56de ver 2.0 \u3067\u767b\u5834\u3057\u305f\u65b0\u3057\u3044\u30aa\u30d7\u30b7\u30e7\u30f3 <code>optimisticData<\/code> \u3067\u305d\u308c\u3092\u89e3\u6c7a\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre><code class=\"language-javascript\">const { mutate, data } = useSWR(&#039;\/api\/todos&#039;)\n\nreturn &lt;&gt;\n  &lt;ul&gt;{\/* \u30c7\u30fc\u30bf\u306e\u8868\u793a *\/}&lt;\/ul&gt;\n\n  &lt;button onClick={() =&gt; {\n    mutate(addNewTodo(&#039;New Item&#039;), {\n      \/\/ \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u5373\u5ea7\u306b\u66f4\u65b0\u3059\u308b\n      optimisticData: [...data, &#039;New Item&#039;],\n    })\n  }}&gt;\n    Add\n  &lt;\/button&gt;\n&lt;\/&gt;<\/code><\/pre>\n<p>\u4e0a\u8a18\u306e\u3088\u3046\u306b <code>optimisticData<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4f7f\u3046\u3053\u3068\u3067\u3001\u30b5\u30fc\u30d0\u304b\u3089\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u5f85\u3064\u3053\u3068\u306a\u304f\u65b0\u3057\u3044\u72b6\u614b\u306e\u30ea\u30b9\u30c8\u3092\u8868\u793a\u3067\u304d\u307e\u3059\u3002<code>data<\/code> \u3092 <code>optimisticData<\/code> \u306e\u5024\u306b\u3088\u3063\u3066\u66f4\u65b0\u3057\u3001\u30b5\u30fc\u30d0\u306b\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u5b8c\u4e86\u3057\u305f\u3089 SWR \u306f\u30ea\u30bd\u30fc\u30b9\u3092 revalidate \u3057\u30c7\u30fc\u30bf\u304c\u6700\u65b0\u3067\u3042\u308b\u3053\u3068\u3092\u4fdd\u8a3c\u3057\u307e\u3059\u3002<br \/>\n\u307e\u305f\u3001<code>populateCache<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6709\u52b9\u306b\u3059\u308b\u3053\u3068\u3067\u3001\u30df\u30e5\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u3067 <code>useSWR<\/code> \u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u66f4\u65b0\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre><code class=\"language-javascript\">const { mutate, data } = useSWR(&#039;\/api\/todos&#039;)\n\nreturn &lt;&gt;\n  &lt;ul&gt;{\/* \u30c7\u30fc\u30bf\u306e\u8868\u793a *\/}&lt;\/ul&gt;\n\n  &lt;button onClick={() =&gt; {\n    mutate(addNewTodo(&#039;New Item&#039;), {\n      optimisticData: [...data, &#039;New Item&#039;],\n      \/\/ \u30df\u30e5\u30fc\u30c6\u30fc\u30b7\u30e7\u30f3\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u3067 useSWR \u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u66f4\u65b0\n      populateCache: true,\n    })\n  }}&gt;\n    Add\n  &lt;\/button&gt;\n&lt;\/&gt;<\/code><\/pre>\n<p><code>populateCache<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6709\u52b9\u306b\u3057\u305f\u5834\u5408\u3001\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30c7\u30fc\u30bf\u304c\u6b63\u3057\u3044\u5834\u5408\u3001<code>revalidate<\/code> \u306f\u5fc5\u8981\u306a\u3044\u306e\u3067\u3001\u5408\u308f\u305b\u3066\u7121\u52b9\u5316\u3057\u307e\u3059\u3002<\/p>\n<pre><code class=\"language-javascript\">const { mutate, data } = useSWR(&#039;\/api\/todos&#039;)\n\nreturn &lt;&gt;\n  &lt;ul&gt;{\/* \u30c7\u30fc\u30bf\u306e\u8868\u793a *\/}&lt;\/ul&gt;\n\n  &lt;button onClick={() =&gt; {\n    mutate(addNewTodo(&#039;New Item&#039;), {\n      optimisticData: [...data, &#039;New Item&#039;],\n      populateCache: true,\n      \/\/ populateCache \u3092\u6709\u52b9\u306b\u3059\u308b\u5834\u5408\u306f\u3001revalidate \u306f\u4e0d\u8981\n      revalidate: false,\n    })\n  }}&gt;\n    Add\n  &lt;\/button&gt;\n&lt;\/&gt;<\/code><\/pre>\n<p><code>addNewTodo<\/code> \u304c\u4f8b\u5916\u3067\u5931\u6557\u3057\u305f\u5834\u5408\u306f\u3001\u697d\u89b3\u7684\u306a\u66f4\u65b0\u306b\u3088\u308b\u30c7\u30fc\u30bf\u304c\u30e6\u30fc\u30b6\u30fc\u306b\u8868\u793a\u3055\u308c\u307e\u3059\u3002\u6b63\u3057\u3044\u30c7\u30fc\u30bf\u3092\u4fdd\u8a3c\u3059\u308b\u70ba\u306b\u3001<code>rollbackOnError<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3001<code>optimisticData<\/code> \u306e\u30c7\u30fc\u30bf\u3092\u66f4\u65b0\u524d\u306e <code>data<\/code> \u306b\u30ed\u30fc\u30eb\u30d0\u30c3\u30af\u3057\u307e\u3059\u3002( default \u3067\u3000rollbackOnError=true \u306b\u306a\u3063\u3066\u3044\u308b )<\/p>\n<pre><code class=\"language-javascript\">\nconst { mutate, data } = useSWR(&#039;\/api\/todos&#039;)\n\nreturn &lt;&gt;\n  &lt;ul&gt;{\/* \u30c7\u30fc\u30bf\u306e\u8868\u793a *\/}&lt;\/ul&gt;\n\n  &lt;button onClick={() =&gt; {\n    mutate(addNewTodo(&#039;New Item&#039;), {\n      optimisticData: [...data, &#039;New Item&#039;],\n      populateCache: true,\n      revalidate: false,\n      rollbackOnError: true,\n    })\n  }}&gt;\n    Add\n  &lt;\/button&gt;\n&lt;\/&gt;<\/code><\/pre>\n<h1>\u53c2\u8003<\/h1>\n<ul>\n<li>\u516c\u5f0f\u306e example \u3067\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u8a2d\u5b9a\u3092\u5909\u3048\u3066\u307f\u3066\u3001\u6319\u52d5\u3092\u78ba\u8a8d\u3057\u3066\u307f\u3066\u4e0b\u3055\u3044\u3002\n<ul>\n<li><a href=\"https:\/\/codesandbox.io\/s\/swr-basic-forked-cqd1up?file=\/src\/App.js\">codesandbox<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h1>\u307e\u3068\u3081<\/h1>\n<p>\u3044\u304b\u304c\u3067\u3057\u305f\u304b\uff1f \u4eca\u56de\u306f\u3000SWR ver 2.0 \u3067\u767b\u5834\u3057\u305f\u65b0\u3057\u3044\u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u3066\u307f\u307e\u3057\u305f\u3002\u306a\u304a\u3001\u672c\u65e5\u3054\u7d39\u4ecb\u3057\u305f\u30aa\u30d7\u30b7\u30e7\u30f3\u306f\u540c\u3058\u304f 2.0 \u3067\u767b\u5834\u3057\u305f <code>useSWRMutation<\/code> \u3067\u3082\u4f7f\u3048\u308b\u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u306a\u308a\u307e\u3059\u306e\u3067\u3001\u5408\u308f\u305b\u3066\u30c1\u30a7\u30c3\u30af\u3057\u3066\u307f\u3066\u4e0b\u3055\u3044\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u3093\u306b\u3061\u306f\u3001\u30b7\u30b9\u30c6\u30e0\u30a8\u30f3\u30b8\u30cb\u30a2\u306e Kota \u3067\u3059\u3002\u4eca\u56de\u306f\u5c11\u3057\u524d\u306b\u767a\u8868\u3055\u308c\u305f SWR ver 2.0 \u306b\u4fbf\u5229\u3067\u65b0\u3057\u3044\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u8ffd\u52a0\u3055\u308c\u305f\u306e\u3067\u3001\u7c21\u5358\u306b\u89e3\u8aac\u3057\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n","protected":false},"author":3,"featured_media":4143,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[31,57],"tags":[],"_links":{"self":[{"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/posts\/4121"}],"collection":[{"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/comments?post=4121"}],"version-history":[{"count":19,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/posts\/4121\/revisions"}],"predecessor-version":[{"id":4170,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/posts\/4121\/revisions\/4170"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/media\/4143"}],"wp:attachment":[{"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/media?parent=4121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/categories?post=4121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/weseek.co.jp\/tech\/wp-json\/wp\/v2\/tags?post=4121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}