gpt4 book ai didi

javascript - 输入时动画不起作用(Tailwind、TransitionGroup、Typescript)

转载 作者:行者123 更新时间:2023-12-03 07:24:47 27 4
gpt4 key购买 nike

我创建了一个包装器组件以通过字符串提供类名列表以支持 Tailwind 实用程序转换。这旨在嵌套在 TransitionGroup 组件中以支持多个项目的动画,例如列表。

我可以很好地制作出动画,但输入无效。你能帮我找出这段代码中的错误吗?

react 16.13.1 react 过渡组 4.4.1

沙盒:https://codesandbox.io/s/delicate-feather-ymozq

(登录那里查看 div 引用,以防类未被应用,但它们似乎工作正常)

import React, { ReactNode } from "react";
import { Transition as ReactTransition } from "react-transition-group";

interface TransitionProps {
in?: boolean;
timeout: number;
enter?: string;
enterFrom?: string;
enterTo?: string;
leave?: string;
leaveFrom?: string;
leaveTo?: string;
children: ReactNode;
}

export function CSSTransition(props: TransitionProps) {
const { enter, enterFrom, enterTo, leave, leaveFrom, leaveTo } = props;
const nodeRef = React.useRef<HTMLDivElement>(null);

const enterClasses = splitClasses(enter);
const enterFromClasses = splitClasses(enterFrom);
const enterToClasses = splitClasses(enterTo);
const leaveClasses = splitClasses(leave);
const leaveFromClasses = splitClasses(leaveFrom);
const leaveToClasses = splitClasses(leaveTo);

function splitClasses(string: string | undefined): string[] {
if (string) return string.split(" ").filter((s) => s.length);
return [];
}

function addClasses(classes: string[]) {
nodeRef.current?.classList.add(...classes);
}

function removeClasses(classes: string[]) {
nodeRef.current?.classList.remove(...classes);
}

return (
<ReactTransition
in={props.in}
nodeRef={nodeRef}
timeout={props.timeout}
unmountOnExit
onEnter={() => {
console.log("onEnter", nodeRef);
addClasses([...enterClasses, ...enterFromClasses]);
}}
onEntering={() => {
console.log("onEntering", nodeRef);
removeClasses(enterFromClasses);
addClasses(enterToClasses);
}}
onEntered={() => {
console.log("onEntered", nodeRef);
removeClasses([...enterToClasses, ...enterClasses]);
}}
onExit={() => {
console.log("onExit", nodeRef);
addClasses([...leaveClasses, ...leaveFromClasses]);
}}
onExiting={() => {
console.log("onExiting", nodeRef);
removeClasses(leaveFromClasses);
addClasses(leaveToClasses);
}}
onExited={() => {
console.log("onExited", nodeRef);
removeClasses([...leaveToClasses, ...leaveClasses]);
}}
>
<div ref={nodeRef}>{props.children}</div>
</ReactTransition>
);
}

最佳答案

解决方案:

CSSTransition.tsx 中,更改

import { Transition as ReactTransition } from "react-transition-group";

import { CSSTransition as ReactTransition } from "react-transition-group";

说明:

Tailwind 类名依赖于 CSS 动画。

Transition 并非设计用于 CSS 动画,因为 onEnteronEntering 方法的调用速度如此之快以至于 DOM 重绘(a动画的帧)不会出现在它们之间。因此,您为 enterTo 设置的所有类都会立即应用,没有任何机会过渡到它们。

CSS Transition 另一方面,在创建元素时添加一个 -enter 类,然后添加一个 -enter-active < strong>在下一个刻度/帧上。最后,在超时之后,它删除所有类,除了添加 -done 类。

-enter-enter-active 类之间的转换是允许 CSS 转换发生的关键。在这些类之间添加一个刻度/帧,允许库强制重绘。此重绘强制 onEntering 类按预期过渡到 onEntered 类。

换句话说,Transition 立即切换到 enterTo 状态,而 CSSTransition 在类切换之间给出一帧,这是允许动画发生。

DOM 通常以每秒最多 60 帧的速度进行动画/更改(取决于实现/最终用户屏幕刷新率),每帧留出 16 毫秒;它不关心这 16 毫秒之间发生了什么。如果类更改后的最终状态是您的 enterTo 状态而不是您的 enterFrom 状态,它将忽略 enterFrom 状态,因此永远不会向您显示顺风动画。

来源:

关于javascript - 输入时动画不起作用(Tailwind、TransitionGroup、Typescript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62295326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com