在React中寫一個Animation組件,為組件進入和離開加上動畫/過度

来源:https://www.cnblogs.com/looyulong/archive/2019/06/23/11071478.html
-Advertisement-
Play Games

問題 在單頁面應用中,我們經常需要給路由的切換或者元素的掛載和卸載加上過渡效果,為這麼一個小功能引入第三方框架,實在有點小糾結。不如自己封裝。 思路 原理 以進入時 ,退出時 為例 元素掛載時 1. 掛載元素dom 2. 設置動畫 元素卸載時 1. 設置動畫 2. 動畫結束後卸載dom 組件設計 為 ...


問題

在單頁面應用中,我們經常需要給路由的切換或者元素的掛載和卸載加上過渡效果,為這麼一個小功能引入第三方框架,實在有點小糾結。不如自己封裝。

思路

原理

以進入時opacity: 0 --> opacity: 1 ,退出時opacity: 0 --> opacity: 1為例

元素掛載時

  1. 掛載元素dom
  2. 設置動畫opacity: 0 --> opacity: 1

元素卸載時

  1. 設置動畫opacity: 0 --> opacity: 1
  2. 動畫結束後卸載dom

組件設計

為了使得組件簡單易用、低耦合,我們期望如下方式來調用組件:

屬性名 類型 描述
isShow Boolean 子元素顯示或隱藏控制
name String 指定一個name,動畫進入退出時的動畫

App.jsx里調用組件:

通過改變isShow的值來指定是否顯示

// App.jsx
// 其他代碼省略
import './app.css';

<Animation isShow={isShow} name='demo'>
    <div class='demo'>
        demo
    </div>
</Animation>
// 通過改變isShow的值來指定是否顯示

App.css里指定進入離開效果:

// 基礎樣式
.demo {
    width: 200px;
    height: 200px;
    background-color: red;
}

// 定義進出入動畫
.demo-showing {
    animation: show 0.5s forwards;
}
.demo-fading {
    animation: fade 0.5s forwards;
}

// 定義動畫fade與show
@keyframes show {
    from {
        opacity: 0;
    }
    to {
        opacity: 1;
    }
}

@keyframes fade {
    from {
        opacity: 1;
    }
    to {
        opacity: 0;
    }
}

根據思路寫代碼

// Animation.jsx
import { PureComponent } from 'react';
import './index.css';

class Animation extends PureComponent {
    constructor(props) {
        super(props);
        this.state = {
            isInnerShow: false,
            animationClass: '',
        };
    }

    componentWillReceiveProps(props) {
        const { isShow } = props;
        if (isShow) {
            // 顯示
            this.show().then(() => {
                this.doShowAnimation();
            });
        } else {
            // 隱藏
            this.doFadeAnimation();
        }
    }

    handleAnimationEnd() {
        const isFading = this.state.animationClass === this.className('fading');
        if (isFading) {
            this.hide();
        }
    }

    show() {
        return new Promise(resolve => {
            this.setState(
                {
                    isInnerShow: true,
                },
                () => {
                    resolve();
                }
            );
        });
    }

    hide() {
        this.setState({
            isInnerShow: false,
        });
    }

    doShowAnimation() {
        this.setState({
            animationClass: this.className('showing'),
        });
    }

    doFadeAnimation() {
        this.setState({
            animationClass: this.className('fading'),
        });
    }

    /**
     * 獲取className
     * @param {string} inner 'showing' | 'fading'
     */
    className(inner) {
        const { name } = this.props;
        if (!name) throw new Error('animation name must be assigned');
        return `${name}-${inner}`;
    }

    render() {
        let { children } = this.props;
        children = React.Children.only(children);
        const { isInnerShow, animationClass } = this.state;
        const element = {
            ...children,
            props: {
                ...children.props,
                className: `${children.props.className} ${animationClass}`,
                onAnimationEnd: this.handleAnimationEnd.bind(this),
            },
        };
        return isInnerShow && element;
    }
}

export default Animation;

Demo示例

點我直達


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • show命令 show 命令可以提供關於資料庫、表、列,或關於伺服器的狀態信息。 總結 實例 顯示建表建庫語句 sql mysql SHOW DATABASES; + + | Database | + + | information_schema | | mysql | | performance_ ...
  • -- 通配符進行過濾 #使用條件是只能用於文本欄位(字元串),非文本數據類型欄位不能使用通配符搜索 -- LIKE操作符/* 當過濾中使用的值都是已知的時候可以不用通配符,但是當數據量很大 需要進行搜索特定條件的值,簡單的比較操作符肯定不行,這時候利用通配符,可以創建比較特定數據的搜索模式。什麼是通 ...
  • 當下,大數據方面的就業主要有三大方向:一是數據分析類大數據人才,二是系統研發類大數據人才,三是應用開發類大數據人才。 ...
  • 一、高可用簡介 二、集群規劃 三、前置條件 四、集群配置 五、啟動集群 六、查看集群 七、集群的二次啟動 一、高可用簡介 Hadoop 高可用 (High Availability) 分為 HDFS 高可用和 YARN 高可用,兩者的實現基本類似,但 HDFS NameNode 對數據存儲及其一致性 ...
  • 序 我們都知道,瀏覽器上是可以看到前端的html和js代碼的,所以如果遇到隱私心比較強的老闆,你就冷不丁的會接受到一個代碼加密的需求,當接受到這個需求的時候你怎麼完成?那我希望我的這篇博客可以幫助到你。 為了保證本篇教程真實可用,我將使用一臺新的Windows系統,從無到有進行演示,同時將操作流程記 ...
  • 過去的 2018 年,我們認為是國內工業互聯網可視化的元年,圖撲軟體作為在工業可視化領域的重度參與者,一線見證了眾多 HTML5/Web 化、2D/3D 化的項目在工業界應用落地。 2019 年可以定義為泛在電力物聯網的元年,泛在電力物聯網,就是圍繞電力系統各環節,充分應用移動互聯、人工智慧等現代信... ...
  • [2019.06.23 學習筆記5] 1.定義文檔與外部資源的關係。 2.鏈接樣式表 rel="stylesheet" rel是relationship的縮寫,描述link標簽引入的資源與當前文檔的關係,stylesheet是樣式表。 type="text/css" 表示瀏覽器的解析方式,代表引入資 ...
  • [2019.06.23 學習筆記4] 1.定義文檔標題,顯示在瀏覽器視窗的標題欄上。 2.<head>中唯一的必須標簽。 3.<title>中的內容有利於搜索引擎搜索到網站。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...