面试题答案
一键面试整体架构设计思路
- 封装动画逻辑:将动画逻辑封装在一个独立的模块或组件中。这样可以确保代码的可复用性,当需要在不同地方使用相同动画时,直接调用该模块或组件即可。
- 处理页面过渡差异:通过配置文件或者传入不同的参数到动画组件,来处理不同页面过渡的差异。例如,不同页面可能有不同的动画时长、动画类型(淡入淡出、滑动等)。
- 与Next.js路由系统集成:利用Next.js的路由事件,比如
router.events
,在路由变化时触发动画。这样可以保证动画与页面导航紧密结合。
关键代码结构
- 动画组件封装
import React, { useEffect } from'react';
import { motion } from 'framer - motion';
const PageTransition = ({ children, transition }) => {
const defaultTransition = {
duration: 0.5,
ease: [0.6, 0.01, -0.05, 0.95]
};
const combinedTransition = {
...defaultTransition,
...transition
};
useEffect(() => {
// 这里可以添加动画开始前的一些逻辑,比如暂停其他动画等
return () => {
// 动画结束后清理逻辑,比如恢复其他动画状态
};
}, []);
return (
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={combinedTransition}
>
{children}
</motion.div>
);
};
export default PageTransition;
- 与Next.js路由集成
import { useRouter } from 'next/router';
import React, { useEffect } from'react';
import PageTransition from './PageTransition';
const App = ({ Component, pageProps }) => {
const router = useRouter();
const [isTransitioning, setIsTransitioning] = React.useState(false);
useEffect(() => {
const handleRouteChangeStart = () => {
setIsTransitioning(true);
};
const handleRouteChangeComplete = () => {
setIsTransitioning(false);
};
router.events.on('routeChangeStart', handleRouteChangeStart);
router.events.on('routeChangeComplete', handleRouteChangeComplete);
return () => {
router.events.off('routeChangeStart', handleRouteChangeStart);
router.events.off('routeChangeComplete', handleRouteChangeComplete);
};
}, [router]);
return (
<PageTransition transition={{ duration: isTransitioning? 0.5 : 0 }}>
<Component {...pageProps} />
</PageTransition>
);
};
export default App;
- Link组件结合动画
import Link from 'next/link';
import React from'react';
const CustomLink = ({ href, children }) => {
return (
<Link href={href}>
<a>{children}</a>
</Link>
);
};
export default CustomLink;
在页面中使用CustomLink
进行导航,App
组件会监听路由变化并触发PageTransition
组件的动画,从而实现平滑过渡。同时,PageTransition
组件通过配置transition
参数可以灵活处理不同页面过渡的差异,并且该组件本身具有高度可复用性,在不同页面引入即可使用相同的动画逻辑。