React Router v4使用React Motion匹配过渡

时间:2016-11-07 11:39:42

标签: reactjs react-router react-motion

我很喜欢RR4和RM,已经有很好的React Router V4示例(https://github.com/ReactTraining/react-router/tree/v4/website/examples),但我很难理解如何使用新的V4 API在我的路由器中的不同匹配之间进行转换反应动作,在我的'页面'之间淡入淡出。

我试图理解Transition示例如何与MatchWithFade一起工作,但我错过了如何将其应用于表示我的页面结构的多个匹配项。

举个例子:在我的路由器中设置了两个路由,如何通过reactMotion的react-motion处理挂载和卸载?

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

从链接的例子我们可以简化。首先,我们创建一个包装器组件,它将替换<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} />