国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 15:37:34
字體:
來源:轉載
供稿:網友

問題

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

思路

原理

以進入時 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.jsximport { 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;            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 白城市| 甘肃省| 阳西县| 闽侯县| 许昌县| 大名县| 菏泽市| 邵阳市| 深州市| 延寿县| 通榆县| 梓潼县| 偃师市| 从化市| 车险| 丰顺县| 建德市| 乐陵市| 宁化县| 东海县| 普陀区| 鹤壁市| 旌德县| 凤台县| 井研县| 来凤县| 娄底市| 元阳县| 卓尼县| 诸暨市| 黔江区| 淳安县| 九龙坡区| 花莲市| 邳州市| 兴业县| 齐齐哈尔市| 新郑市| 洛隆县| 湛江市| 灵武市|