带有 ReactCSSTransitionGroup 的 React 路由器 4 beta 2
React router 4 beta 2 with ReactCSSTransitionGroup
我更喜欢 ReactCSSTransitionGroup
而不是 react-motion
。下面的代码导致组件在路由更改时淡入(出现),但问题是 - 离开的组件不会淡出,它会立即离开。
<Switch>
<FadeRoute exact path="/" component={PageLanding}/>
<FadeRoute path="/login" component={PageLogin}/>
<FadeRoute path="/signup" component={PageSignup}/>
<FadeRoute component={Page404}/>
</Switch>
function FadeRoute({component:Component, ...rest}) {
return (
<Route {...rest} children={({location,match}) => (
<ReactCSSTransitionGroup {...{key:Date.now(), transitionName:'fade', transitionAppear:true, transitionEnter:true, transitionLeave:true, transitionAppearTimeout:300, transitionEnterTimeout:300, transitionLeaveTimeout:300})}>
<Component/>
</ReactCSSTransitionGroup>
)} />
);
}
<style>
.fade-enter, .fade-appear { opacity:0; }
.fade-enter.fade-enter-active,
.fade-appear.fade-appear-active { opacity:1; transition: opacity 300ms; }
.fade-leave { opacity:1; }
.fade-leave.fade-leave-active { opacity:0; transition: opacity 300ms; }
</style>
<Switch>
的工作方式是它只呈现路径与当前位置匹配的第一个 <Route>
。这意味着当您导航时,现有的 <FadeRoute>
会在您导航时立即卸载。它的 child <CSSTransitionGroup>
也被卸载,所以它没有机会 运行 离开它的 children 的过渡。
您要做的是将 <Switch>
包裹在 <CSSTransitionGroup>
中。 <Switch>
是将要转换的组件,因此它应该有一个 key
。您还应该将 location
object 传递给它,这样当 <Switch>
离开时,它会使用旧的 location
而不是当前的
进行动画处理。
<CSSTransitionGroup
transitionName='fade'
transitionEnterTimeout={500}
transitionLeaveTimeout={500}
>
<Switch key={location.pathname} location={location}>
<Route path="/red" render={Red} />
<Route path="/green" render={Green} />
<Route path="/blue" render={Blue} />
</Switch>
</CSSTransitionGroup>
我更喜欢 ReactCSSTransitionGroup
而不是 react-motion
。下面的代码导致组件在路由更改时淡入(出现),但问题是 - 离开的组件不会淡出,它会立即离开。
<Switch>
<FadeRoute exact path="/" component={PageLanding}/>
<FadeRoute path="/login" component={PageLogin}/>
<FadeRoute path="/signup" component={PageSignup}/>
<FadeRoute component={Page404}/>
</Switch>
function FadeRoute({component:Component, ...rest}) {
return (
<Route {...rest} children={({location,match}) => (
<ReactCSSTransitionGroup {...{key:Date.now(), transitionName:'fade', transitionAppear:true, transitionEnter:true, transitionLeave:true, transitionAppearTimeout:300, transitionEnterTimeout:300, transitionLeaveTimeout:300})}>
<Component/>
</ReactCSSTransitionGroup>
)} />
);
}
<style>
.fade-enter, .fade-appear { opacity:0; }
.fade-enter.fade-enter-active,
.fade-appear.fade-appear-active { opacity:1; transition: opacity 300ms; }
.fade-leave { opacity:1; }
.fade-leave.fade-leave-active { opacity:0; transition: opacity 300ms; }
</style>
<Switch>
的工作方式是它只呈现路径与当前位置匹配的第一个 <Route>
。这意味着当您导航时,现有的 <FadeRoute>
会在您导航时立即卸载。它的 child <CSSTransitionGroup>
也被卸载,所以它没有机会 运行 离开它的 children 的过渡。
您要做的是将 <Switch>
包裹在 <CSSTransitionGroup>
中。 <Switch>
是将要转换的组件,因此它应该有一个 key
。您还应该将 location
object 传递给它,这样当 <Switch>
离开时,它会使用旧的 location
而不是当前的
<CSSTransitionGroup
transitionName='fade'
transitionEnterTimeout={500}
transitionLeaveTimeout={500}
>
<Switch key={location.pathname} location={location}>
<Route path="/red" render={Red} />
<Route path="/green" render={Green} />
<Route path="/blue" render={Blue} />
</Switch>
</CSSTransitionGroup>