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

Svelte Sapper如何检测路由变化 实现移动端导航选中后自动关闭

问题原因

你当前的代码逻辑仅在组件首次挂载到DOM时执行一次,Sapper的客户端路由跳转不会重新挂载上层布局组件(导航栏通常放在根布局文件中),因此路由切换时不会触发onMount内的逻辑。

解决方案

方案1:监听segment属性(最简单,适配你当前的代码结构)

Sapper会在每次路由变化时自动更新传给布局组件的segment属性,搭配Svelte的响应式声明语法$:即可实现路由变化监听:

<script>
    import CartWidget from '../shared/CartWidget.svelte'
    import { onMount } from 'svelte'

    export let segment = '';

    // 响应式监听,segment变化时自动执行代码块
    $: {
        const currentPath = window.location.pathname
        console.log(currentPath)
        // 此处添加关闭移动端导航菜单的逻辑即可,例如:
        // mobileMenuOpen = false
    }

    onMount(() => {
        let path = window.location.pathname
        console.log(path)
    })
</script>

方案2:使用Sapper内置page store(适合需要完整路由信息的场景)

如果需要获取路由查询参数、哈希等完整路由信息,可以使用Sapper内置的响应式page store:

<script>
    import CartWidget from '../shared/CartWidget.svelte'
    import { onMount } from 'svelte'
    // 导入Sapper内置stores
    import { stores } from '@sapper/app'

    const { page } = stores()
    export let segment = '';

    // 监听page store变化,路由更新时自动触发
    $: {
        const currentPath = $page.path
        console.log(currentPath)
        // 关闭移动端导航菜单逻辑
    }

    onMount(() => {
        let path = window.location.pathname
        console.log(path)
    })
</script>

如果后续你迁移到SvelteKit,仅需要将page的导入语句改为import { page } from '$app/stores',其余使用逻辑保持一致。

内容的提问来源于stack exchange,提问作者seven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:24:02