有一天,我想為網站創建從清單動畫中快速刪除項目的功能。這次跳過React Transition Group,試試新的View Transition,節省時間。
當很少有程式碼能做到這一點時,為什麼要寫大量程式碼。
View Transition API 僅適用於 Chrome,但我不在乎。
關鍵是 document.startViewTransition.
但需要在state之前、state之後建立DOM,但React.js不允許。
React.js 反應式。不同步。 document.startViewTransition需要同步。
詢問 Google 學習:
import { flushSync } from "react-dom"; flushSync(() => setState(...));
我寫鉤子:
import { useState } from "react"; import { flushSync } from "react-dom"; export const useViewTransition = typeof document !== "undefined" && "startViewTransition" in document ?(newValue: T) => { const [value, setValue] = useState (newValue); if (value !== newValue) { document.startViewTransition(() => { flushSync(() => { setValue(newValue); }); }); } return value; } : (value: T) => value;
const { data: newMsgs } = useQuery({ queryKey: ["msgs"], queryFn: msgs.all(25) }); const msgs = useViewTransition(newMsgs); return ({msgs?.map(item => (
);- {item.title}
))}
現在當useQuery更新時,hook呼叫document.startViewTransition然後setState。
我加global.css:
@supports (view-transition-name: none) { ::view-transition-group(root) { animation-duration: 0s; } ::view-transition-group(.mymsg) { animation-duration: 0.4s; } }
這告訴 Chrome:不要轉換整個頁面,只轉換清單項目。
現在訊息清單動畫開始運作了。很不錯。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3