Vue Router是一個(gè)用于Vue.js的路由管理庫,可以實(shí)現(xiàn)在單頁應(yīng)用中實(shí)現(xiàn)客戶端的路由跳轉(zhuǎn)和組件加載。
npm install vue-router
通過npm安裝Vue Router。在使用Vue Router進(jìn)行開發(fā)時(shí),我們會(huì)遇到一個(gè)問題,就是路由重復(fù)加載的問題。
當(dāng)在當(dāng)前路由中多次點(diǎn)開同一個(gè)路由時(shí),組件會(huì)被多次加載,此時(shí)如果我們的組件充滿副作用,那么相同的組件就會(huì)執(zhí)行相同的副作用多次,造成了一些錯(cuò)誤。
這個(gè)問題的原因在于路由的跳轉(zhuǎn)是基于當(dāng)前頁面的URL來變化的,在路由參數(shù)沒有發(fā)生變化的情況下,相同的路由會(huì)被認(rèn)為是同一個(gè)頁面,因此會(huì)被重復(fù)加載路由組件。
在Vue Router中,我們可以通過以下的方法解決重復(fù)加載的問題。
const router = new VueRouter({
routes: [
{
path: '/example',
component: ExampleComponent
}
],
// 添加一個(gè) route object 的 key
key: (route) =>String(route.query.id)
})
我們?cè)赩ue Router中的route object中添加了一個(gè)key字段,用于解決路由的重復(fù)加載。這個(gè)key字段是一個(gè)函數(shù),接受一個(gè)路由對(duì)象作為參數(shù),返回一個(gè)字符串。
在上面的例子中,我們傳入了route中的query參數(shù)id作為key的值,即相同的路由在id參數(shù)發(fā)生變化時(shí)會(huì)被判定為不同的路由,從而解決了重復(fù)加載的問題。
但是,使用這種方式會(huì)為每個(gè)路由生成一個(gè)唯一的key值,帶來了額外的計(jì)算開銷。因此,我們需要在使用時(shí)權(quán)衡計(jì)算開銷和功能實(shí)現(xiàn)的需求。
除了在Vue Router中添加key字段的方法之外,還有一種更簡單的方式可以解決路由的重復(fù)加載問題,那就是在單頁應(yīng)用中使用keep-alive組件。
<keep-alive>
<router-view></router-view>
</keep-alive>
keep-alive組件可以緩存當(dāng)前路由的組件,而不是在每次路由切換時(shí)都重新創(chuàng)建組件實(shí)例。這樣,即使多次打開相同的路由也不會(huì)出現(xiàn)組件的重復(fù)加載問題。