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

gstyhher  于 2023-01-22  发布在  其他
关注(0)|答案(3)|浏览(122)

我正在使用一个包含链接的sidenav的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>

这些链接用于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>

最后,侧边导航被加载到我的**__layout.svelte**中:

<SideNav />
<slot />
<Footer />

现在,当我点击一个sidenav链接时,我会被引导到正确的页面,但我的NavLink不是用.active类设计的。但是,如果我检查链接,devtools会显示如下:<a class="link active:true">,而其它链路具有active:false
所以看起来这个功能是工作的,但是我的活动样式没有被应用(背景颜色)。我错过了什么?
我试着将Active类代码移到SideNav组件而不是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>

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

nukf8bse

nukf8bse1#

我发现了......我想我只是忘了加上引号。哦。NavLink的工作代码(也包括子页面)是:
<a {href} class:active="{$page.path.includes(href)}">

kxeu7u2r

kxeu7u2r2#

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

<a {href} class:active={$page.url.pathname === href}>

$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: "" 
}

然后可以将$page.url.pathname与锚标记的href进行比较。

carvr3hs

carvr3hs3#

下面是我的解决方案,只匹配当前URL的第一段:

<a
  class:active={$page.url.pathname.split("/")[1] ===item.href.split("/")[1]}
  href={item.href}>
  {item.label}
</a>
a.active {
   background-color:red;
  }

相关问题