javascript - 使用 framer-motion 在 Route Transitions 中未触发的退出动画
问题描述
我一直在尝试使用 framer-motion 为路线过渡设置动画,但退出动画并未按预期触发。入口动画可以正常工作。
我想:
当跳转到/从“配置文件”时,应该触发标题和组件转换。下面的代码做到了。
在两个管理路由(例如“Security”和“Config”)之间跳转时,不应触发标头转换,仅应触发组件转换,这似乎标头没有移动。问题来了,header 的行为符合预期,但是跳转时不会触发组件的退出动画。
CodeSandBox:这里
代码在这里:
管理员.js
import React from "react";
import { Switch, Route } from "react-router-dom";
import { Container } from "reactstrap";
import { AnimatePresence, motion } from "framer-motion";
import Sidebar from "components/Sidebar/Sidebar";
import AdminNavbar from "components/Navbars/AdminNavbar";
import AdminFooter from "components/Footers/AdminFooter";
import ProfileHeader from "components/Headers/ProfileHeader";
import StatisticsHeader from "components/Headers/StatisticsHeader";
import Profile from "views/Profile";
import Dashboard from "views/Dashboard";
import Security from "views/Security";
import Log from "views/Log";
import Config from "views/Config";
class Admin extends React.Component {
constructor(props) {
super(props);
this.transition = {
type: "tween",
ease: "anticipate"
};
this.variants = {
header: {
profile: {
in: {
y: 0,
transition: {
duration: 1,
...this.transition
}
},
out: {
y: "-100%",
transition: {
duration: 0.8,
...this.transition
}
}
},
statistics: {
in: {
y: 0,
transition: {
duration: 0.5,
...this.transition
}
},
out: {
y: "-100%",
transition: {
duration: 0.3,
...this.transition
}
}
}
},
component: {
profile: {
in: {
opacity: 1,
transition: {
duration: 1,
...this.transition
}
},
out: {
opacity: 0,
transition: {
duration: 0.8,
...this.transition
}
}
},
admin: {
in: {
opacity: 1,
transition: {
duration: 0.5,
...this.transition
}
},
out: {
opacity: 0,
transition: {
duration: 0.3,
...this.transition
}
}
}
}
};
}
render() {
const key =
this.props.location.pathname === "/profile" ? "non-admin" : "admin";
return (
<>
<Sidebar />
<div className="main-content" ref="mainContent">
<AdminNavbar />
<AnimatePresence exitBeforeEnter initial={false}>
<Switch location={this.props.location} key={`switch-${key}`}>
<Route exact path="/profile">
<motion.div
initial="out"
animate="in"
exit="out"
variants={this.variants.header.profile}
>
<ProfileHeader />
</motion.div>
<motion.div
initial="out"
animate="in"
exit="out"
variants={this.variants.component.profile}
>
<Profile />
</motion.div>
</Route>
<Route>
<motion.div
initial="out"
animate="in"
exit="out"
variants={this.variants.header.statistics}
>
<StatisticsHeader />
</motion.div>
<motion.div
key={`component-${this.props.location.pathname}`}
initial="out"
animate="in"
exit="out"
variants={this.variants.component.admin}
>
<Route exact path="/dashboard">
<Dashboard />
</Route>
<Route exact path="/security">
<Security />
</Route>
<Route exact path="/log">
<Log />
</Route>
<Route exact path="/config">
<Config />
</Route>
</motion.div>
</Route>
</Switch>
</AnimatePresence>
<Container fluid>
<AdminFooter />
</Container>
</div>
</>
);
}
}
export default Admin;
我应该怎么办?
解决方案
推荐阅读
- node.js - 获取一个值的uid
- angular - Angular Routing - 嵌套路由器出口(一个主要 + 两个命名出口) - 导航到第三个路由器出口时出错
- html - 规模大纲和活动卡片上的过滤器
- python - TypeError: '_io.TextIOWrapper' 对象在读取 JSON 时不可下标
- sql - 如何在不计算第二个表中的双打的情况下建立连接?
- memory-management - 操作系统参与堆栈操作
- node.js - 多个谷歌云功能:如何管理内部库?
- javascript - 将画布导出为 SVG 文件
- kotlin - kotlinx de/serialization 密封类/枚举
- python - Scikit-Learn 的感知器训练准确率低于 100%,尽管数据是线性可分的