使用react-router實(shí)現(xiàn)單頁面應(yīng)用時(shí)設(shè)置頁面間過渡的兩種方式

1. 官方方法(推薦)

https://github.com/reactjs/react-router/tree/master/examples/animations

//--js
import React from 'react';
import ReactCSSTransitionGroup from 'react-addons-css-transition-group';

class App extends React.Component {
  render() {
    return (
      <div className="app">
        <ReactCSSTransitionGroup
          component="div"
          className="transition-wrapper"
          transitionName="example"
          transitionEnterTimeout={500}
          transitionLeaveTimeout={500}>
          //注意這一部分很關(guān)鍵,不能直接使用{this.props.children}
          {React.cloneElement(this.props.children, {
            key: this.props.location.pathname
          })}
        </ReactCSSTransitionGroup>
      </div>
    );
  }
}

module.exports = App;

//--css
.example-enter {
  opacity: 0.01;
  transition: opacity .5s ease-in;
}

.example-enter.example-enter-active {
  opacity: 1;
}

.example-leave {
  opacity: 1;
  transition: opacity .5s ease-in;
}

.example-leave.example-leave-active {
  opacity: 0;
}

.transition-wrapper {
  height: 100%;
}

2. react-router-transition

https://github.com/maisano/react-router-transition

1. 安裝

npm install --save react-router-transition

2. 使用

//--js
import React from 'react';
import RouteTransition from 'react-router-transition';

class App extends React.Component {
  render() {
    return (
      <div className="app">
        <RouteTransition
          pathname={this.props.location.pathname}
          atEnter={{ opacity: 0 }}
          atLeave={{ opacity: 0 }}
          atActive={{ opacity: 1 }}
          className="transition-wrapper">
          {this.props.children}
        </RouteTransition>
      </div>
    );
  }
}

module.exports = App;

//--css
html,
body,
#root,
.app,
.transition-wrapper,
.transition-wrapper>div {
  height: 100%;
}

//--生成的html結(jié)構(gòu)
<div class='transition-wrapper'>
  <div style='opacity: 1'>
    <div class='app'>
      ...
    </div>
  </div>
</div>

3. 模塊打包問題

目前npm上的react-router-transition模塊有問題,package.json配置的入口文件為lib/react-router-transition.js,該文件為webpack編譯打包后的文件,不能再次打包,所以實(shí)際使用時(shí)需要導(dǎo)入src/RouteTransition.js文件,結(jié)合webpack.config.js配置如下:

var node_modules_dir = path.join(__dirname, 'node_modules');

resolve: {
  extensions: ['', '.js', 'jsx'],
  alias: {
    'react-router-transition': path.resolve(node_modules_dir,'react-router-transition/src/RouteTransition.jsx')
  }
}

參考

Animated transitions
maisano/react-router-transition
misterfresh/react-easy-transition
reactjs/react-router
react + react-router transition
What is the correct way to animate/transition between routes in react router

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容