如何在元素中定位 router-link-active 类?

发布于 2025-01-12 04:36:36 字数 2055 浏览 3 评论 0原文

我有一个带有 2 个路由器链路的组件。我希望在单击其中一个时两者都着色。问题是这些路由器链接不共享 router-link-active 类,因此我尝试通过 querySelector 定位它们并应用 color< /code> 手动 css 属性。

这是组件:

<template>
  <div id="nav-link-cms" class="nav-link-cms">
    <li>
      <router-link class="router-link" :to="{ name: link}">
      <span>
        <fa class="icon" :icon="icon"></fa>
        <span class="label">{{ label }}</span>
        <router-link class="plus-link" v-if="plusLink" :to="{ name: plusLink }">
          <fa class="icon-plus" :icon="[ 'fas', 'circle-plus' ]"></fa>
        </router-link>
      </span>
      </router-link>
    </li>
  </div>
</template>

我可以像这样定位一个 router-link 类 plus-link

<script setup>
import { onMounted } from 'vue';

onMounted(() => {
    console.log(document.querySelector('.plus-link'))
})
</script>

这似乎工作正常。浏览器控制台输出:

在此处输入图像描述

如您所见,link 元素中同时存在 router-link-activeplus-link 类。

像这样输出 classList

onMounted(() => {
    console.log(document.querySelector('.plus-link').classList)
})

在控制台中显示:

DOMTokenList ['plus-link', value: 'plus-link']
0: "router-link-active"
1: "router-link-exact-active"
2: "plus-link"
length: 3
value: "router-link-active router-link-exact-active plus-link"
[[Prototype]]: DOMTokenList

但是当我尝试查看列表是否包含 a router-link-active 类:

onMounted(() => {
    console.log(document.querySelector('.plus-link').classList.contains('router-link-active'))
})

控制台显示:

false

即使在 onMounted 之后,是否仍应用 router-link-active?我怎样才能瞄准它?

I have a component with 2 router links. I want both to be colored when either one is clicked. Problem is that these router links don't share a router-link-active class, so I'm trying to target them via querySelector and apply the color css property manually.

This is the component:

<template>
  <div id="nav-link-cms" class="nav-link-cms">
    <li>
      <router-link class="router-link" :to="{ name: link}">
      <span>
        <fa class="icon" :icon="icon"></fa>
        <span class="label">{{ label }}</span>
        <router-link class="plus-link" v-if="plusLink" :to="{ name: plusLink }">
          <fa class="icon-plus" :icon="[ 'fas', 'circle-plus' ]"></fa>
        </router-link>
      </span>
      </router-link>
    </li>
  </div>
</template>

and I can target one router-link class plus-link like so:

<script setup>
import { onMounted } from 'vue';

onMounted(() => {
    console.log(document.querySelector('.plus-link'))
})
</script>

This seems to work fine. The browser console outputs:

enter image description here

As you can see both router-link-active and plus-link classes are present in the link element.

Outputting the classList like so:

onMounted(() => {
    console.log(document.querySelector('.plus-link').classList)
})

shows this in the console:

DOMTokenList ['plus-link', value: 'plus-link']
0: "router-link-active"
1: "router-link-exact-active"
2: "plus-link"
length: 3
value: "router-link-active router-link-exact-active plus-link"
[[Prototype]]: DOMTokenList

But as soon as I try to see if the list contains a the router-link-active class:

onMounted(() => {
    console.log(document.querySelector('.plus-link').classList.contains('router-link-active'))
})

the console shows:

false

Is router-link-active applied even after onMounted? How can I target it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱冒险 2025-01-19 04:36:36

我自己没有尝试过,但你应该能够使用 useLink Docs,从Vue-Router中获取每个路由的if值(linkplusLink),然后查看其isActive属性然后他们俩都将其传递给 模板。

伪代码:

<template>
 <router-link :class="{active: isActive}" :to="link">
  <router-link :to="plusLink"></router-link>
 </router-link>
</template>
<script setup>
import { RouterLink, RouterView } from "vue-router";
import { ref, watch } from "vue";
import { useLink } from "vue-router";

const isActive = ref(false);
const linkState = useLink({ to: "about" });
const linkPlusState = useLink({ to: "new" });
watch([linkState.isActive + linkPlusState.isActive], () => {
  if (linkState.isActive || linkPlusState.isActive) {
    isActive.value = true;
  } else {
    isActive.value = false;
  }
});
</script>

注意:一般来说,在使用任何 FE 框架时,您应该避免直接 DOM 操作。

Have not tried it myself but you should be able to use useLink Docs, from Vue-Router to get if the value for each route (link and plusLink), and then look at the isActive property of both of them then pass it to the template.

Psudo-code:

<template>
 <router-link :class="{active: isActive}" :to="link">
  <router-link :to="plusLink"></router-link>
 </router-link>
</template>
<script setup>
import { RouterLink, RouterView } from "vue-router";
import { ref, watch } from "vue";
import { useLink } from "vue-router";

const isActive = ref(false);
const linkState = useLink({ to: "about" });
const linkPlusState = useLink({ to: "new" });
watch([linkState.isActive + linkPlusState.isActive], () => {
  if (linkState.isActive || linkPlusState.isActive) {
    isActive.value = true;
  } else {
    isActive.value = false;
  }
});
</script>

Note: As a general thing you should avoid direct DOM manipulation when using any FE framework.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文