svelte - 注销时隐藏 Svelte-Routing 中的路由

标签 svelte

当我尝试在用户未登录时隐藏某些路由的页面时,它运行良好。但是一旦用户登录页面,当我使用 svelte-routing 导航到页面时,页面不再显示内容。的 navigate方法。但是一旦我点击路线,它们就会呈现得很好。难道我做错了什么?下面是基本设置。 You can also find it on github.
App.svelte
您可以在下面的示例中看到我隐藏了 Route s 在 if-else main下的条款HTML 标签。当我在页面 /somewhere而且我也已经注销然后点击登录然后点击提交它应该带我回到/somewhere确实如此。但文Somewhere直到我单击链接 Somewhere 才显示它应有的样子.预期的结果是它出现了。

<script>
import { Router, Link, Route, navigate } from "svelte-routing"
import Login from "./Login.svelte"
import Somewhere from "./Somewhere.svelte"
import Home from "./Home.svelte"

let user = null
var previousPath

$: user

function logout() {
    localStorage.clear()
    user = null
    navigate("/")
}

function loggedIn (event) {
    if (event) {
        user = { name: "George" }
        navigate(previousPath, { replace: true })
    }
}

function loggingIn() {
    previousPath = window.location.pathname
}

</script>

<Router>
    <h1>Test Login</h1>
    <nav>
        <Link to="/">Home</Link>
        {#if user === null}
        <Link to="/login" on:click={loggingIn}>Login</Link>
        {:else}
        <Link to="/somewhere">Somewhere</Link>
        <form on:submit={logout}>
            <input type="submit" value="Logout" />
        </form>
        {/if}
    </nav>
    <main>
        {#if user !== null}
        <Route path="/somewhere"><Somewhere /></Route>
        <Route path="/"><Home /></Route>
        {:else}
        <p>Please login</p>
        <Route path="/login"><Login on:loggedIn={loggedIn} /></Route>
        {/if}
    </main>
</Router>

这是其他页面:
Home.svelte
<p>Yellow!</p>
Login.svelte
<script>
import { createEventDispatcher } from "svelte";

const dispatch = createEventDispatcher()

function submit() {
    dispatch("loggedIn", true)
}
</script>

<form on:submit={submit}>
    <input type="submit" value="Submit" />
</form>
Somewhere.svelte
<p>Somewhere!</p>

最佳答案

经过一番调查,我发现你可以使用 tick 功能如下:

import { tick } from "svelte"

...

async function loggedIn (event) {
    if (event) {
        user = { name: "George" }
        await tick()
        navigate(previousPath, { replace: true })
    }
}

它有效,但看起来很难看。我不确定是否有更好、更干净的方法来做到这一点,所以你必须坚持下去。
tick是一个函数,一旦应用了任何挂起的状态更改,它就会解决。在您的情况下,当 user修改后,确保{:else}的内容块被显示(虽然是空的),然后导航到上一个路径,这会导致在 Route 中安装组件.

关于svelte - 注销时隐藏 Svelte-Routing 中的路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57066539/

相关文章:

javascript - Svelte 派生存储和数组排序

javascript - 无法让 D3.js 在 Svelte 组件中工作(使用汇总)

javascript - 从对象数组中的属性创建字符串文字联合

environment-variables - 使用 Rollup Replace 将环境变量传递到 sapper 的客户端安全吗?

Svelte:使用对象作为值时预先选择选择输入选项

javascript - 如何在原始 html 中使用绑定(bind)?

javascript - Svelte 每个循环都不会更新,而对象是动态更改的

svelte - 如果子组件修改 Svelte 存储,父组件不会更新

github-pages - 如何从子文件夹运行 Svelte 应用程序?

svelte - 在 Svelte 中中断迭代(每个)?