在 SvelteKit 中启用和禁用基于布尔值的滚动?

Enable and disable scroll based on boolean in SvelteKit?

问题
在 SvelteKit 中,我试图在打开侧边菜单时禁用和启用滚动。为此,我尝试使用绑定到我的菜单图标的 {open} 变量 bind:open={open}。 我想在open为真时触发函数enableScroll(),在open为假时触发函数disableScroll()。 这两个功能都可以正常工作。 {open} 变量在我期望它时为真,而在我使用 console.log() 时我期望它为假。 问题是我的 if-block 没有响应 {open} 的变化。

我试过的

目前,我的代码如下所示:


    $: if (open === true) {
            onMount(() => {
                disableScroll()
            })
        } else if (open === false) {    
            onMount(() => {
                enableScroll()
            })
        }  

也许我错误地使用了 onMount()?或者我需要以某种方式更改我的 if 语句以使其正确响应/以其他方式修复它?我很乐意提供一些帮助!谢谢。

onMount 只有 queues a function to run once,当组件被安装时。因此,如果组件已经呈现,运行ning onMount(() => { disableScroll() }) 将不会 运行 disableScroll —— 对 open 的任何后续更改都不会产生任何影响。这就是您的代码不起作用的原因。

但是,您确实需要做一些事情来防止您的滚动代码在服务器上 运行ning,因为 window 在服务器上不可用。在 SvelteKit 中,您可以使用 $app/env 中的 browser import 来确定您是否在浏览器中。这将告诉您在文档或 window 上访问仅限浏览器的 API 是否安全。因此,您可以执行以下操作:

<script>
    import { onMount } from 'svelte';
    import { browser } from '$app/env';

    let open;

    let scrollTop = null;
    let scrollLeft = null;

    function disableScroll() {
        if (browser) {
            scrollTop = 
                window.pageYOffset || window.document.documentElement.scrollTop;
            scrollLeft = 
                window.pageXOffset || window.document.documentElement.scrollLeft,
                window.onscroll = function() {
                window.scrollTo(scrollLeft, scrollTop);
            }};
        }

    function enableScroll() {
        if (browser) {
            window.onscroll = function() {};
        }
    };

    $: if (open) {
        disableScroll();
    } else {
        enableScroll();
    }
</script>