我认为处理这个问题的正常方法只是取消注册和重新注册你的听众,重置你的状态,等等componentWillReceiveProps
。围绕这种行为创建抽象是正常的:
componentWillMount: function() {
this.setupStuff(this.props);
}
componentWillUnmount: function() {
this.tearDownStuff();
}
componentWillReceiveProps: function(nextProps) {
this.tearDownStuff();
this.setupStuff(nextProps);
}
setupStuff: function(props) {
this.setState(this.getDataFromStore(props.store));
props.store.listen(this.handler); // or whatever
}
tearDownStuff: function(props) {
props.store.unlisten(this.handler); // or whatever
}
但是,如果您真的想重新安装组件,可以使用几个选项。
如果您不希望任何组件在路由更改时保持挂载,您可以利用路由器的createElement
选项为组件添加唯一键:
function createElement(Component, props) {
var key = ...; // some key that changes across route changes
return <Component key={key} {...props} />;
}
// ...
<Router createElement={createElement}>
...
但是,我不建议这样做。它不仅使您的应用程序变慢,因为每个路由组件每次都重新安装,而且它还完全禁用了相同路由处理程序具有不同道具的后续渲染之间的动画之类的东西。
如果您只想始终重新渲染某个路线,则可以通过以下方式在父级中为其提供一个键React.cloneElement
:
render: function() {
var key = ...; // some key that changes across route changes
return React.cloneElement(
React.Children.only(this.props.children),
{key: key}
);
}