当前位置: 首页 > 知识库问答 >
问题:

前端 - react元素创建删除动画怎么写比较好?

逑阳泽
2023-05-10

css

.ani-fadeIn{animation: fadeIn .5s ease-in-out both;}

@keyframes fadeIn {0%{opacity: 0;}100%{opacity: 1;}}

.ani-fadeOut{animation: fadeOut .5s linear both;}

@keyframes fadeOut {0%{opacity: 1;}100%{opacity: 0;}}

组件

function Example(){

  const [nextStep,setNextStep] = useState(false)

  const [aniType,setAniType] = useState(false)

  return(
    <>
        <button onClick={()=>setNextStep(true)}>显示</button>
        {
          nextStep &&
            <>
              <button onClick={() => setAniType(true)}>隐藏</button>
              <div
                className={aniType ? 'ani-fadeOut': 'ani-fadeIn'}
                onAnimationEnd={(e) => {
                  if (e.animationName == "fadeOut") {
                    setNextStep(false);
                    setAniType(false);
                  }
                }}
              >123</div>
            </>
        }
    </>
  )
}

如上代码是我写的效果,有没有更好的写法
(可以的话,最好不要用库,例如react-transition-group)

共有2个答案

谷梁博易
2023-05-10

不想用库的话,你可以自定义Hook来管理动画类名:

import React, { useState, useCallback } from 'react';
import './App.css';

// 自定义 Hook,用于管理动画
function useAnimation(animationClassNames) {
  const [animationClassName, setAnimationClassName] = useState('');

  const triggerAnimation = useCallback((animationName, onEnd) => {
    setAnimationClassName(animationClassNames[animationName]);
    const onAnimationEnd = (e) => {
      if (e.animationName === animationName) {
        setAnimationClassName('');
        onEnd?.();
      }
    };
    return onAnimationEnd;
  }, [animationClassNames]);

  return [animationClassName, triggerAnimation];
}

function Example() {
  const [isVisible, setIsVisible] = useState(false);
  const [animationClassName, triggerAnimation] = useAnimation({
    fadeIn: 'ani-fadeIn',
    fadeOut: 'ani-fadeOut',
  });

  const handleShow = () => {
    setIsVisible(true);
  };

  const handleHide = () => {
    triggerAnimation('fadeOut', () => {
      setIsVisible(false);
    });
  };

  return (
    <>
      <button onClick={handleShow}>显示</button>
      {isVisible && (
        <>
          <button onClick={handleHide}>隐藏</button>
          <div className={animationClassName}>123</div>
        </>
      )}
    </>
  );
}

export default Example;
葛勇锐
2023-05-10

你可以用用animate.js这类库来实现动画控制

Animate.js

用起来就像

cosnt animeInstance = anime({
    targets: targetRef.current,
    translateX: 250,
    easing: 'linear',
    duration: 5000
})
if ( something ){
    animeInstance.pause()
}
 类似资料:
  • 本文向大家介绍hbase的rowkey怎么创建好?列族怎么创建比较好?相关面试题,主要包含被问及hbase的rowkey怎么创建好?列族怎么创建比较好?时的应答技巧和注意事项,需要的朋友参考一下 解答: hbase存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性) 一个列族在数据底层是一个文件

  • 为什么React中shouldComponentUpdata,React.memo这些使用浅比较,而是===

  • ​ ​ ①进入APP主界面,点击左上角的地图列表按钮,如上图红框处按钮 ​ ​ ②地图列表如上图,在列表上可以选择不同的地图列表切换不同的数据地图,点击新建地图按钮如上图红框中,即可进入创建地图 ​ ​③创建地图,先填入地图名称(地图的简短标识,必须填写),点击保存即可新建地图操作,如上图。

  • 类似这样,飘忽不定的感觉

  • 问题内容: 我有一个CSS3动画,需要单击才能重新启动。这是一个显示剩余时间的条形图。我正在使用scaleY(0)转换来创建效果。 现在,我需要通过将条恢复到scaleY(1)并重新将其转到scaleY(0)来重新启动动画。我第一次尝试设置scaleY(1)失败,因为要花费相同的15秒才能将其恢复到全长。即使我将持续时间更改为0.1秒,我也需要延迟或链接scaleY(0)的分配,以使补充条完成。对

  • 我编写了下面的代码来从ArrayList中获取重复的元素。我的aerospikePIDs列表没有任何重复的值,但是当我执行下面的代码时,它仍然在读取if条件。