日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

react 官网动画库(react-transition-group)的新写法

發布時間:2023/12/15 综合教程 20 生活家
生活随笔 收集整理的這篇文章主要介紹了 react 官网动画库(react-transition-group)的新写法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文章主要介紹了關于react 官網動畫庫(react-transition-group)的新寫法 ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

一、react-transition-group 一個官網提供的動畫過度庫。

搜索了網上關于react動畫的,很多的答案都是很久以前的了老版本了,而現在官方提供的是叫react-transition-group 它是以前兩個的合體版本,所以寫下這個記錄一下,同時也給一些需要的猿門給一些小的提示。
1、安裝

# npm
npm install react-transition-group --save

# yarn
yarn add react-transition-group

登錄后復制

而官方提供的三個組建Transition,CSSTransition,TransitonGroup

Transition

過渡組件(Transiton)允許您用一個簡單的聲明性API描述隨著時間的推移從一個組件狀態到另一個組件狀態的轉換。最常用的是用來動畫一個組件的安裝和卸載,但也可以用來描述在適當的過渡狀態。默認情況下,該組件不會更改其呈現的組件的行為,它只跟蹤組件的“進入”和“退出”的狀態。由你來為這些狀態定義效果。(翻譯)
實際的情況就是你如果只寫這個組件是沒有任何的效果的,就和你寫一個p一樣。所以你需要給他們賦予一些參數才可以。例如下面這個例子

//自己簡單的封裝了一個,該有的參數都由了,可以自行粘貼在自己的代碼里面去試試。
class Fade extends React.Component {
  constructor(props) {
    super(props);
  }
  done =() => {
    // console.log('結束了')
  }
  addaddEndListener = (node) => { //原生時間transition運動的事件
    node.addEventListener('transitionend', this.done, false);
  }

  // 三個進入狀態的事件,可以做你想做的事情
  onEnter = (node, isAppearing) => {
    console.log(isAppearing, 'onEnter')
  }
  onEntering = (node, isAppearing) => {
    console.log(isAppearing, 'onEntering')
  }
  onEntered = (node, isAppearing) => {
    console.log(isAppearing, 'onEntered')
  }

  // 三個退出的狀態的事件
  onExit = (node) => {
    console.log('onExit')
  }
  onExiting = () => {
    console.log('onExiting')
  }
  onExited = () => {
    console.log('onExited')
    this.props.self()
  }
  render() {
    const { in: inProp, dur} = this.props;
    const defaultStyle = {
      transition: `transform ${300}ms ease-in-out, opacity ${300}ms ease-in-out`,
      transform: 'translateX(100px)',
      opacity: '0'
    }

    const transitionStyles = {
      entering: { transform: 'translateX(100px)', opacity: '0'},
      entered:  { transform: 'translateX(0px)', opacity: '1' },
      exiting: {transform: 'translateX(0px)', opacity: '1'},
      exited: {transform: 'translateX(0px)', opacity: '0'}
    };
    const duration = {
      enter: 300,
      exit: 300,
    }
    // 上面的都是基本參數,樣式的轉變以及時間的設定,具體的可以看官網文檔
    // 樣式也可以寫成className 例如<MyComponent className={`fade fade-${status}`} />
    return (
      <Transition 
        onEnter={this.onEnter}
        onEntering={this.onEntering}
        onEntered={this.onEntered}

        onExit={this.onExit}
        onExiting={this.onExiting}
        onExited={this.onExited}

        addEndListener={this.addaddEndListener} 
        in={inProp} 
        unmountOnExit={false} // 為true 代表退出的時候移除dom
        appear={true} // 為true  渲染的時候就直接執行動畫,默認false,
        timeout={duration}
      >
        {
          state => {
            console.log(state, '###') //你可以很直觀的看到組件加載和卸載時候的狀態
            return(
              <p style={{
                ...defaultStyle,
                ...transitionStyles[state]
              }}>
                {this.props.children}
              </p>
            )
          }
        }
      </Transition>
    );
  }
}

登錄后復制

其中上面的狀態有四種:

entering
entered
exiting
exited

登錄后復制

組件的初始化狀態都停留在exited
上面就是寫的一個最基本的例子,下面是如何的調用

let num = 1;
class Dnd extends React.Component {
  state = {
    ins: true,
    current: 1,
    dom: <p className={l.test}>
            ceshi weizhi {num}
          </p>
  }
  handle = (bool) => {
    this.setState({
      test: !bool
    })
  }
  end = () => {
    const that = this;
    num = num + 1;
    setTimeout(function () {
      that.setState({
        test: true,
        dom: <p className={l.test}>
              888888 {num}
            </p>
      }) 
    }, 500)
    
  }
  render () {
    const { location } = this.props
    const { test } = this.state;
    return (
      <MainLayout location={location}>
        <Button onClick={this.handle.bind(null, this.state.test)}>點擊transition</Button>
        <Fade in={this.state.test} self={this.end}>
          {this.state.dom}
        </Fade>
      </MainLayout>
    )
  }
}
// 效果是每次點擊按鈕都會進行一次進場和出場的動畫。也可以自行衍生。

