首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >onMount不会第二次被打电话

onMount不会第二次被打电话
EN

Stack Overflow用户
提问于 2021-09-18 19:38:38
回答 2查看 373关注 0票数 0

我正在SvelteKit和Gsap + scrollTrigger中建立一个简单的网站。其结构如下: Startpage / About / Services / Contact

在整个网站,我使用许多简单的动画SVG,文本和其他元素。一切似乎都很好,但当我在页面之间来回移动时,我注意到网页确实在减速,最终开始崩溃。刷新浏览器之后,一切都好起来了,…(直到我再次开始在页面之间导航)。我发现我需要在页面转换时杀死GSAP ScrollTriggers,并重新初始化它们。

所以我杀死了scrollTriggers,但是现在出现了一个新的问题:当我开始导航(比如从/about导航到/contact)并返回到以前访问过的页面时-- onMount不会再次被调用,我的所有动画都不会启动……我在所有的路径页面上都像这样使用gsap:

代码语言:javascript
运行
复制
<script>
// GSAP
import { gsap }                 from 'gsap';
import { ScrollTrigger }        from 'gsap/dist/ScrollTrigger.js';
import { onMount, onDestroy }   from 'svelte';
    
    
    
const init = () => {


// Title + Circles
let tlHero = gsap.timeline({
    defaults: {duration: 1, ease: "power2"}, 
    scrollTrigger: {
        trigger: ".index h1",
        toggleActions: "restart none restart none", 
    }
    });

tlHero
    .from(".index h1", {x: 40, delay:0.3)
    .from(".hero-c2", {duration: 0.8, scale:0.1, transformOrigin:"50% 100%"})
    .from(".hero-c3", {y:-31, delay:0.3}) 
    .from(".hero-c1", {y:32}, "-=1") 


  // Titles - .lists sections
  const sections = gsap.utils.toArray('.lists section');
  sections.forEach((section) => {
    gsap.from(section, {
    x:100,
    duration: 2,
    stagger:5,
    ease: 'power4',
    opacity:0,
      scrollTrigger: {
        trigger: section,
        toggleActions: 'restart none none reverse',
        start: 'top 80%',
      }
    });
  });



  // … and here several other animations…

};


onMount(() => {
    gsap.registerPlugin(ScrollTrigger);
    init();
});

onDestroy(() => {
ScrollTrigger.getAll().forEach(trigger => trigger.kill());
});


</script>

当我导航到其中一个页面时,我在console.log中签入了onMount和onDestroy是否会触发。结果如下:

代码语言:javascript
运行
复制
// Navigating to /routes/index.svelte
index.svelte-016bdddb.js:1 ScrollTriggers before mount 1
index.svelte-016bdddb.js:1 ScrollTriggers after mount 3

// Navigating to /routes/contact/index.svelte
index.svelte-016bdddb.js:1 ScrollTriggers before mount 5
index.svelte-016bdddb.js:1 ScrollTriggers after mount 7
index.svelte-a4654da6.js:1 ScrollTriggers before mount 9
index.svelte-a4654da6.js:1 ScrollTriggers after mount 10
index.svelte-016bdddb.js:1 ScrollTriggers before destroy 10
index.svelte-016bdddb.js:1 ScrollTriggers after destroy 0
index.svelte-016bdddb.js:1 ScrollTriggers before destroy 0
index.svelte-016bdddb.js:1 ScrollTriggers after destroy 0

我不是编程方面的专家,SvelteKit和GSAP相结合对于我的项目…来说似乎是一个很好的选择。但现在我被困住了-/

我很感谢你的帮助

EN

回答 2

Stack Overflow用户

发布于 2022-11-07 12:38:03

这就是svelte工具包的工作原理,如果您使用不同的段塞导航到同一个页面,那么组件将不会卸载--相反,svelte工具包将保持所有状态值不变以解决这个问题,您将需要使用afterNavigate钩子,并将其用于任何状态重置,或者在您的情况下调用gsap.registerPlugin(ScrollTrigger);

票数 0
EN

Stack Overflow用户

发布于 2022-11-07 12:51:55

我认为这里的问题是,您正在onMount()钩子中注册onMount()。GSAP插件应该在全球注册。因此,您应该注册ScrollTrigger或任何其他插件以外的您的主要功能,但只要你的应用程序级js文件。例如,请试试这个。

代码语言:javascript
运行
复制
// GSAP
import { gsap }                 from 'gsap/dist/gsap.js'; // Try using this path instead
import { ScrollTrigger }        from 'gsap/dist/ScrollTrigger.js';
import { onMount, onDestroy }   from 'svelte';

gsap.registerPlugin(ScrollTrigger); // Try registering it like this

const init = () => {
  // your init function code
}

否则,只需尝试使用带有ScrollTrigger标记的<script>

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

https://stackoverflow.com/questions/69237890

复制
相关文章

相似问题

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