【发布时间】:2018-04-13 00:08:23
【问题描述】:
我们正在升级我们的 React 应用程序,经过数小时的痛苦之后,我们意识到将包装好的组件传递到 React Router(V4 和可能其他)会导致组件在每次新道具时“重新安装”进来了。
这是包装好的组件...
export default function preload(WrappedComponent, props) {
class Preload extends React.Component {
componentWillMount() {
getDataForComponent(props);
}
render() {
return <WrappedComponent {...props} />;
}
}
return Preload;
}
这就是我们如何使用它...
const FlagsApp = (props) => {
return (
<Route path="/report/:reportId/flag/:id/edit" component{preload(FlagForm, props)} />
);
};
每当我们发送一个动作然后接收更新时,组件就会重新挂载,从而导致很多问题。根据 github 上的this thread,如果出现以下情况,组件将重新挂载:
- 在渲染过程中调用 withRouter(..) 每次都会创建一个新的组件类
- 每次渲染都向 Route.component 传递一个新函数,例如使用匿名函数 {...}} />,这也会创建一个新组件
如果我直接传入FlagForm 组件,问题就解决了,但是我无法利用preload 功能。
那么,如何在不重新安装组件的情况下获得相同的结果?
提前感谢您的帮助!
【问题讨论】:
-
您能解释一下预加载应该如何工作吗?它是否应该在收到的第一个 props 中只调用一次数据?或者它也应该对道具变化做出反应?预加载所需的道具从何而来?
标签: javascript reactjs redux react-router react-router-v4