实现一个带有动态效果的React弹窗组件
时间:2023-03-16 15:56:08
科技观察
我们在写一些UI组件的时候,如果不考虑动态效果的话,实现起来很简单,主要就是在它们之间进行切换(类似Vue中的v-if属性)或者可见性切换(类似于Vue中的v-show属性)。1、在React中,没有动效的弹窗可以这样实现:interfaceModalProps{open:boolean;onClose?:()=>void;children?:any;}constModal=({open.onClose,children}:ModalProps)=>{if(!open){returnnull;}returncreatePortal(
x ,document.body);};用法:constApp=()=>{const[open,setOpen]=useState(false);return(
setOpen(true)}>showmodalsetOpen(false)}>modalcontent );};我们这里是用open属性来控制是否显示,但是完全没有渐变效果。如果我们要实现淡入淡出、缩放等动画效果,就需要修改这个。2、自己实现动态弹窗很多同学经常在显示的时候有动态效果,关闭的时候没有动态效果。动画的时间控制不好。这里我们先自己实现动效的流动。最初意识到的时候,动画只有开始状态和结束状态,需要大量的变量和逻辑来控制动画。后来参考了react-transition-group组件的实现,将动效拆分成几个部分,每个部分单独控制。开启动画效果顺序:enter->enter-active->enter-done;关闭动画效果顺序:exit->exit-active->exit-done;动画过程处于enter-active和exit-active的过程中。然后我们用一个变量active来控制是否关闭动画,参数open只控制是执行展开动画还是关闭动画。当open和active都为false时,弹窗将被销毁。constModal=({open,children,onClose})=>{const[active,setActive]=useState(false);//弹窗的存在周期if(!open&&!active){returnull;}returnReactDOM.createPortal(
{children}