【问题标题】:How to set menu item to active in sveltekit app如何在 sveltekit 应用程序中将菜单项设置为活动状态
【发布时间】:2021-12-23 14:35:01
【问题描述】:

我一直在开发一个 sveltekit 应用程序,最近在我的主导航菜单上遇到了问题。当应用程序加载或刷新时,与当前 URL 对应的当前菜单项未设置为活动。 (即菜单项“主页”的 URL 为“/”)我很难在网上找到任何有用的东西来演示如何设置它,但我有一个可行的解决方案,并认为我会为其他人记录它。目前很简单。

我有一个 nav.json 文件,我在其中定义了我的应用程序中的任何菜单,以便于组织菜单。我将其导入文件顶部并将其存储在数组中以供以后使用。

import menuObj from '../nav/nav.json';

let sidebar = menuObj.menus[0].items;

onMount() 只是在加载导航组件时获取当前路径,并且只为我运行一次。

那么 - 使用<svelte:window on:click={handlePageClick}/> 我们可以监听页面上的任何点击。

handlePageClick(e) 方法中,我们传递了on:click 事件。使用该事件,我们可以捕获 URL 的当前pathname。这允许我们检查pathnameitem.path,该item.path 定义在我使用html 中的#each 方法导入和提取的nav.json 文件中。在 <a> 上,如果 items 路由与当前路径匹配,我们可以将类设置为 active。

这里是完整的实现

<script>
    import menuObj from '../nav/nav.json';
    import {onMount} from "svelte";

    let path;
    let sidebar = menuObj.menus[0].items;

    onMount(() => {
        path = window.location.pathname;
    })

    function handlePageClick(e) {
        path = e.view.location.pathname;
    }

</script>

<svelte:window on:click={handlePageClick}/>
<nav class="sidebar">
    {#each sidebar as item, i}
        <a href={item.route} id="sidebar-menu-item-{item.id}" 
           class={path === item.route ? "item active" : "item"}
        >
            <i id="sidebar-menu-item-{item.id}-i" class="{item.icon}"></i>
        </a>
    {/each}
</nav>

我还没有发现任何缺点。如果我发现任何东西,我会更新这个问题。

【问题讨论】:

  • 有一种方法可以在 SO 上分享这样的知识,因此它不会作为“未回答”的问题而存在。他们在询问时会给您一个“我知道答案”复选框,然后您标记它并提供答案。这是感兴趣的 sn-p stackoverflow.com/help/…

标签: javascript html sveltekit


【解决方案1】:

这不是一个真正的问题,但无论如何我都会添加一个答案,因为你的方法不是必需的,SvelteKit 已经为此提供了一个内置系统:

<script>
 import { page } from '$app/stores';
</script>

<a href={item.route} class="item" class:active={$page.url.pathname == item.route}>
 ...
</a>

页面是一个类似于商店的对象,其中包含当前路径,它将自动更新为新路径

作为奖励:

class:active 是一个简单的速记,删除了那里的三元表达式。

【讨论】:

  • 谢谢,比我做的要优雅得多。我不确定这在 sveltekit 中的何处记录,我很难找到这样的解决方案,但我确实实现了它并且它正在工作。
  • 如何查看 $page.url.pathname 属性?我正在尝试将其值保存在 path 中,因此我不必输入太多(大菜单)....但是当路线更改时它不会自行更新。
  • 使用反应性:$: path = $page.url.pathname
猜你喜欢
  • 1970-01-01
  • 2015-12-20
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
相关资源
最近更新 更多