css – 没有React-Router的页面转换

前端之家收集整理的这篇文章主要介绍了css – 没有React-Router的页面转换前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这应该是如此简单,但我已经打破了这几天.我正在尝试动画我的页面过渡.问题是文件SUCK.我一遍又一遍地跟着他们,尝试了各种方式,但无法让它发挥作用.

我想要做的是向右或向左优雅地滑动我的页面,并淡化正在其后面优雅地卸载的页面.简单吧?我没有在我的网页上使用React Router.

我为此尝试了各种解决方案,但问题似乎在于卸载.更换页面后,现有页面可以在转换之前卸载.我正在使用react-transition-group发布我的尝试,尽管在这一点上,我会接受任何其他有效的解决方案.我不确定react-transition-group是否在实际上得到积极维护,因为还有很多其他帖子可以帮助我做出0回复.

所以在我的app容器上我想放这样的东西:

  1. <App>
  2. <PageSlider>
  3. <Page key={uniqueId} /> <==this will be "swapped" through (Redux) props
  4. </PageSlider>

因此,根据我的阅读,我必须使用TransitionGroup容器作为我的PageSlider,以便它可以管理我的页面的进入和退出.所以这里是:

  1. class PageSlider extends Component {
  2. constructor(props) {
  3. super(props);
  4. }
  5.  
  6. render() {
  7. return (
  8. <TransitionGroup
  9. component="div"
  10. id="page-slider"
  11. childFactory={child => React.cloneElement(child,{classNames: `page-${this.props.fromDir}`,timeout: 500}
  12. )}
  13. >
  14. {this.props.children}
  15. </TransitionGroup>
  16.  
  17. );
  18. }
  19. }

我还读过我需要做一个“童工厂”来启用现有的东西.我无法在文档中找到这样的例子.由于页面将来自不同的方向,我将向我传递我想要滑动页面的方向,这将告诉页面它获得了什么类.

现在,至于页面本身,我已经将它包装在CSSTransition中.关于这一切如何传承的文档中没有很好的例子,所以我真的很困惑这里做什么:

  1. class Page extends Component {
  2. constructor(props) {
  3. super(props);
  4. }
  5.  
  6. render() {
  7. return (
  8. <CSSTransition> <==????????
  9. {this.props.children} Do props get passed down?
  10. </CSSTransition> Which ones?
  11. ); Does "in" get taken care of?
  12. }
  13. }

只是为了完成样式将在CSS中应用如下:

  1. .page {
  2. display: flex;
  3. flex-direction: column;
  4. height: 100%;
  5. position: absolute;
  6. top: 0;
  7. bottom: 0;
  8. -webkit-transition: all 500ms ease-in-out;
  9. transition: all 500ms ;
  10. }
  11.  
  12. //go from this
  13. .page-right-enter {
  14. -webkit-transform: translate3d(100%,0);
  15. transform: translate3d(100%,0);
  16. }
  17.  
  18. //to this
  19. .page-right-enter-active {
  20. -webkit-transform: translate3d(0,0);
  21. transform: translate3d(0,0);
  22. }
  23.  
  24. //exiting go from this
  25. .page-right-exit {
  26. opacity: 1;
  27. }
  28. //to this
  29. .page-right-exit-active {
  30. opacity: 0;
  31. }

所有这些组件都将通过Redux连接,以便他们知道何时触发了新页面以及调用了哪个方向.

有人PLEEEEASE可以帮助我吗?我真的花了几天时间在那里尝试了每个图书馆.我并没有结合反应过渡组!任何在卸载时工作的库我都会尝试.为什么这不容易?

解决方法

好.好吧,我为WAAAAY挣扎太久了.我终于抛弃了react-transition-group,并且转向纯CSS.这是我的解决方案.

