切换菜单页面刷新间歇性显示异常,寻求状态持久化方案
菜单刷新时间歇性显示/消失的修复方案
问题概述
页面刷新时,侧边菜单会间歇性自动显示或消失,预期行为是仅在点击切换图标时才打开菜单,刷新页面时菜单应保持关闭状态。
问题根源
- 未显式指定Framer Motion组件的初始状态,导致组件挂载时默认从原始样式过渡到
closed状态,引发视觉闪烁 closed状态的动画设置了0.5秒延迟,初始渲染时菜单会先短暂显示再关闭,造成“间歇性出现”的错觉- Links组件中存在拼写错误:
staggereDirection应为staggerDirection,可能导致关闭动画异常
修复方案
方案1:强制初始状态为关闭并移除初始延迟
修改Sidebar组件,添加initial="closed"确保挂载时直接应用关闭状态,同时移除closed状态的初始延迟:
const variants = { open: { clipPath: "circle(1200px at 50px 50px)", transition: { type: "spring", stiffness: 20, }, }, closed: { clipPath: "circle(30px at 50px 50px)", transition: { delay: 0, // 移除初始渲染的延迟,仅手动关闭时可按需添加 type: "spring", stiffness: 400, damping: 40, }, }, }; const Sidebar = () => { const [open, setOpen] = useState(false); return ( <motion.div className="sidebar" initial="closed" // 强制初始状态为关闭 animate={open ? "open" : "closed"} > <motion.div className="bg" variants={variants}> <Links /> </motion.div> <ToggleButton setOpen={setOpen} /> </motion.div> ); }; export default Sidebar;
方案2:保留手动关闭延迟,区分初始渲染
如果需要保留手动关闭菜单时的0.5秒延迟,可通过custom属性传递初始渲染状态,仅在手动关闭时启用延迟:
const variants = { open: { clipPath: "circle(1200px at 50px 50px)", transition: { type: "spring", stiffness: 20, }, }, closed: (isInitial) => ({ clipPath: "circle(30px at 50px 50px)", transition: { delay: isInitial ? 0 : 0.5, // 初始渲染无延迟,手动关闭时加延迟 type: "spring", stiffness: 400, damping: 40, }, }), }; const Sidebar = () => { const [open, setOpen] = useState(false); const [isInitialRender, setIsInitialRender] = useState(true); useEffect(() => { setIsInitialRender(false); }, []); return ( <motion.div className="sidebar" initial="closed" animate={open ? "open" : "closed"} > <motion.div className="bg" variants={variants} custom={isInitialRender} > <Links /> </motion.div> <ToggleButton setOpen={setOpen} /> </motion.div> ); };
额外修复:Links组件拼写错误
修正staggereDirection为正确的staggerDirection:
const variants = { open: { transition: { staggerChildren: 0.1, }, }, closed: { transition: { staggerChildren: 0.05, staggerDirection: -1, // 修正拼写错误 }, }, };
内容的提问来源于stack exchange,提问作者Jorge Leonardo
相关产品推荐
相关产品推荐

