Sveltekit:使用 $page.path 设置活动链接的样式

fas*_*eep 11 css routes svelte sveltekit

我正在开发一个 sveltekit 应用程序,其侧导航包含链接。我无法使链接上的活动类样式正常工作。

这些链接是NavLink.svelte中的组件:

<script>
  import { page } from '$app/stores';
  import Icon from '$lib/Icon.svelte';
  export let title;
  export let href;
</script>

<a {href} class="link" class:active={$page.path == href}>
  <Icon {title} />
</a>

<style>
a.active {
  background-color: rgba(0,0,0,0.24);
</style>
Run Code Online (Sandbox Code Playgroud)

这些链接在SideNav.svelte中使用:

<script>
  import NavLink from '$lib/NavLink.svelte';
</script>

<nav class="container">
  <div id="links">
    <NavLink href="/link1" title="icon1" />
    <NavLink href="/link2" title="icon2" />
    <NavLink href="/link3" title="icon3" />
  </div>
</nav>
Run Code Online (Sandbox Code Playgroud)

最后,sidenav 加载到我的__layout.svelte中:

<SideNav />
<slot />
<Footer />
Run Code Online (Sandbox Code Playgroud)

现在,当我单击其中一个侧导航链接时,我将被路由到正确的页面,但我的导航链接未采用该类的样式.active。但是,如果我检查该链接,devtools 会向我显示:<a class="link active:true">并且其他链接具有active:false.

所以看起来该功能正在工作,但我的活动样式未应用(背景颜色)。我缺少什么?

我尝试将 Active 类代码移至 SideNav 组件而不是 NavLink 组件,并观察到相同的行为。我想不通,所以我找到了一种效果很好的新方法。

在我的NavLink.svelte中:

<script>
  import {onMount} from "svelte";
  import Icon from '$lib/Icon.svelte';

  let currentPath;
  onMount(() => {
    currentPath = window.location.pathname;
  });
  export let title;
  export let href;
</script>

<a {href} class:active={currentPath == href}>
  <Icon {title} />
</a>
Run Code Online (Sandbox Code Playgroud)

其余的代码是相同的。现在我的链接有了正确的样式。值得注意的是,他们只是有<a class="active">,也没有<a class="active:true">。为什么它不能与其他方法一起使用?

fas*_*eep 14

我想通了......我想我只是忘了引用。噢。NavLink 的工作代码(也解释子页面)是:

<a {href} class:active="{$page.path.includes(href)}">

  • 我认为自发布以来“$page”的属性可能已经改变。对我有用的是“$page.url.pathname”而不是“$page.path” (17认同)

小智 12

要在最新版本的 SvelteKit 中实现这一点,在引入一些重大更改后,您可以执行以下操作:

<a {href} class:active={$page.url.pathname === href}>
Run Code Online (Sandbox Code Playgroud)

$page.url返回类似以下内容:

URL { 
    href: "http://localhost:5173/accounts/login", 
    origin: "http://localhost:5173", 
    protocol: "HTTP:", 
    username: "", 
    password: "", 
    host: "localhost:5173", 
    hostname: "localhost", 
    port: "5173", 
    pathname: "/accounts/login", 
    search: "" 
}
Run Code Online (Sandbox Code Playgroud)

然后您可以$page.url.pathnamehref锚标记的进行比较。