我正在使用 Ionic 框架来构建一个反应应用程序。在我的组件树的最顶端是一个 IonReactRouter。
现在我需要在路由之间传递数据,并且必须仔细设计应该渲染哪个组件。所以我添加了日志代码,惊讶地看到许多意想不到的渲染。似乎 Ionic 路由器从不卸载 Route 并且在屏幕外的组件上浪费渲染。
要重现该行为,请使用以下代码创建一个示例 Ionic 应用程序(这是 sidemenu 模板):
ionic start --start-id SpOfzzZnR
并向页面渲染添加一些日志记录:
console.log('rendered '+name +" at " +new Date().getUTCSeconds());
这个例子的关键部分是一个带有菜单和路由器的应用程序:
<IonApp>
<IonReactRouter>
<IonSplitPane contentId="main">
<Menu />
<IonRouterOutlet id="main">
<Route path="/page/:name" component={Page} exact />
<Redirect from="/" to="/page/Inbox" exact />
</IonRouterOutlet>
</IonSplitPane>
</IonReactRouter>
</IonApp>
以及从路由参数读取其名称的页面:
const Page: React.FC = () => {
const { name } = useParams<{ name: string; }>();
console.log('rendered '+name +" at " +new Date().getUTCSeconds());
return (
<IonPage>
<IonHeader>
<IonToolbar>
<IonButtons slot="start">
<IonMenuButton />
</IonButtons>
<IonTitle>{name}</IonTitle>
</IonToolbar>
</IonHeader>
</IonPage>
);
在路由之间切换时,它总是同时渲染旧路由和新路由:
rendered Trash at 46 Page.tsx:10 # currently viewing Trash, clicked on Spam
rendered Spam at 46 Page.tsx:10
rendered Spam at 48 Page.tsx:10 # currently viewing Spam, clicked on Trash
rendered Trash at 48 Page.tsx:10
为什么这样做?