让ReactTransitionGroup和Redux Simple Router协同工作
Getting ReactTransitionGroup and Redux-Simple-Router to work together
我和我的同事正试图将redux-simple-router
导航(我们已经工作了一段时间)封装在ReactTransitionGroup
元素中,以便在路线更改时调用其生命周期方法。我们已经尝试了一大堆版本,但还没有找到让它发挥作用的方法。
我们当前的迭代在ReactTransitionGroup
(它是Provider
的子级)下创建了一个包装器,这样就可以在路由状态和子级都可以访问的地方定义生命周期方法。这个包装器的render和componentWillAppear
方法肯定是在初始应用程序加载(在浏览器中)时调用的,但在应用程序中的页面之间导航(使用Redux Simple Router)时不会调用。这个代码或多或少就是基于这个要点。
最值得注意的是,我们尝试了React的cloneElement
方法,每次都使用重新生成的密钥(例如,通过history.createKey()
),但无法在任何路由更改时启动生命周期方法。
用redux-simple-router
包装ReactTransitionGroup
中的简单路由器组件的惯用方法是什么?
更新
我尝试了一个新版本,在这个版本中,我用自己的TransitionWrapper
类来包装每个单独的路由,就像第二个要点中一样(受这个答案的启发)。
当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);
}
未捕获的类型错误:无法读取未定义的属性"componentWillAppear"
这是因为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')
);
工作正常(允许组件访问过渡组方法),但有一个例外——子组件(即Home
)不能被connect
设置为Redux全局状态。如果需要的话,该组件本质上可以只是一个包装器,用于呈现另一个连接到Redux状态的组件,因此Home
(例如)实际上只是用来处理动画的,其子组件负责处理与数据相关的所有内容。
- AngularJS指令意外地协同工作
- 让两个 jquery 脚本像它们应该的那样协同工作
- 数据表 + 列搜索 + 整体搜索协同工作 + 服务器端处理
- Rcharts 和 D3 图不能协同工作
- 如何让、要求和原型协同工作以在 javascript 中制作对象
- react如何与修改html的javascript ui组件协同工作
- 使list.js和react.js协同工作
- 如何使jquery与ajax协同工作
- Backbone.js应用程序使用CommonJS结构与node.js和客户端协同工作
- 如何组合关键代码以在javascript中协同工作
- 让PHP、Form和Javascript协同工作
- JavaScriptjQueryappendTo和插件协同工作
- Asp.net Ajax事件句柄如何与DOM事件协同工作
- CryptoJS和Pycrypto协同工作
- 如何让两个JS/Jquery插件协同工作
- 如何使此应用程序与移动浏览器协同工作
- 让smoothState.js和Foundation6协同工作
- 让 jquery 和 css 过渡效果协同工作
- Ajax 构建关系按钮有效,用于显示引导模式的第二个按钮有效,但两者不能协同工作
- 让ReactTransitionGroup和Redux Simple Router协同工作