首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError:无法添加属性__gsap,对象不可扩展(Gatsby + GSAP)

TypeError:无法添加属性__gsap,对象不可扩展(Gatsby + GSAP)
EN

Stack Overflow用户
提问于 2020-05-18 02:35:57
回答 1查看 761关注 0票数 2

我在搬到Gatsby时遇到了一些麻烦(我还在学习)。我有一个菜单动画,它工作得很好,除了其中的一个部分。我正在将菜单动画设置为打开和关闭。我已经将动画移到了专用函数中,因此对我来说更清晰(也更可重用)。

我现在有3个函数。前两个(staggerReveal()fadeInUp())工作得很好。但是第三个(staggerText)使它崩溃并抛出以下错误:"TypeError: Cannot add property __gsap,object is not extensible“。

我构建这个staggerText()函数的方法与构建其他两个函数的方法相同,它们工作得很好。我在这里找不到这个函数做错了什么..我假设错误不是来自gsap,而是来自<Link>?也许当你想在React/Gatsby中设置动画时,它不会像这样工作?

下面是我的组件代码:

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2020-05-18 18:44:30

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

这个答案对我来说很有效。我像这样重构了我的链接

代码语言:javascript
复制
<Link ref={line1} to="/"

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

代码语言:javascript
复制
staggerText(line1.current, line2.current, line3.current);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61856839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档