欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React中過渡動畫的編寫方式實例詳解

 更新時間:2022年10月09日 10:28:44   作者:林有酒  
在開發(fā)中我們想要給一個組件的顯示和消失添加某種過渡動畫,可以很好的增加用戶體驗,下面這篇文章主要給大家介紹了關于React中過渡動畫的編寫方式,需要的朋友可以參考下

React的過渡動畫

過渡動畫庫的介紹

在開發(fā)中,我們想要給一個組件的顯示和消失添加某種過渡動畫,可以很好的增加用戶體驗。

當然,我們可以通過原生的CSS來實現(xiàn)這些過渡動畫,但是React社區(qū)為我們提供了react-transition-group用來完成過渡動畫。

React曾為開發(fā)者提供過動畫插件 react-addons-css-transition-group,后由社區(qū)維護,形成了現(xiàn)在的 react-transition- group

這個庫可以幫助我們方便的實現(xiàn)組件的入場和離場動畫,使用時需要進行額外的安裝:

# npm

npm install react-transition-group --save

# yarn

yarn add react-transition-group

react-transition-group本身非常小,不會為我們應用程序增加過多的負擔。

react-transition-group主要包含四個組件:

Transition(了解)

該組件是一個和平臺無關的組件(不一定要結合CSS);

在前端開發(fā)中,我們一般是結合CSS來完成樣式,所以比較常用的是CSSTransition;

CSSTransition

在前端開發(fā)中,通常使用CSSTransition來完成過渡動畫效果

SwitchTransition

兩個組件顯示和隱藏切換時,使用該組件

TransitionGroup

將多個動畫組件包裹在其中,一般用于列表中元素的動畫;

CSSTransition(掌握)

CSSTransition是基于Transition組件構建的:

CSSTransition執(zhí)行過程中,有三個狀態(tài):appear、enter、exit;

每個狀態(tài)又有三種狀態(tài),需要定義對應的CSS樣式:

第一類, 開始狀態(tài): 對應的類是-appear、-enter、-exit;

第二類, 執(zhí)行動畫: 對應的類是-appear-active、-enter-active、-exit-active;

第三類, 執(zhí)行結束: 對應的類是-appear-done、-enter-done、-exit-done;

**CSSTransition常見對應的屬性: **

in:觸發(fā)進入或者退出狀態(tài)

如果添加了unmountOnExit={true},那么該組件會在執(zhí)行退出動畫結束后被移除掉;

當in為true時,觸發(fā)進入狀態(tài),會添加-enter、-enter-acitve的class開始執(zhí)行動畫,當動畫執(zhí)行結束后,會移除兩個class, 并且添加-enter-done的class;

當in為false時,觸發(fā)退出狀態(tài),會添加-exit、-exit-active的class開始執(zhí)行動畫,當動畫執(zhí)行結束后,會移除兩個class,并 且添加-enter-done的class;

classNames:動畫class的名稱

決定了在編寫css時,對應的class名稱

比如card-enter、card-enter-active、card-enter-done;

timeout:

過渡動畫的時間, 最好和css中的時間保持一致

appea:

是否在初次進入添加動畫(需要和in同時為true)

unmountOnExit:退出后卸載組件

其他屬性可以參考官網來學習:https://reactcommunity.org/react-transition-group/transition

export class App extends PureComponent {
  constructor() {
    super()

    this.state = {
      isShow: false
    }
  }

  render() {
    const { isShow } = this.state

    return (
      <div>
        <button onClick={() => this.setState({ isShow: !isShow })}>切換</button>
        {/* timeout和unmountOnExit是必須要加的 */}
        <CSSTransition timeout={2000} unmountOnExit={true} in={isShow} classNames="abc">
          <h2>哈哈哈</h2>
        </CSSTransition>
      </div>
    )
  }
}
/* 要進入的狀態(tài) */
.abc-enter {
  opacity: 0;
}

/* 進入過程的狀態(tài) */
.abc-enter-active {
  opacity: 1;
  transition: opacity 2s ease;
}

