React Router v4 使用 React Motion 匹配过渡

React Router v4 Match transitions using React Motion

我喜欢 RR4 和 RM,React Router V4 已经有很好的示例 (https://github.com/ReactTraining/react-router/tree/v4/website/examples),但我正在努力理解如何使用新的 V4 API 在两者之间进行转换在我的路由器中使用 React Motion 进行不同的匹配,在我的 'pages'.

之间淡入淡出

我试图了解 Transition 示例如何与 MatchWithFade 配合使用,但我不知道如何使用它并将其应用于代表我的页面结构的多个匹配项。

举个例子:在我的路由器中设置了两条路由,我怎样才能通过带有 TransitionMotion 的 react-motion 来处理挂载和卸载?

<Router>
  <div>
    <Match pattern="/products" component={Products} />
    <Match pattern="/accessories" component={Accessories} />
  </div>
</Router>

如有任何帮助,我们将不胜感激。

从链接的例子我们可以简化。首先我们创建一个包装器组件,它将替换 <Match/> 标签并包装它的组件:

import React from 'react'
import { Match } from 'react-router'
import { TransitionMotion, spring } from 'react-motion'

const styles = {}

styles.fill = {
  position: 'absolute',
  left: 0,
  right: 0,
  top: 0,
  bottom: 0
}

const MatchTransition = ({ component: Component, ...rest }) => {
  const willLeave = () => ({ zIndex: 1, opacity: spring(0) })

  return (
    <Match {...rest} children={({ matched, ...props }) => (
      <TransitionMotion
        willLeave={willLeave}
        styles={matched ? [ {
          key: props.location.pathname,
          style: { opacity: 1 },
          data: props
        } ] : []}
      >
        {interpolatedStyles => (
          <div>
            {interpolatedStyles.map(config => (
              <div
                key={config.key}
                style={{ ...styles.fill, ...config.style }}
              >
                <Component {...config.data} />
              </div>
            ))}
          </div>
        )}
      </TransitionMotion>
    )} />
  )
}

export default MatchTransition

然后我们这样使用:

<MatchTransition pattern='/here' component={About} />
<MatchTransition pattern='/there' component={Home} />