You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换菜单页面刷新间歇性显示异常,寻求状态持久化方案

菜单刷新时间歇性显示/消失的修复方案

问题概述

页面刷新时,侧边菜单会间歇性自动显示或消失,预期行为是仅在点击切换图标时才打开菜单,刷新页面时菜单应保持关闭状态。

问题根源

  1. 未显式指定Framer Motion组件的初始状态,导致组件挂载时默认从原始样式过渡到closed状态,引发视觉闪烁
  2. closed状态的动画设置了0.5秒延迟,初始渲染时菜单会先短暂显示再关闭,造成“间歇性出现”的错觉
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:57:38