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

Svelte 5组件卸载前获取scrollY,求替代React useLayoutEffect的方案

在Svelte 5中获取组件卸载前的滚动位置

你遇到的问题核心是清理函数的执行时机:默认的onDestroy、onMount清理函数以及普通$effect的清理函数,都是在组件DOM被移除后才执行的——此时页面内容高度变化,滚动位置可能已经重置为0。而React的useLayoutEffect清理函数是在DOM更新前(组件尚未被移除)执行,所以能拿到正确的滚动值。

在Svelte 5中,你可以用$effect.pre()的清理函数来实现相同的效果,它的执行时机是DOM更新前、组件卸载前,此时页面滚动位置还未被改变:

<script>
  import { $effect } from 'svelte';

  // 存储滚动位置的变量,可替换为localStorage等持久化方式
  let savedScrollY = 0;

  $effect.pre(() => {
    // 可选:组件挂载时的逻辑
    return () => {
      // 这个清理函数会在组件即将卸载、DOM未被移除时同步执行
      savedScrollY = window.scrollY;
      console.log(savedScrollY); // 此时能获取到正确的滚动位置
    };
  });
</script>

为什么这个方案有效?

  • $effect.pre()的回调和清理函数都在DOM更新前触发,对应React中useLayoutEffect的执行时机。
  • 组件卸载时,清理函数会在DOM元素被移除前运行,页面滚动状态还保持着组件存在时的样子,因此window.scrollY能拿到正确的值。

内容的提问来源于stack exchange,提问作者Jaya Surya Sarisa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:35:03