单个子路径动画不正确
Single child route not animating properly
我正在为一个项目使用 React 路由器。我想为位于父路由内的单个路由设置动画(基本上,单个项目将在项目列表顶部显示为 "modal",因此父路由的内容需要在子路由可见。
路由现在工作正常,但在制作动画时遇到困难。我记得在某个时候看到一个例子,其中 sidenav 被动画化为一条路线,但我现在在任何地方都找不到它......
示例代码:https://codesandbox.io/s/1447zpvlzj
当前行为:
我正在关注 react router tutorial 上的示例
在示例中将密钥添加到 like 时,应用程序会在路由更改时中断。当钥匙被移除时,路线会改变,但不会发生转换(进入和退出 类 不会添加到路线中)。
我还尝试将路由包装在 div 而不是 Switch 中。这实际上给了我一个正确的进入过渡。但是,退出转换会中断,因为路由内容(包装器内的内容div)实际上会在退出转换超时完成之前消失
解决方案有点棘手
最后,我不得不创建一个新组件 (Drawer) 来处理动画。然后,将子路由添加到 <Switch>
并将其指向父组件,如下所示:
App.jsx
<Switch>
<Route exact path="/" component={Home} />
<Route path="/projects/:slug" component={Projects} />
<Route path="/projects" component={Projects} />
<Route component={NotFound} />
</Switch>
这意味着无论我点击 /projects
还是 /projects/foo
,都会加载相同的项目组件。
然后,在我的 Projects 组件中,我根据 slug 的存在有条件地渲染单个 Project 组件。我在我创建的处理动画的抽屉组件中执行此操作(使用这种方法,不再需要 react-transition-group
,我根据抽屉打开与否通过 CSS 设置动画)
Projects.jsx
render() {
const renderProject = !!this.props.match.slug;
return (
<div className="projects">
[projects content here]
<Drawer isOpen={renderProject}>
<Project />
</Drawer>
<div>
)
};
这允许 slugg 路由存在于父路由中,同时当 slug 出现时仍由 Drawer 组件动画。
最后,我使用 react-router-dom
提供的 withRouter
HOC 来包装导出的 <Project>
组件,以便它可以完全利用 Router。
Project.jsx
export default withRouter(Project);
我正在为一个项目使用 React 路由器。我想为位于父路由内的单个路由设置动画(基本上,单个项目将在项目列表顶部显示为 "modal",因此父路由的内容需要在子路由可见。
路由现在工作正常,但在制作动画时遇到困难。我记得在某个时候看到一个例子,其中 sidenav 被动画化为一条路线,但我现在在任何地方都找不到它......
示例代码:https://codesandbox.io/s/1447zpvlzj
当前行为: 我正在关注 react router tutorial 上的示例 在示例中将密钥添加到 like 时,应用程序会在路由更改时中断。当钥匙被移除时,路线会改变,但不会发生转换(进入和退出 类 不会添加到路线中)。
我还尝试将路由包装在 div 而不是 Switch 中。这实际上给了我一个正确的进入过渡。但是,退出转换会中断,因为路由内容(包装器内的内容div)实际上会在退出转换超时完成之前消失
解决方案有点棘手
最后,我不得不创建一个新组件 (Drawer) 来处理动画。然后,将子路由添加到 <Switch>
并将其指向父组件,如下所示:
App.jsx
<Switch>
<Route exact path="/" component={Home} />
<Route path="/projects/:slug" component={Projects} />
<Route path="/projects" component={Projects} />
<Route component={NotFound} />
</Switch>
这意味着无论我点击 /projects
还是 /projects/foo
,都会加载相同的项目组件。
然后,在我的 Projects 组件中,我根据 slug 的存在有条件地渲染单个 Project 组件。我在我创建的处理动画的抽屉组件中执行此操作(使用这种方法,不再需要 react-transition-group
,我根据抽屉打开与否通过 CSS 设置动画)
Projects.jsx
render() {
const renderProject = !!this.props.match.slug;
return (
<div className="projects">
[projects content here]
<Drawer isOpen={renderProject}>
<Project />
</Drawer>
<div>
)
};
这允许 slugg 路由存在于父路由中,同时当 slug 出现时仍由 Drawer 组件动画。
最后,我使用 react-router-dom
提供的 withRouter
HOC 来包装导出的 <Project>
组件,以便它可以完全利用 Router。
Project.jsx
export default withRouter(Project);