コンポーネント
← すべてのコンポーネント

楽観的 UI

stimeo--optimistic

即時適用・成功なら維持・失敗なら正確にロールバックする、Turbo フォームの楽観的 UI。

  • Core
  • Rails / Turbo

stimeo--optimistic は Turbo フォームをラップし、送信開始の瞬間に宣言された楽観状態を適用します。show ターゲットを表示、hide ターゲットを非表示にし、フォームに data-optimistic="true" と aria-busy="true" を付けます。turbo:submit-end が成功なら切替はそのまま維持して commit を発火 — 最終 DOM はサーバの Turbo Stream 応答(またはリダイレクト)が所有します。失敗ならこのコントローラが行った変更だけを正確に復元して rollback を発火します。実際に切り替えたターゲットにだけ data-optimistic-toggled マーカーを付けるため、作者が最初から表示していた要素を誤って隠しません。Turbo 自身の送信ライフサイクルイベントに委譲リスナ 2 本で乗るだけ — Action Cable も fetch のパッチも不要で、だからこそ stimeo-ui/cable ではなくゼロ依存のコアに置かれています。submit-once(二重送信ガード)や live-counter(楽観的数値)と自然に併用できます。show/hide 以外の宣言(クラスやテキストの差し替え)は commit / rollback イベントを購読する消費側の領分で、ロールバック時のエラー表示はフォームのエラー UI の責務です。

実行中

どちらのボタンもクリックした瞬間に「いいね済み」へ反転します(実体はボタンごとの Turbo フォーム送信です)。1 つ目のボタンは送信が成功するため反転が維持され(サーバの Turbo Stream がステータス行を更新します)、2 つ目のボタンは fail=1 を送ってサーバが 422 で拒否するため、反転がロールバックされる様子を観察できます。