[英]Sveltekit: Styling active links with $page.path
我正在开发一个带有包含链接的 sidenav 的 sveltekit 应用程序。 我无法使链接上的活动 class 样式正常工作。
链接是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>
最后,sidenav 加载到我的__layout.svelte中:
<SideNav />
<slot />
<Footer />
现在,当我单击其中一个 sidenav 链接时,我被路由到正确的页面,但我的 NavLink 没有使用.active
class 设置样式。但是,如果我检查该链接,devtools 会向我显示: <a class="link active:true">
和其他链接有active:false
。
所以看起来 function 正在工作,但我的活动样式没有应用(背景颜色)。 我错过了什么?
我尝试将 Active class 代码移动到 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>
和密码的rest是一样的。 现在我的链接获得了正确的样式。 值得注意的是,它们只有<a class="active">
而不是<a class="active:true">
。 为什么它不能与其他方法一起使用?
要在最新版本的 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
进行比较。
我想通了....我想我只是忘了加上引号。 哦。 NavLink 的工作代码(也包含子页面)是:
<a {href} class:active="{$page.path.includes(href)}">
这是我的解决方案,只匹配当前 URL 的第一段:
<a
class:active={$page.url.pathname.split("/")[1] ===item.href.split("/")[1]}
href={item.href}>
{item.label}
</a>
a.active {
background-color:red;
}
您可能想使用仅包含路由 ID 的$page.route.id
,即使路径中有参数也是如此。
例如,路径/catalogue/123
将给出:
$page.url.pathname
=== /catalogue/123
(每个项目不同,不是到处都有效)$page.route.id
=== /catalogue/[id]
(所有项目都相同)然后你可以在你的链接中使用:
<a href="/catalogue/123" class:active={$page.route.id === '/catalogue/[id]'}>catalogue</a>
最后,这将适用于 static 链接 (/catalogue) 和动态链接 (/catalogue/456)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.