”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 在 React.js 应用程序中查看过渡动画

在 React.js 应用程序中查看过渡动画

发布于2024-08-27
浏览:178

View Transition Animation in React.js App

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

如果使用useQuery

const { data: newMsgs } = useQuery({
  queryKey: ["msgs"],
  queryFn: msgs.all(25)
});

const msgs = useViewTransition(newMsgs);

return (
  
    {msgs?.map(item => (
  1. {item.title}
  2. ))}
);

现在当useQuery更新时,hook调用document.startViewTransition然后setState。

需要全局 CSS

我添加global.css:

@supports (view-transition-name: none) {
  ::view-transition-group(root) {
    animation-duration: 0s;
  }
  ::view-transition-group(.mymsg) {
    animation-duration: 0.4s;
  }
}

这告诉 Chrome:不要转换整个页面,只转换列表项。

现在消息列表动画开始工作了。很不错。

版本声明 本文转载于:https://dev.to/ctnr/using-view-transitions-in-reactjs-1064?1如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3