reactjs - TypeError : Cannot add property __gsap, 对象不可扩展(Gatsby + GSAP)

标签 reactjs gatsby gsap

我在搬进 Gatsby 时遇到了一些麻烦(我还在学习中)。我有一个菜单动画,除了一部分之外,运行良好。我正在为打开和关闭菜单设置动画。我已将动画移至专用功能中,因此对我来说更清晰(且可重用)。

我现在有 3 个函数。前两个( staggerReveal()fadeInUp() )效果很好。但是第三个(staggerText)使其崩溃并抛出以下错误:“TypeError:无法添加属性 __gsap,对象不可扩展”。

我已经构建了这个 staggerText()其功能与我对其他两个功能的操作方式相同,并且它们工作正常。我在这里找不到这个函数做错了什么。我假设错误不是来自 gsap 而是来自 <Link> ?当你想在 React/Gatsby 中制作动画时,也许它不能像这样工作?

这是我的组件代码:

import React, { useEffect, useRef } from 'react';
import { Link } from 'gatsby';

import gsap from 'gsap';

const MainMenu = ({ state }) => {
  let menu = useRef(null);
  let revealMenuBackground = useRef(null);
  let revealMenu = useRef(null);
  let line1 = useRef(null);
  let line2 = useRef(null);
  let line3 = useRef(null);
  let info = useRef(null);

  useEffect(() => {
    if (state.clicked === false) {
      // close menu
      gsap.to([revealMenu, revealMenuBackground], {
        duration: 0.8,
        height: 0,
        ease: 'power3.inOut',
        stagger: 0.07,
      });
      gsap.to(menu, {
        duration: 1,
        css: { display: 'none' },
      });
    } else if (state.clicked === true || (state.clicked === true && state.initial === null)) {
      // open menu
      gsap.to(menu, {
        duration: 0,
        css: { display: 'block' },
      });
      gsap.to([revealMenuBackground, revealMenu], {
        duration: 0,
        opacity: 1,
        height: '100vh',
      });
      staggerReveal(revealMenuBackground, revealMenu);
      fadeInUp(info);
      staggerText(line1, line2, line3);
    }
  }, [state]);

  const staggerReveal = (node1, node2) => {
    gsap.from([node1, node2], {
      duration: 0.8,
      height: 0,
      ease: 'power3.inOut',
      stagger: 0.1,
    });
  };

  const fadeInUp = (node1) => {
    gsap.from(node1, {
      y: 60,
      duration: 1,
      delay: 0.2,
      opacity: 0,
      ease: 'power3.inOut',
    });
  };

  const staggerText = (node1, node2, node3) => {
    gsap.from([node1, node2, node3], {
      duration: 0.8,
      y: 100,
      delay: 0.1,
      ease: 'power3.inOut',
      stagger: 0.1,
    });
  };

  return (
    <div ref={(el) => (menu = el)} id="main-menu">
      <div
        ref={(el) => (revealMenuBackground = el)}
        className="menu-secondary-background-color"
      ></div>
      <div ref={(el) => (revealMenu = el)} className="menu-layer">
        <div className="menu-projects-background"></div>
        <div className="container">
          <div className="menu-links d-flex jc-space-between ai-start">
            <nav>
              <ul>
                <li>
                  <Link ref={(el) => (line1 = el)} to="/">
                    Homepage
                  </Link>
                </li>
                <li>
                  <Link ref={(el) => (line2 = el)} to="/about">
                    About
                  </Link>
                </li>
                <li>
                  <Link ref={(el) => (line3 = el)} to="/contact">
                    Contact
                  </Link>
                </li>
              </ul>
            </nav>
            <div ref={(el) => (info = el)} className="info">
              <h3>Infos Box</h3>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
};

export default MainMenu;

最佳答案

所以我在 stackoverflow 上找到了这个线程:Correct way to pass useRef hook to ref property

这个答案对我有用。我像这样重构了我的链接

<Link ref={line1} to="/"

然后,当我在 staggerText 函数中调用变量时,我在变量上使用了 .current ,如下所示:

staggerText(line1.current, line2.current, line3.current);

我不确定它是如何工作的,但它修复了我的错误!

关于reactjs - TypeError : Cannot add property __gsap, 对象不可扩展(Gatsby + GSAP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61856839/

相关文章:

javascript - 在上一个补间完成后启动补间。 - Greensock/ScrollMagic

javascript - 我应该如何处理 React 的 componentWillUnmount 中的离开动画?

javascript - 如何让 GSAP 时间线识别在其中创建的元素?

reactjs - 直接在 "this"上声明

javascript - 超出最大更新深度。当组件重复调用 setState 时可能会发生这种情况

javascript - react 表与从/到映射

gatsby-starter-blog 的站点地图

reactjs - 修复 Material-ui 中的选项卡栏

类型为 "image"的 GraphQL 错误字段 "File"必须选择子字段。你的意思是 "image { ... }"吗?

graphql - 在页面末尾使用命名导出时,Gatsby 页面查询无法工作。为什么?