登錄后復制

這個組件大概就是這樣的,這樣適合寫一個tab類型的頁面,在切換的時候可以展示不同的dom

登錄后復制

CSSTransition

此組件是在轉換的出現、進入、退出階段應用一對類名(也就是className),靠這個來激活CSS動畫。所以參數和平時的className不同,參數為:classNames
參數:(主要)in, timeout, unmountOnExit, classNames, 用法同Transition。看如下例子:

state  = {
    star: false
}


<Button onClick={this.handleStar.bind(null, star)}>start</Button>
<CSSTransition
  in={star}
  timeout={300}
  classNames="star"
  unmountOnExit
>
  <p className="star">⭐</p>
</CSSTransition>

登錄后復制

效果是點擊button 顯示星星,在點擊消失星星的動畫!
參數classNames="star", 組件會找對應狀態的className, 如下

.star {
    display: inline-block;
    margin-left: 0.5rem;
    transform: scale(1.25);
  }
  .star-enter {
    opacity: 0.01;
    transform: translateY(-100%) scale(0.75);
  }
  .star-enter-active {
    opacity: 1;
    transform: translateY(0%) scale(1.25);
    transition: all 300ms ease-out;
  }
  .star-exit {
    opacity: 1;
    transform: scale(1.25);
  }
  .star-exit-active {
    opacity: 0;
    transform: scale(4);
    transition: all 300ms ease-in;
  }

登錄后復制

依次執行的順序是

1、星星顯示 對應的class為star-enter star-enter-active 動畫走完為star-enter-done
2、星星消失 對應的class為star-exit  star-exit-active 動畫走完為star-exit-done

登錄后復制

如果按照官網的解釋就是如下, 有興趣的可以自行去試一試。

classNames={{
 appear: 'my-appear',
 appearActive: 'my-active-appear',
 enter: 'my-enter',
 enterActive: 'my-active-enter',
 enterDone: 'my-done-enter,
 exit: 'my-exit',
 exitActive: 'my-active-exit',
 exitDone: 'my-done-exit,
}}

登錄后復制

每個階段的鉤子函數同Transition.

TransitionGroup

一看group就知道肯定是列表形態的動畫了!但是看了官網后知道,TransitionGroup不提供任何形式的動畫,具體的動畫取決與你包裹的Transition || CSSTransition的動畫,所以你可以在列表里面做出不同類型的動畫出來。下面來看一個例子

class List extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      items: [
        { id: 1, text: 'Buy eggs' },
        { id: 2, text: 'Pay bills' },
        { id: 3, text: 'Invite friends over' },
        { id: 4, text: 'Fix the TV' },
      ]
    }
  }

  render() {
    const { items } = this.state; 
    return (
      <p>
        <TransitionGroup className="todo-list">
          {items.map(({ id, text }) => (
            <CSSTransition
              key={id}
              timeout={500}
              classNames="fade"
            >
              <p>
                <Button
                  onClick={() => {
                    this.setState(state => ({
                      items: state.items.filter(
                        item => item.id !== id
                      ),
                    }));
                  }}
                >
                  &times;
                </Button>
                {text}
              </p>
            </CSSTransition>
          ))}
        </TransitionGroup>
        <Button
          type="button"
          onClick={() => {
            const text = prompt('Enter some text');
            if (text) {
              this.setState(state => ({
                items: [
                  ...state.items,
                  { id: 1123, text },
                ],
              }));
            }
          }}
        >
          Add Item
        </Button>
      </p>
    );
  }
}

登錄后復制

css

.fade-enter {
    opacity: 0.01;
  }
  .fade-enter-active {
    opacity: 1;
    transition: opacity 500ms ease-in;
  }
  .fade-exit {
    opacity: 1;
  }
  .fade-exit-active {
    opacity: 0.01;
    transition: opacity 500ms ease-in;
  }

登錄后復制

效果是增加和刪除列表項中的一個,產生漸入漸失的效果!說白了也就是多個Transition 或者CSSTransition組合的效果。
但是也提供一些參數

1、component  default 'p' 也就是TransitionGroup渲染出來的標簽為p,也可以就行更改,例如component="span" 渲染出來的就是span標簽了
2、children 相當于你給的組件,可以是字符串或者自定義組件等。
3、appear  寫在TransitionGroup里面相當于開啟或者禁止里面的Transition || CSSTransition 方便寫的作用

登錄后復制

三個組件大概的特性就是這些。剩下的全靠自己去開發了!后續會錄入一些小的例子來講解,敬請期待。。。。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

原生JS基于window.scrollTo()封裝垂直滾動動畫工具函數

Jquery添加loading過渡遮罩

以上就是react 官網動畫庫(react-transition-group)的新寫法的詳細內容,更多請關注風君子博客其它相關文章!

總結

以上是生活随笔為你收集整理的react 官网动画库(react-transition-group)的新写法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。