10

我有一个页面,其中有一个带有“Quarters”链接的导航栏。在 Quarters 链接下,当用户在/quarters路线上时,将显示一个季度列表,如 2019Q2 等。网址将为/quarters/2019q2.

selected如果当前 url 与链接的 href 匹配,我想制作一个显示超链接的组件,该超链接将具有该类。这是我能得到的最接近的:

<script>
  import { afterUpdate } from 'svelte';
  export let segment;
  export let text = 'text here';
  export let link;
  let isCurrentPath = false;
  console.log(segment, link, text);
  afterUpdate(() => {
    if (window.location.pathname.includes(link)) {
      isCurrentPath = true;
      debugger;
    }
    console.log('HL afterUpdate ', window.location);
  });
</script>

<style>
  /* omitted */
</style>

<a class:selected={segment && isCurrentPath} href={link}>{text}</a>

这适用于第一次加载,但是当用户导航到不同的数据页面时,选择不会更新。如何让一些代码只在客户端运行?如果我在window外部访问该对象,afterUpdate我将从服务器端代码中得到一个 null ref 错误。

ETA:也试过这个:

  let isCurrentPath = false;
  let path = typeof window === 'undefined' ? '' : window.location.pathname;
  $: if (path) isCurrentPath = window.location.pathname.includes(link);

当用户单击其中一个数据链接时,该代码不会触发。也试过onMount了,没有阳性结果。

4

3 回答 3

8

诀窍是根据页面存储中的值创建响应式语句。

<!--
This is used to have a link on the page that will show highlighted if the url meets the criteria.
You might want to adjust the logic on line 19.
usage: 
<HighlightedLink bind:segment highlight="faq" rel="prefetch" link="/faq" text="FAQ" />
--> 

<script>
  import { stores } from '@sapper/app';
  const { page } = stores();
  export let highlight;
  export let segment;
  export let text = 'text here';
  export let link;
  export let target;
  let highlightPath = false;
  $: highlightPath =
    $page.path && highlight && ($page.path.includes(highlight) || $page.path.includes(link));
</script>

<style>
  .selected {
    position: relative;
    display: inline-block;
  }
  .selected::after {
    position: absolute;
    content: '';
    width: calc(100% - 1em);
    height: 2px;
    background-color: rgb(255, 62, 0);
    display: block;
    bottom: -1px;
  }
  a {
    padding-left: 10px;
  }
</style>


<a class:selected={highlightPath} href={link}>{text}</a>
于 2019-09-11T18:51:23.470 回答
3

对于使用 SvelteKit 的人,给出的答案仍然适用。查看页面商店的文档:https ://kit.svelte.dev/docs/modules#$app-stores

编辑:在新的 SvelteKit 更新中有重大变化。您仍然可以像这样从页面存储访问当前 url:

import { page } from '$app/stores';
$page.url.pathname
于 2021-07-29T15:32:58.970 回答
0

而不是使用afterUpdate我相信你应该考虑写一些东西onMount并使用反应性语句https://svelte.dev/examples#reactive-statements让 svelte 知道你想要isCurrentPath在位置变化时重新计算。

于 2019-09-06T17:22:15.817 回答