欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > React@16.x(35)动画(下)封装动画组件需要注意的问题

React@16.x(35)动画(下)封装动画组件需要注意的问题

2024/10/25 19:33:22 来源:https://blog.csdn.net/qq_40147756/article/details/139722008  浏览:    关键词:React@16.x(35)动画(下)封装动画组件需要注意的问题

目录

  • 1,封装举例
  • 2,问题
    • 2.1,timeout
    • 2.2,配合 SwitchTransition / TransitionGroup

接上篇文章 React动画(中)

1,封装举例

封装一个渐入渐出效果的动画组件

import { CSSTransition } from "react-transition-group";
import "./FadeTransition.css";export default function FadeTransition(props) {return <CSSTransition {...props}>{props.children}</CSSTransition>;
}
/* FadeTransition.css */
.appear {opacity: 0;
}.appear-active {opacity: 1;transition: opacity 1s;
}.enter {opacity: 0;
}
.enter-active {opacity: 1;transition: opacity 1s;
}.exit-active {opacity: 0;transition: opacity 1s;
}.exit-done {opacity: 0;
}

使用

import { useState } from "react";
import FadeTransition from "./FadeTransition";export default function App() {const [state, setState] = useState(true);return (<><button onClick={() => setState(!state)}>{state ? "隐藏" : "显示"}</button><FadeTransition in={state} appear timeout={1000}><h1>标题1</h1></FadeTransition></>);
}

2,问题

2.1,timeout

可以看到,传递的 timeout 需要和 css 中的过渡时间保持一致。

解决:将 css 文件中设置的 transition 属性都移除掉,通过内联样式设置。

内联样式通过钩子函数来设置:

import { CSSTransition } from "react-transition-group";
import "./FadeTransition.css";FadeTransition.defaultProps = {timeout: 500,
};const addTransition = (node, timeout) => {node.style.transition = `opacity ${timeout}ms`;
};const removeTransition = (node) => {node.style.transition = "";
};export default function FadeTransition(props) {return (<CSSTransition{...props}onEnter={(node) => addTransition(node, props.timeout)}onEntered={(node) => removeTransition(node)}onExit={(node) => addTransition(node, props.timeout)}onExited={(node) => removeTransition(node)}>{props.children}</CSSTransition>);
}

2.2,配合 SwitchTransition / TransitionGroup

SwitchTransition 组件会调用 CSSTransition 组件的 onExited 方法,让下个元素执行进入动画,所以需要执行传入的 props.onExited(node)

其实,这几个动画组件在不同的动画状态,添加对应的类名,都是在这些钩子函数中实现的。

export default function FadeTransition(props) {return (<CSSTransition{...props}onEnter={(node) => addTransition(node, props.timeout)}onEntered={(node) => removeTransition(node)}onExit={(node) => addTransition(node, props.timeout)}onExited={(node) => {removeTransition(node);props.onExited && props.onExited(node);}}>{props.children}</CSSTransition>);
}

使用:

export default function App() {const [state, setState] = useState(true);return (<><button onClick={() => setState(!state)}>切换</button><SwitchTransition><FadeTransition key={state} appear timeout={1000}><h1>{state ? "标题1" : "标题2"}</h1></FadeTransition></SwitchTransition></>);
}

TransitionGroup 同理,不再赘述。


以上。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com