有一天,我想为网站创建从列表动画中快速删除项目的功能。这次跳过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