/* 要離開的狀態(tài) */
.abc-exit {
  opacity: 1;
}

/* 離開過程的狀態(tài) */
.abc-exit-active {
  opacity: 0;
  transition: opacity 2s ease;
}

CSSTransition對應的鉤子函數(shù):主要為了檢測動畫的執(zhí)行過程,來完成一些JavaScript的操作

onEnter:在進入動畫之前被觸發(fā);

onEntering:在應用進入動畫時被觸發(fā);

onEntered:在應用進入動畫執(zhí)行結束后被觸發(fā);

onExit: 在離開動畫之前觸發(fā);

onExiting: 在應用離開動畫時被觸發(fā)

onExited: 在應用離開動畫執(zhí)行結束后被觸發(fā)

<CSSTransition 
  timeout={2000} 
  unmountOnExit={true}
  in={isShow} 
  classNames="abc"
  onEnter={() => console.log("準備開始執(zhí)行進入動畫")}
  onEntering={() => console.log("執(zhí)行進入動畫")}
  onEntered={() => console.log("進入動畫執(zhí)行結束")}
  onExit={() => console.log("準備開始執(zhí)行離開動畫")}
  onExiting={() => console.log("執(zhí)行離開動畫")}
  onExited={() => console.log("離開動畫執(zhí)行結束")}
>
  <h2>哈哈哈</h2>
</CSSTransition>

SwitchTransition(了解)

SwitchTransition可以完成兩個組件之間切換的炫酷動畫:

比如我們有一個按鈕需要在on和off之間切換,我們希望看到on先從左側退出,off再從右側進入;

這個動畫在vue中被稱之為 vue transition modes;

react-transition-group中使用SwitchTransition來實現(xiàn)該動畫;

SwitchTransition中主要有一個屬性:mode,有兩個值

in-out:表示新組件先進入,舊組件再移除;

out-in:表示舊組件先移除,新組件再進入;

如何使用SwitchTransition呢?

SwitchTransition組件里面要有CSSTransition或者Transition組件,不能直接包裹你想要切換的組件;

SwitchTransition里面的CSSTransition或Transition組件不再像以前那樣接受in屬性來判斷元素是何種狀態(tài),取而代之的是 key屬性;

export class App extends PureComponent {
  constructor() {
    super()

    this.state = {
      isOn: true
    }
  }

  render() {
    const { isOn } = this.state

    return (
      <div>
        <SwitchTransition mode='out-in'>
          <CSSTransition 
            timeout={1000} 
            unmountOnExit={true} 
            key={isOn ? "ON" : "OFF"}
            classNames="handoff"
          >
            <button onClick={() => this.setState({ isOn: !isOn })}>
              {isOn ? "ON" : "OFF"}
            </button>
          </CSSTransition>
        </SwitchTransition>
      </div>
    )
  }
}
.handoff-enter {
  transform: translateX(100px);
  opacity: 0;
}

.handoff-enter-active {
  transform: translateX(0);
  opacity: 1;
  transition: all 1s linear;
}

.handoff-exit {
  transform: translateX(0);
  opacity: 1;
}

.handoff-exit-active {
  transform: translateX(-100px);
  opacity: 0;
  transition: all 1s linear;
}

TransitionGroup(了解)

當我們有一組動畫時,需要將這些CSSTransition放入到一個TransitionGroup中來完成動畫:

export class App extends PureComponent {
  constructor() {
    super()

    this.state = {
      students: [
        {name: "aaa", age: 18},
        {name: "bbb", age: 19},
        {name: "ccc", age: 20},
        {name: "ddd", age: 21}
      ]
    }
  }

  changeStudent(add = true, index) {
    const students = [...this.state.students]
    if(add) {
      students.push({name: new Date().getTime(), age: 22})
    } else {
      students.splice(index, 1)
    }
    this.setState({ students })
  }

