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

Svelte中goto函数无法跳转至根路径的问题求助

问题分析与解决方案

核心问题出在表单的默认提交行为干扰了goto的执行。你的登录按钮嵌套在<form>标签内,点击按钮时会触发表单默认提交动作,该动作会和goto的路由跳转逻辑冲突,导致根路径的跳转被中断(其他路径因路由匹配逻辑差异未受影响)。同时,手动订阅Store的写法也可优化为更简洁可靠的自动订阅语法。

具体修复步骤

1. 阻止表单默认提交行为

给表单添加on:submit|preventDefault修饰符,彻底禁用默认提交动作:

<form on:submit|preventDefault>
    <button on:click={() => login("", "")}>Login</button>
    <a href="/">test</a>
</form>

或者直接在按钮点击事件上阻止默认行为:

<button on:click|preventDefault={() => login("", "")}>Login</button>

2. 简化Store订阅逻辑

使用Svelte原生的自动订阅语法$isAuthenticated代替手动订阅,代码更简洁且不易出错:

<script>
    import { goto } from "$app/navigation";
    import { isAuthenticated, login } from "./auth";

    $: if ($isAuthenticated) {
        console.log("here");
        goto("/");
    }
</script>

3. 可选:确保跳转时机正确

如果上述操作后仍有问题,可通过nextTick确保DOM更新完成后再执行跳转:

<script>
    import { goto } from "$app/navigation";
    import { isAuthenticated, login } from "./auth";
    import { nextTick } from 'svelte';

    $: if ($isAuthenticated) {
        console.log("here");
        await nextTick();
        goto("/");
    }
</script>

根路径跳转受影响的原因

表单默认提交会尝试刷新当前页面或提交到当前路径,当你调用goto("/")时,浏览器的表单提交动作会覆盖路由跳转逻辑;而跳转其他路径时,路由系统的优先级更高,表单提交的默认行为来不及干扰跳转流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:45:15