狀態切換行為使用 React 19.2 ViewTransition 搭配 startTransition
前陣子把 nextjs 升級到 16 之後,最大的好處就是現在可以直接使用 React 19.2 的 ViewTransition Component 了。
過去的 Lightbox 雖然也有使用瀏覽器的 SPA view-transition API,但使用的方式有點獵奇。
在使用 ViewTransition 之後可以搭配 useTransition hook 的 startTransition 進行狀態及動畫的觸發管理,省掉不少時間。
但在搭配上一頁關閉圖片的功能時還是有點小問題沒辦法解決。startTransition 包裹的行為只是將相關 state 更新 defer 成(React 的)transition。不會包含由瀏覽器歷史紀錄(上一頁/下一頁)變更觸發的 state update。直接包裹會造成由使用者觸發的 mode update 被 defer,並且觸發歷史紀錄變更立即關閉 lightbox,使 React 觸發 view-transition 過渡動畫時狀態已經變更完畢了,沒有動畫可以播放。
解決做法其實也很簡單。將 closeLightbox 簡化到只負責觸發歷史紀錄變更,等瀏覽器變更完畢後觸發 startTransition 修改 mode、更新 layout、播放動畫。
