≪ Today I learned. RSS購読
公開日
タグ
JavaScript
著者
ダーシノ(@bc_rikko)

SPA時代のデータ更新時のUI表示戦略

待つタイプのウェブUI

レガシーなウェブUIは、リクエストが完了してから画面をレンダリングするため、ローダーやスピナーなどを表示して、レスポンスがあるまで待たなければならない。

<Title>{{ book.title }}</Title>

async function update(book, newTitle) {
  const res = await request.put(
    `/book/${book.id}`,
    { title: newTitle }
  )
  // リクエストが成功するのを確認してから変更内容を反映する
  this.book = res
}

非同期で更新し、即時反映するウェブUI

GitHubをはじめ、昨今のUIでは非同期で更新し、表示内容は即反映。リクエストに失敗したら元に戻す戦略を取っているサイトが多い。

<Title>{{ book.title }}</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を参考にする

// スナップショットをとる
entity.save()

entity.changeTitle(newTitle)
try {
  await request.put(...)
} catch {
  // 失敗したらリストアする
  entity.restore()
}