diff --git a/src/pages/posts/2022-09-02/modern-frontend-design.mdx b/src/pages/posts/2022-09-02/modern-frontend-design.mdx new file mode 100644 index 0000000..05429fb --- /dev/null +++ b/src/pages/posts/2022-09-02/modern-frontend-design.mdx @@ -0,0 +1,72 @@ +--- +layout: ../../../layouts/Layout.astro +pubDate: "2022-09-02" +updatedDate: "2022-09-02" +title: "SPA時代のデータ更新時のUI表示戦略" +author: ダーシノ +description: "レガシーなウェブUIは、リクエストが完了してから画面をレンダリングするため、ローダーやスピナーなどを表示して、レスポンスがあるまで待たなければならない。GitHubをはじめ、昨今のUIでは非同期で更新し、表示内容は即反映。リクエストに失敗したら元に戻す戦略を取っているサイトが多い。" +tags: ["JavaScript"] +--- + +import Header from '../../../components/Header.astro' +import Baseline from '../../../components/Baseline.astro' + +
+ +## 待つタイプのウェブUI + +レガシーなウェブUIは、リクエストが完了してから画面をレンダリングするため、ローダーやスピナーなどを表示して、レスポンスがあるまで待たなければならない。 + +```jsx +{{ book.title }} + +async function update(book, newTitle) { + const res = await request.put( + `/book/${book.id}`, + { title: newTitle } + ) + // リクエストが成功するのを確認してから変更内容を反映する + this.book = res +} +``` + +## 非同期で更新し、即時反映するウェブUI + +GitHubをはじめ、昨今のUIでは非同期で更新し、表示内容は即反映。リクエストに失敗したら元に戻す戦略を取っているサイトが多い。 + +```jsx +{{ book.title }} + +async function update(book, newTitle) { + // ロールバック用のデータ + const oldTitle = this.book.title + + // 即時に変更内容を反映する + this.book.title = newTitle + + try { + const _res = await request.put( + `/book/${book.id}`, + { title: newTitle } + ) + } catch { + // 失敗したら元に戻す + this.book.title = oldTitle + } +} +``` + +## Canvas APIを参考にする + +```js +// スナップショットをとる +entity.save() + +entity.changeTitle(newTitle) +try { + await request.put(...) +} catch { + // 失敗したらリストアする + entity.restore() +} +```