El problema
En SvelteKit, estoy tratando de deshabilitar y habilitar el desplazamiento cuando se abre mi menú lateral. Para hacer eso, estoy tratando de utilizar la variable {abrir} que está vinculada a mi icono de menú con bind:open={open}. Quiero activar la función enableScroll() cuando la apertura es verdadera, y activar la función disabledScroll() cuando la apertura es falsa. Ambas funciones funcionan bien. La variable {open} es verdadera cuando lo espero y falsa cuando lo espero cuando uso console.log(). El problema es que mi bloque if no responde al cambio {open}.
lo que he probado
Actualmente, mi código se ve así:
$: if (open === true) { onMount(() => { disableScroll() }) } else if (open === false) { onMount(() => { enableScroll() }) }¿Quizás estoy usando onMount() incorrectamente? ¿O de alguna manera necesito cambiar mi declaración if para que sea correctamente reactiva/arreglarla de alguna otra manera? ¡Con mucho gusto agradecería alguna ayuda! Gracias.
onMount solo pone en cola una función para que se ejecute una vez , cuando el componente está montado. Por lo tanto, ejecutar onMount(() => { disableScroll() }) no ejecutará disableScroll si el componente ya se ha procesado; cualquier cambio posterior para open no tendrá ningún efecto. Es por eso que su código no funciona.
Sin embargo, debe hacer algo para evitar que su código de desplazamiento se ejecute en el servidor, ya que la window no está disponible allí. En SvelteKit, puede determinar si está en el navegador utilizando la importación del navegador desde $app/env . Esto le dirá si es seguro acceder a las API solo del navegador en el documento o la ventana. Entonces, podrías hacer algo como lo siguiente:
<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>