PageSlider.js

  1. import React,{ Component } from 'react';
  2. import PropTypes from 'prop-types';
  3.  
  4. require('./transitions.scss');
  5.  
  6. const BlankPage = (props) => <div className="placeholder"></div>;
  7.  
  8. class PageSlider extends Component {
  9. constructor(props) {
  10. super(props);
  11. this.state = {
  12. nextRoute: props.page,pages: {
  13. A: {key: 'A',component: BlankPage,className: 'placeholder'},B: {key: 'B',},currentPage: 'A'
  14. };
  15. }
  16.  
  17. componentDidMount() {
  18. //start initial animation of incoming
  19. let B = {key: 'b',component: this.state.nextRoute,className: 'slideFromRight'}; //new one
  20. let A = Object.assign({},this.state.pages.A,{className: 'slideOutLeft'}); //exiting
  21. this.setState({pages: {A: A,B: B},currentPage: 'B'});
  22. }
  23.  
  24. componentWillReceiveProps(nextProps) {
  25. if (nextProps.page != this.state.nextRoute) {
  26. this.transition(nextProps.page,nextProps.fromDir);
  27. }
  28. }
  29.  
  30. transition = (Page,fromDir) => {
  31. if (this.state.nextRoute != Page) {
  32. let leavingClass,enteringClass;
  33. let pages = Object.assign({},this.state.pages);
  34. const current = this.state.currentPage;
  35. const next = (current == 'A' ? 'B' : 'A');
  36. if (fromDir == "right") {
  37. enteringClass = 'slideFromRight';
  38. leavingClass = 'slideOutLeft';
  39. } else {
  40. enteringClass = 'slideFromLeft';
  41. leavingClass = 'slideOutRight';
  42. }
  43. pages[next] = {key: 'unique',component: Page,className: enteringClass};
  44. pages[current].className = leavingClass;
  45. this.setState({pages: pages,nextRoute: Page,currentPage: next});
  46. }
  47. }
  48.  
  49.  
  50. render() {
  51. return (
  52. <div id="container" style={{
  53. position: 'relative',minHeight: '100vh',overflow: 'hidden'
  54. }}>
  55. {React.createElement('div',{key: 'A',className: this.state.pages.A.className},<this.state.pages.A.component />)}
  56. {React.createElement('div',{key: 'B',className: this.state.pages.B.className},<this.state.pages.B.component />)}
  57. </div>
  58. );
  59. }
  60.  
  61. }
  62.  
  63.  
  64. PageSlider.propTypes = {
  65. page: PropTypes.func.isrequired,fromDir: PropTypes.string.isrequired
  66. };
  67.  
  68. export default PageSlider;

transition.scss

  1. .placeholder {
  2. position: absolute;
  3. left: 0;
  4. width: 100vw;
  5. height: 100vh;
  6. background: transparent;
  7. -webkit-animation: slideoutleft 0.5s forwards;
  8. -webkit-animation-delay: 10;
  9. animation: slideoutleft 0.5s forwards;
  10. animation-delay: 10;
  11. }
  12.  
  13.  
  14.  
  15. .slideFromLeft {
  16. position: absolute;
  17. left: -100vw;
  18. width: 100vw;
  19. height: 100vh;
  20. -webkit-animation: slidein 0.5s forwards;
  21. -webkit-animation-delay: 10;
  22. animation: slidein 0.5s forwards;
  23. animation-delay: 10;
  24. }
  25.  
  26.  
  27. .slideFromRight {
  28. position: absolute;
  29. left: 100vw;
  30. width: 100vw;
  31. height: 100vh;
  32. -webkit-animation: slidein 0.5s forwards;
  33. -webkit-animation-delay: 10;
  34. animation: slidein 0.5s forwards;
  35. animation-delay: 10;;
  36. }
  37.  
  38. .slideOutLeft {
  39. position: absolute;
  40. left: 0;
  41. width: 100vw;
  42. height: 100vh;
  43. -webkit-animation: slideoutleft 0.5s forwards;
  44. -webkit-animation-delay: 10;
  45. animation: slideoutleft 0.5s forwards;
  46. animation-delay: 10;
  47. }
  48.  
  49. .slideOutRight {
  50. position: absolute;
  51. left: 0;
  52. width: 100vw;
  53. height: 100vh;
  54. -webkit-animation: slideoutright 0.5s forwards;
  55. -webkit-animation-delay: 10;
  56. animation: slideoutright 0.5s forwards;
  57. animation-delay: 10;
  58. }
  59.  
  60. @-webkit-keyframes slidein {
  61. 100% { left: 0; }
  62. }
  63.  
  64. @keyframes slidein {
  65. 100% { left: 0; }
  66. }
  67.  
  68. @-webkit-keyframes slideoutleft {
  69. 100% { left: -100vw; opacity: 0 }
  70. }
  71.  
  72. @keyframes slideoutleft {
  73. 100% { left: -100vw; opacity: 0}
  74. }
  75. @-webkit-keyframes slideoutright {
  76. 100% { left: 100vw; opacity: 0}
  77. }
  78.  
  79. @keyframes slideoutright {
  80. 100% { left: 100vw; opacity: 0}
  81. }

传入下一个组件,这是我的反应页面组件,调用如下:

app.js

  1. <div id="app">
  2. <PageSlider page={this.state.nextRoute} fromDir={this.state.fromDir}/>
  3. </div>

猜你在找的CSS相关文章