让 ReactTransitionGroup 和 Redux-Simple-Router 协同工作

Getting ReactTransitionGroup and Redux-Simple-Router to work together

我和我的同事正在尝试将 redux-simple-router 导航(我们已经工作了一段时间)包装在 ReactTransitionGroup 元素中,以便可以在路由更改时调用其生命周期方法.我们已经尝试了一大堆版本,但还没有找到让它工作的方法。

我们当前的迭代在 ReactTransitionGroup(它是 Provider 的子项)下创建了一个包装器,以便可以在路由状态和子项都可以访问的地方定义生命周期方法.这个包装器的 render 和 componentWillAppear 方法肯定会在初始应用程序加载时(在浏览器中)调用,但不会在应用程序的页面之间导航(使用 Redux Simple Router)时调用。该代码或多或少位于 this gist.

最值得注意的是,我们每次都使用重新生成的密钥(例如,通过 history.createKey())尝试使用 React 的 cloneElement 方法,但无法让生命周期方法在任何路由更改时触发.

redux-simple-router 将简单路由器组件包装在 ReactTransitionGroup 中的惯用方法是什么?

更新

我尝试了一个新版本,其中我用自己的 TransitionWrapper class 包装每个单独的路线,如 this second gist (inspired by ).

TransitionWrapper 扩展 React.Component 时(如示例中所示),将调用 render 方法,但不会调用其他方法。该网站运行良好(但我无法访问转换挂钩)。

当它扩展 ReactTransitionGroup 时,我在 ReactTransitionGroup 对象的 performAppear 方法的第 99 行遇到错误,下面是其中的一个片段:

performAppear: function (key) {
  this.currentlyTransitioningKeys[key] = true;

  var component = this.refs[key];

  if (component.componentWillAppear) { /* error here */
    component.componentWillAppear(this._handleDoneAppearing.bind(this, key));
  } else {
    this._handleDoneAppearing(key);
  }

Uncaught TypeError: Cannot read property 'componentWillAppear' of undefined

这会引发问题,因为 this.refs 是一个空对象。 (key 是正确的)。

值得注意的是,如果我关闭 Chrome 调试器以跳过错误,该站点仍然可以正常工作。

我们的解决方案是创建一个返回 另一个 函数的函数,该函数又返回包裹在 ReactTransitionGroup.

中的组件
var transitionWrap = (component, myKey) => {
  return () => {
    return ( 
      <ReactTransitionGroup>
        { React.createElement(component, { key: myKey } ) }
      </ReactTransitionGroup>
    )
  }
}

const routeConfig = [
  {
    path: "/",
    component: AppContainer,
    childRoutes: [
      { path: "/signed-out",
        component: LoggedOut,
        childRoutes: [
          { path: "/home", component: transitionWrap(Home, browserHistory.createKey())                            }
        ]
      }
    ]
  }
];

ReactDOM.render(
  <div>
    <Provider store={store}>
      <Router history={browserHistory} routes={routeConfig} />
    </Provider>
  </div>,
  document.getElementById('app')
);

工作完美(使组件能够访问 Transition Group 方法),但有一个例外 -- 子组件(即 Home不能 connected 到 Redux 全局状态。如果需要的话,该组件本质上可以只是一个包装器,它呈现 另一个 连接到 Redux 状态的组件,因此 Home (例如)真的就在那里处理动画,它的子组件负责所有与数据相关的事情。