Cách hoạt động kiểu liên kết bộ định tuyến VueJS


78

Trang của tôi hiện có thành phần Navigation.vue. Tôi muốn làm cho từng điều hướng di chuột và hoạt động. "Hover" hoạt động nhưng "active" thì không.

Đây là cách tệp Navigation.vue trông như thế nào:

<template>
    <div>
        <nav class="navbar navbar-expand-lg fixed-top row">

                    <router-link tag="li" class="col" class-active="active" to="/" exact>TIME</router-link>
                    <router-link tag="li" class="col" class-active="active" to="/CNN" exact>CNN</router-link>
                    <router-link tag="li" class="col" class-active="active" to="/TechCrunch" exact>TechCrunch</router-link>
                    <router-link tag="li" class="col" class-active="active" to="/BBCSport" exact>BBC Sport</router-link>
        </nav>
    </div>
</template>

Và sau đây là phong cách.

<style>

   nav li:hover,
   nav li:active{
      background-color: indianred;
      cursor: pointer;
    }

</style>

Đây là cách di chuột trông giống như bây giờ và dự kiến ​​giống hệt nhau khi hoạt động. Đây là cách di chuột trông giống như bây giờ và dự kiến ​​giống hệt nhau khi hoạt động.

Tôi sẽ đánh giá cao nếu bạn cho tôi một lời khuyên để tạo kiểu hoạt động cho liên kết bộ định tuyến. Cảm ơn.



Xin chào @Bert, cảm ơn vì nhận xét của bạn. Tôi đã thử <router-link-exact-active> thay vì <router-link>, nhưng vẫn chưa hoạt động.
doobean

Đó không phải là nơi bạn chỉ định nó. Bạn chỉ định linkExactActiveClasslàm thuộc tính của bộ định tuyến (nơi bạn thêm ký tự routes).
Bert

TY @KateYeeumLee cho câu hỏi này. Được chỉ nhận được sẵn sàng để xây dựng một cái gì đó như thế này và nhận ra rằng nó phải được bộ phận riêng của mình - không nằm trong TheHeader.vue :)
CodeFinity

Câu trả lời:


176

Lớp giả: hoạt động không giống như việc thêm một lớp để tạo kiểu cho phần tử.

Lớp giả CSS: active đại diện cho một phần tử (chẳng hạn như một nút) đang được kích hoạt bởi người dùng. Khi sử dụng chuột, "kích hoạt" thường bắt đầu khi nút chuột được nhấn xuống và kết thúc khi nó được thả ra.

Những gì chúng tôi đang tìm kiếm là một lớp, chẳng hạn như .active, chúng tôi có thể sử dụng để tạo kiểu cho mục điều hướng.

Để có ví dụ rõ ràng hơn về sự khác biệt giữa :active.activexem đoạn mã sau:


Vue-Router

vue-routertự động áp dụng hai lớp đang hoạt động .router-link-active.router-link-exact-active, cho <router-link>thành phần.


router-link-active

Lớp này được áp dụng tự động cho <router-link>thành phần khi tuyến mục tiêu của nó được khớp.

Cách thức hoạt động của điều này là sử dụng hành vi đối sánh toàn diện. Ví dụ: <router-link to="/foo">sẽ áp dụng lớp này miễn là đường dẫn hiện tại bắt đầu bằng /foo/hoặc bằng /foo.

Vì vậy, nếu chúng ta có <router-link to="/foo"><router-link to="/foo/bar">, cả hai thành phần sẽ nhận được router-link-activelớp khi đường dẫn là /foo/bar.


router-link-exact-active

Lớp này được áp dụng tự động cho <router-link>thành phần khi tuyến mục tiêu của nó là một đối sánh chính xác . Hãy xem xét rằng cả hai lớp router-link-activerouter-link-exact-activesẽ được áp dụng cho thành phần trong trường hợp này.

Sử dụng cùng một ví dụ, nếu chúng ta có <router-link to="/foo"><router-link to="/foo/bar">, router-link-exact-activelớp sẽ chỉ được áp dụng <router-link to="/foo/bar">khi đường dẫn là /foo/bar.


Chỗ dựa chính xác

Giả sử chúng ta có <router-link to="/">, điều sẽ xảy ra là thành phần này sẽ hoạt động cho mọi tuyến đường. Điều này có thể không phải là một cái gì đó mà chúng ta muốn, vì vậy chúng tôi có thể sử dụng exactprop như vậy: <router-link to="/" exact>. Bây giờ thành phần sẽ chỉ được áp dụng lớp đang hoạt động khi nó khớp chính xác tại /.


CSS

Chúng ta có thể sử dụng các lớp này để tạo kiểu cho phần tử của mình, như sau:

 nav li:hover,
 nav li.router-link-active,
 nav li.router-link-exact-active {
   background-color: indianred;
   cursor: pointer;
 }