  render() {
    const { students } = this.state

    return (
      <div>
        <h3>學生信息</h3>
        {/* component控制渲染成什么元素, 默認為div */}
        <TransitionGroup component="ul">
          {
            students.map((item, index) => {
              return (
                <CSSTransition key={item.name} classNames="stu" timeout={1000}>
                  <li>
                    <span>姓名: {item.name} - 年齡: {item.age}</span>
                    <button onClick={() => this.changeStudent(false, index)}>刪除</button>
                  </li>
                </CSSTransition>
              )
            })
          }
        </TransitionGroup>
        <button onClick={() => this.changeStudent()}>添加學生信息</button>
      </div>
    )
  }
}
.stu-enter {
  transform: translateX(100px);
  opacity: 0;
}

.stu-enter-active {
  transform: translateX(0);
  opacity: 1;
  transition: all 1s ease;
}

.stu-exit {
  transform: translateX(0);
  opacity: 1;
}

.stu-exit-active {
  transform: translateX(100px);
  opacity: 0;
  transition: all 1s ease;
}

 總結

到此這篇關于React中過渡動畫編寫的文章就介紹到這了,更多相關React過渡動畫編寫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 簡單幾行JS Code實現(xiàn)IE郵件轉發(fā)新浪微博

    簡單幾行JS Code實現(xiàn)IE郵件轉發(fā)新浪微博

    大概就是說我們可以用window.external.menuArguments這個對象獲取到內部的信息,如window,document這些常用的對象
    2013-07-07
  • BootstrapValidator實現(xiàn)表單驗證功能

    BootstrapValidator實現(xiàn)表單驗證功能

    這篇文章主要為大家詳細介紹了BootstrapValidator實現(xiàn)表單驗證功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 淺談pc端rem字體設置的問題

    淺談pc端rem字體設置的問題

    下面小編就為大家?guī)硪黄獪\談pc端rem字體設置的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • JavaScript 事件冒泡應用實例分析

    JavaScript 事件冒泡應用實例分析

    在一些傳統(tǒng)的小型WEB應用開發(fā)過程中,JavaScript通常只是拿來做表單驗證而以,所以你很少會遇到因為JavaScript事件冒泡而影響功能的實現(xiàn)情況,又或者事件冒泡對最終實現(xiàn)效果影響不大,可忽略。
    2010-01-01
  • js中forEach的用法之forEach與for之間的區(qū)別

    js中forEach的用法之forEach與for之間的區(qū)別

    這篇文章主要介紹了js中forEach的用法之forEach與for之間的區(qū)別,forEach() 調用數(shù)組的每個元素,并將元素傳遞給回調函數(shù),下面更多詳細介紹需要的小伙伴可以參考一下

    2022-03-03
  • 在組件外(.js文件)中使用pinia的解決方法

    在組件外(.js文件)中使用pinia的解決方法

    這篇文章主要給大家介紹了關于在組件外(.js文件)中使用pinia的解決方法, pinia是Vue的最新一代的輕量級狀態(tài)管理插件,它允許跨組件/頁面共享狀態(tài),需要的朋友可以參考下
    2024-06-06
  • js HTML5多圖片上傳及預覽實例解析(不含前端的文件分割)

    js HTML5多圖片上傳及預覽實例解析(不含前端的文件分割)

    這篇文章主要詳細解析了js HTML5多圖片上傳及預覽實例,不含前端的文件分割,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • JavaScript?新提案optional?chaining可選鏈屬性原理詳解

    JavaScript?新提案optional?chaining可選鏈屬性原理詳解

    這篇文章主要為大家介紹了JavaScript?新提案optional?chaining可選鏈屬性原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 深入理解Javascript中this的作用域

    深入理解Javascript中this的作用域

    這篇文章主要介紹了深入理解Javascript中this的作用域,本文用大量例子來深入探討this的作用域,需要的朋友可以參考下
    2014-08-08
  • JavaScript實現(xiàn)快速排序的方法

    JavaScript實現(xiàn)快速排序的方法

    這篇文章主要介紹了JavaScript實現(xiàn)快速排序的方法,實例分析了javascript快速排序的相關實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論