亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

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

2024-05-06 16:52:39
字體:
來源:轉載
供稿:網友

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

問題

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

思路

原理

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

元素掛載時

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

元素卸載時

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

組件設計

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

在 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示例

點我直達


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲xxx| 欧美性极品少妇精品网站| 欧美黑人xxxx| 国产999在线观看| 欧美日韩中文字幕日韩欧美| 欧美日韩一区二区三区| 日韩免费看的电影电视剧大全| 精品日本高清在线播放| 亚洲精品久久久久中文字幕二区| 久久综合国产精品台湾中文娱乐网| 91麻豆国产精品| 久久久视频免费观看| 国产一区二区三区在线看| 国产亚洲综合久久| 欧美色xxxx| 欧美日韩在线视频观看| 亚洲精品美女在线观看播放| 国产91在线视频| 久久在线精品视频| 国产在线一区二区三区| 国产精品va在线播放我和闺蜜| 国产精品一区二区三区在线播放| 亚洲天堂网站在线观看视频| 日本午夜精品理论片a级appf发布| 亚洲欧美激情一区| 亚洲一区二区三区xxx视频| 国产乱人伦真实精品视频| 亚洲一区第一页| 日韩成人激情视频| 色偷偷偷综合中文字幕;dd| 亚洲精品一区二三区不卡| 色偷偷av一区二区三区| 中文综合在线观看| 亚洲永久免费观看| 在线视频日韩精品| 亚洲欧美国产一本综合首页| 最近2019中文字幕大全第二页| 国产综合在线看| 欧美精品aaa| 91禁国产网站| 日韩欧美精品在线观看| 欧美伊久线香蕉线新在线| 欧美做受高潮1| 福利二区91精品bt7086| 欧美国产日本高清在线| 国产精品福利在线观看网址| 2019亚洲男人天堂| 国产精品女主播视频| 亚洲精品一区二区三区不| 久久精品在线播放| 国产午夜精品免费一区二区三区| 91亚洲精品一区| 欧美日韩在线看| 91精品久久久久久久久| 国产日韩欧美日韩大片| 国产成人精品av| 国产盗摄xxxx视频xxx69| 国产精品视频公开费视频| 一本色道久久综合狠狠躁篇的优点| 九九视频直播综合网| 欧美一级大胆视频| 亚洲国产日韩一区| 日韩专区在线播放| 亚洲www在线| 亚洲精品综合久久中文字幕| 亚洲一区二区自拍| 亚洲精品98久久久久久中文字幕| 日韩在线激情视频| 97超级碰在线看视频免费在线看| 久久久久99精品久久久久| 国产精品嫩草影院一区二区| 欧美又大粗又爽又黄大片视频| 91久久精品国产91久久性色| 欧美另类高清videos| 国产噜噜噜噜噜久久久久久久久| 国产69久久精品成人看| 日韩国产高清视频在线| 精品亚洲一区二区| 国产婷婷97碰碰久久人人蜜臀| 久久伊人精品一区二区三区| 69视频在线免费观看| 成人国内精品久久久久一区| 一道本无吗dⅴd在线播放一区| 日本精品免费一区二区三区| 日韩精品在线视频观看| 91亚洲精品视频| 中文一区二区视频| 欧美日韩成人精品| 亚洲男人天堂2024| 亚洲综合在线做性| 日韩欧美国产高清91| 国产精品专区一| 成人免费大片黄在线播放| 美女少妇精品视频| 欧美老女人性生活| 久久精品99无色码中文字幕| 国产日韩亚洲欧美| 欧美日韩国产影院| 国产精品成人va在线观看| 亚洲精品影视在线观看| 欧美麻豆久久久久久中文| 欧美激情奇米色| 欧美另类99xxxxx| 亚洲一区二区国产| 日韩av电影手机在线观看| 国产一区二区三区在线播放免费观看| 欧美福利视频在线| 色偷偷亚洲男人天堂| 久久精品这里热有精品| 国产色综合天天综合网| 国产成人精品国内自产拍免费看| 久久精品91久久香蕉加勒比| 日韩在线视频线视频免费网站| 久久国产精品久久久久| 91成品人片a无限观看| 亚洲在线一区二区| 中文字幕久热精品在线视频| 国产精品免费一区二区三区都可以| 2019中文在线观看| 国产精品久久久久久久久久小说| 久久久久久免费精品| 国产精品视频99| 亚洲精品福利免费在线观看| 亚洲欧美另类中文字幕| 亚洲最大av网站| 国产美女主播一区| 亚洲v日韩v综合v精品v| 亚洲国产成人精品电影| 国产亚洲欧美aaaa| 日韩电视剧在线观看免费网站| 欧美三级免费观看| 自拍偷拍亚洲区| 欧美重口另类videos人妖| 国产亚洲激情视频在线| 亚洲人av在线影院| 欧美另类xxx| 欧美激情xxxxx| 国产视频久久久久| 国产精品美女www爽爽爽视频| 成人黄色在线免费| 久久中文字幕国产| 北条麻妃99精品青青久久| 国产亚洲欧美另类中文| 97超级碰碰人国产在线观看| 国产日韩欧美影视| 国产精品久久久久久亚洲影视| 98午夜经典影视| 成人黄色激情网| 国产精品入口尤物| 主播福利视频一区| 欧美激情精品在线| 国产精品入口免费视频一| 久久91超碰青草是什么| 色偷偷91综合久久噜噜| 日韩电影在线观看永久视频免费网站| 黑人精品xxx一区一二区| 亚洲日韩中文字幕在线播放| 亚洲黄色www| 久久激情视频免费观看| 国产精品入口免费视| 97国产精品视频| 精品国产网站地址| 91免费精品国偷自产在线| 国产欧美日韩精品在线观看|