javascript - 反应路由器。为什么在更改路由时,组件渲染了 2 次,导致向服务器发出 2 次请求?
问题描述
我将ReactTransitionGroup与ReactRouter一起使用。
目标是从一个组件平滑地重新路由到另一个组件。问题是组件被渲染了两次。
我正在使用控制台进行检查。你可能会说这并不重要。但是,问题是由于这个问题,有 2 个请求到达服务器(一个额外的)。因此,我希望摆脱这个错误。
我需要弄清楚为什么副作用被调用了两次。如果没有足够的信息,然后写评论。我会尽量尽快回答。
这是文档中的一个示例。我已经实现了这个效果,但是问题已经描述过了。
UPD:我记得很清楚,它曾经像发条一样工作。但是,可能我自己没有注意到我改变了一些东西,这导致了这个问题。
UPD:如果您需要代码,请提供所需的元素:
const TabList = ({ tabs }) => {
return (
<nav className="p-my-company__tabs">
{tabs.map(({ to, label, id }) => (
<NavLink to={to} key={id}>
<div>{label}</div>
</NavLink>
))}
</nav>
);
};
const TabViews = ({ tabViews }) => {
const location = useLocation();
return (
<div className="p-my-company__views">
<TransitionGroup>
<SwitchTransition mode="out-in">
<CSSTransition
key={location.pathname}
classNames={{
enter: 'move-enter',
enterActive: 'move-enter-active',
exit: 'move-exit',
}}
timeout={100}>
<Switch>
{tabViews.map(({ path, Component, id }) => (
<Route path={path} render={() => <Component />} key={id} />
))}
</Switch>
</CSSTransition>
</SwitchTransition>
</TransitionGroup>
</div>
);
};
<div className="p-my-company__panel">
<TabList
tabs={[
{ to: ROUTES.COMMON_INFO, label: 'Общая информация', id: 1 },
{ to: ROUTES.SHOWCASE, label: 'Моя витрина', id: 2 },
]}
/>
<TabViews
tabViews={[
{ path: ROUTES.COMMON_INFO, Component: CommonView, id: 1 },
{ path: ROUTES.SHOWCASE, Component: ShowCaseView, id: 2 },
]}
/>
</div>
const ShowCase = () => {
useEffect(() => {
console.log(2);
}, []);
return <div>ShowCase</div>;
};
解决方案
看起来Switch
React Router 和 React Transition Group 的组件不能很好地协同工作。文档建议避免使用组件Switch
并将函数传递给Route
'children
道具。由于无论是否存在都会调用该函数match
,因此您可以有条件地渲染Component
是否存在。
<>
{tabViews.map(({ path, Component }) => (
<Route exact path={path} key={path}>
{({ match }) => (
<TransitionGroup>
<SwitchTransition mode="out-in">
<CSSTransition
in={match != null}
classNames={{
enter: 'move-enter',
enterActive: 'move-enter-active',
exit: 'move-exit',
}}
timeout={100}
unmountOnExit
key={location.pathname}
>
<div className="page">{match && <Component />}</div>
</CSSTransition>
</SwitchTransition>
</TransitionGroup>
)}
</Route>
))}
</>
推荐阅读
- node.js - Docker Postgres 服务不允许我连接到它
- javascript - 延迟加载下一页 fullpage.js 不起作用
- javascript - 关闭选项卡或从 codeigniter 中的任务管理器关闭浏览器时自动注销用户
- wildfly - Wildfly 13 - 在 ear 项目中使用 logback 正确设置项目
- java - 如何使用自己的跑步者在 gitlab 作业中将 Postgres 作为服务运行?
- python - python - 在 \ 的最新出现后删除所有字符
- python - 是否可以在 xaxis 顶部绘制 xticklabels?
- vulkan - 使用vulkan时记录命令的正确方法是什么?
- html - 在我的范围内扩展 Bootstrap Navigator 时遇到问题
- php - 私人频道上的 Laravel Echo + Pusher 订阅错误