Các <router-link>thẻ được thay đổi bằng cách sử dụng tagprop, <router-link tag="li" />.


Thay đổi các lớp mặc định trên toàn cầu

Nếu chúng ta muốn thay đổi các lớp mặc định được cung cấp bởi vue-routertoàn cục, chúng ta có thể làm như vậy bằng cách chuyển một số tùy chọn cho vue-routercá thể như sau:

const router = new VueRouter({
  routes,
  linkActiveClass: "active",
  linkExactActiveClass: "exact-active",
})

Thay đổi các lớp mặc định cho mỗi cá thể thành phần ( <router-link>)

Thay vào đó, nếu chúng ta muốn thay đổi các lớp mặc định cho mỗi <router-link>và không phải trên toàn cục, chúng ta có thể làm như vậy bằng cách sử dụng các thuộc tính active-classexact-active-classnhư sau:

<router-link to="/foo" active-class="active">foo</router-link>

<router-link to="/bar" exact-active-class="exact-active">bar</router-link>

API v-slot

Vue Router 3.1.0+ cung cấp khả năng tùy chỉnh mức độ thấp thông qua một khe có phạm vi . Điều này rất hữu ích khi chúng ta muốn tạo kiểu cho phần tử bao bọc, giống như phần tử danh sách <li>, nhưng vẫn giữ logic điều hướng trong phần tử neo <a>.

<router-link
  to="/foo"
  v-slot="{ href, route, navigate, isActive, isExactActive }"
>
  <li
    :class="[isActive && 'router-link-active', isExactActive && 'router-link-exact-active']"
  >
    <a :href="href" @click="navigate">{{ route.fullPath }}</a>
  </li>
</router-link>

Xin lỗi nhưng những cái tên không phải là tự giải thích cho tôi :) Còn những liên kết bình thường không hoạt động hoặc "chính xác" thì sao? Trong trường hợp của tôi, các liên kết bình thường của tôi bị Vue tạo kiểu theo cách không mong muốn. Thay đổi kiểu hiện hoạt hoặc chính xác không có tác dụng.
Kokodoko

28

Khi bạn đang tạo bộ định tuyến, bạn có thể chỉ định linkExactActiveClasslàm thuộc tính để đặt lớp sẽ được sử dụng cho liên kết bộ định tuyến đang hoạt động.

const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

const router = new VueRouter({
  routes,
  linkActiveClass: "active", // active class for non-exact links.
  linkExactActiveClass: "active" // active class for *exact* links.
})

Điều này được ghi lại ở đây .


Điều này hoạt động tốt, nhưng trong ứng dụng của tôi, nó luôn được coi /là đang hoạt động (vì các URL như /aboutchứa nó).
Scribblemacher

2
@Scripblemacher nếu tôi hiểu chính xác, chỉ cần xóa linkActiveClass codepen.io/Kradek/pen/zWQKYp
Bert

28

https://router.vuejs.org/en/api/router-link.html thêm thuộc tính active-class = "active", ví dụ:

<ul class="nav navbar-nav">
    <router-link tag="li" active-class="active" to="/" exact><a>Home</a></router-link>
    <router-link tag="li" active-class="active" to="/about"><a>About</a></router-link>
    <router-link tag="li" active-class="active" to="/permission-list"><a>Permisison</a></router-link>
</ul>

nhưng tại sao cũng tạo ra lớp nuxt-link-chính xác-hoạt động, hãy kiểm tra câu hỏi của tôi ở đây stackoverflow.com/questions/54029794/...
Freddy Sidauruk

tham khảo tốt. các các exactthuộc tính có liên quan để tránh Triggering sai
Jossef Harush

3

Như đã đề cập ở trên bởi @Ricky vue-router sẽ tự động áp dụng hai lớp hoạt động .router-link-active.router-link-exact-active, cho thành phần.

Vì vậy, để thay đổi việc sử dụng css liên kết đang hoạt động:

.router-link-exact-active{
 //your desired design when link is clicked
font-weight: 700;
}

1
Làm thế nào để thực hiện điều này nếu thiết kế của bạn cần một màu khác cho mỗi mục menu khi nó hoạt động?
GY 22

2

Chỉ cần thêm vào giải pháp của @ Bert để làm rõ ràng hơn:

    const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

const router = new VueRouter({
  routes,
  linkExactActiveClass: "active" // active class for *exact* links.
})

Như người ta có thể thấy, dòng này nên được loại bỏ:

linkActiveClass: "active", // active class for non-exact links.

theo cách này, CHỈ liên kết hiện tại được bật sáng. Điều này sẽ áp dụng cho hầu hết các trường hợp.

David

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.