• react简单写一个transition动画组件然后在modal组件中应用


    1. 动画组件

    原理: 利用transition和class类的切换执行transition的动画效果

    1. import React from "react";
    2. import _ from "lodash";
    3. interface IProps {
    4. name: string;
    5. children: React.ReactNode;
    6. transitionShow: boolean;
    7. }
    8. const MyTransition = (props: IProps) => {
    9. const { name, children, transitionShow } = props;
    10. const getTransition = (name, transitionShow = true) => {
    11. const val = transitionShow ? "-leave-active" : "-leave-to";
    12. return name + val;
    13. };
    14. return <div className={getTransition(name, transitionShow)}>{children}</div>;
    15. };
    16. export default MyTransition;

    scss部分:

    1. // transition动画部分
    2. .myOpacity-enter,
    3. .myOpacity-leave-to {
    4. opacity: 0;
    5. // 因为picker滚动区域有过transform, 这里也写transform的话会导致本不该滚动的地方滚动了
    6. margin: 30px;
    7. // animation: fadeIn 0.5s steps(1);
    8. transition: all 0.5s ease;
    9. }
    10. .myOpacity-enter-active,
    11. .myOpacity-leave-active {
    12. transition: all 0.5s ease;
    13. }
    14. @keyframes fadeIn {
    15. 20% {
    16. opacity: 0.9;
    17. margin: 30px;
    18. }
    19. 40% {
    20. opacity: 0.8;
    21. margin: 25px;
    22. }
    23. 60% {
    24. opacity: 0.7;
    25. margin: 20px;
    26. }
    27. 80% {
    28. opacity: 0.6;
    29. margin: 15px;
    30. }
    31. 100% {
    32. opacity: 0.5;
    33. margin: 10px;
    34. }
    35. }
    36. .myPopup-enter,
    37. .myPopup-leave-to {
    38. transform: translateY(100vh);
    39. // animation: popupTranslateY 0.5s steps(1);
    40. transition: all 0.5s ease;
    41. }
    42. .myPopup-enter-active,
    43. .myPopup-leave-active {
    44. transition: all 0.5s ease;
    45. }
    46. @keyframes popupTranslateY {
    47. 20% {
    48. transform: translateY(10vh);
    49. }
    50. 40% {
    51. transform: translateY(20vh);
    52. }
    53. 60% {
    54. transform: translateY(40vh);
    55. }
    56. 80% {
    57. transform: translateY(60vh);
    58. }
    59. 100% {
    60. transform: translateY(100vh);
    61. }
    62. }

    使用方法, 比如一个modal组件需要动画的话:

    1. import React, { useEffect, useState, ReactNode, useImperativeHandle, forwardRef } from "react";
    2. import _ from "lodash";
    3. import "./Picker.scss";
    4. import * as ReactDOM from "react-dom";
    5. import MyTransition from "./MyTransition";
    6. interface IProps {
    7. isShow: boolean;
    8. setIsShow: (arg1: boolean) => void;
    9. children: ReactNode;
    10. }
    11. const MyPickerModal = forwardRef((props: IProps, ref) => {
    12. const { isShow, setIsShow, children } = props; // 解构props, 得到需要使用来自父页面传入的数据
    13. const [pickerIsShow, setPickerIsShow] = useState(props.isShow);
    14. useEffect(() => {
    15. setPickerIsShow(isShow);
    16. }, [isShow]);
    17. useImperativeHandle(ref, () => ({
    18. close,
    19. }))
    20. function close() {
    21. setTimeout(() => {
    22. setPickerIsShow(false);
    23. // 延迟关闭, 因为MyTransition需要这段时间差执行动画效果, 否则看起来像没有动画效果似的突然消失了
    24. setTimeout(() => {
    25. setIsShow(false);
    26. }, 500);
    27. }, 0);
    28. } // 点击取消按钮
    29. return ReactDOM.createPortal(
    30. <div className="picker-container">
    31. <MyTransition name="myPopup" transitionShow={pickerIsShow}>
    32. {isShow && <section className="pop-cover" onClick={close}></section>}
    33. </MyTransition>
    34. <MyTransition name="myOpacity" transitionShow={pickerIsShow}>
    35. {isShow && children}
    36. </MyTransition>
    37. </div>,
    38. document.body
    39. );
    40. });
    41. export default MyPickerModal;

    ReactDOM.createPortal(element, 要插入这个elment的父元素, 一般写body, 也自己去html文件加一个元素, 插入到那个元素中去

  • 相关阅读:
    基于径向基函数RBF网络的手写数字分类(Matlab代码实现)
    各大公司Java后端开发面试题总结
    ACL访问控制列表的解析和配置
    软件设计原则
    6、MySQL——模糊查询、字段控制查询
    面试经典 150 题 3 —(双指针)— 167. 两数之和 II - 输入有序数组
    #国产工业软件#外行人看工业软件,接轨还是出轨?
    使用过邮箱服务,你对`SMTP`、`POP3`、`IMAP`三大协议有过了解吗?
    论文笔记-Sharing More and Checking Less:SaTC
    Sentinel学习(1)——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 & Sentinel的相关概念 + 下载运行
  • 原文地址:https://blog.csdn.net/qq_42750608/article/details/133875202