最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue-Router安裝過程及原理詳細(xì)

 更新時(shí)間:2021年09月26日 09:10:35   作者:前端人  
路由是網(wǎng)絡(luò)工程里面的專業(yè)術(shù)語,就是通過互聯(lián)把信息從源地址傳輸?shù)侥康牡刂返幕顒?dòng)。本質(zhì)上就是一種對(duì)應(yīng)關(guān)系。分為前端路由和后端路由。小編將再下面文章為大家做詳細(xì)介紹,感興趣的小伙伴請(qǐng)和小編一起來學(xué)習(xí)吧

后端路由:

URL 的請(qǐng)求地址與服務(wù)器上的資源對(duì)應(yīng),根據(jù)不同的請(qǐng)求地址返回不同的資源。

前端路由:

在單頁面應(yīng)用中,根據(jù)用戶觸發(fā)的事件,改變URL在不刷新頁面的前提下,改變顯示內(nèi)容。

1、前端路由實(shí)現(xiàn)原理

URL 的 hash 模式

改變 hash 值的時(shí)候,#是一個(gè)位置標(biāo)識(shí)符,可以進(jìn)行頁面內(nèi)的位置跳轉(zhuǎn),并不會(huì)刷新頁面。

通過 location.hash 改變頁面的 hash 值,如:

我們發(fā)現(xiàn)頁面并不會(huì)刷新。

URL history 模式

history 模式,有 5 種改變 url 而不刷新頁面的方法,分別為:

  • history.pushState() //壓入棧
  • history.replaceState() // 替換當(dāng)前url,不能返回上一個(gè)頁面
  • history.back() //返回上一個(gè)頁面
  • history.go(n) //n的值可以是大于0的,表示向前幾個(gè),小于0時(shí),表示向后退幾個(gè)
  • history.forward() //向前一步

history.go(-1) 等價(jià)于 history.back()

history.go(1) 等價(jià)于 history.forward()

前端三大框架,都有自己的路由:

Angular ngRouter

React ReactRouter

Vue vue-Router

2、vue-Router 基本使用

2.1、安裝

npm install vue-router --save


使用 vue-router 的前提是 vue 必須使用

在 router 文件夾內(nèi) index.js 引入vue-router

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter) //引用 vue-router 插件

2.2、配置路由

//配置路由與組件之間的關(guān)系
const route=[
  {
      path: '/',
    // 當(dāng)訪問 '/'的時(shí)候 路由重定向 到新的地址 '/home'
    redirect: '/home',
  },
  {
     path: '/home',
     component: home,
   },
   {
     path: '/login',
     component: login,
    },
]
 


2.3、實(shí)例化

const router = new VueRouter({
  mode: "history", //設(shè)置模式
  routes
});
 

2.4、掛載路由

main.js 中,vue 實(shí)例化中,把 router 掛載的 vue 上。

let app = new Vue({
 el:'#app',
  data:{},
  // 掛載到vue上面
  router,
})
 

2.5、頁面上添加 router-link 和 router-view

<!-- 添加路由 -->
<router-link to="/home">首頁</router-link>
<router-link to="/about">關(guān)于</router-link>

<!-- 展示路由內(nèi)容 -->
<router-view />

router-link 默認(rèn)會(huì)被渲染成 a 標(biāo)簽,如:

<router-link to="/home">首頁</router-link>
// 渲染成
<a href="#/home" rel="external nofollow" >首頁</a>


router-view 是用來占位的,將路由對(duì)應(yīng)的組件展示到該位置。

3、router 的模式

路由模式有兩種:hash history 模式。

3.1、hash 模式

vue-router 默認(rèn)使用的是 hash 模式。

hash 的 url 中錨點(diǎn)就是 #xx 號(hào)后的內(nèi)容,通過錨點(diǎn)作為路由地址,我們通常改變的是#號(hào)后的內(nèi)容,實(shí)現(xiàn)瀏覽器渲染指定的組件,錨點(diǎn)發(fā)生改變會(huì)觸發(fā) onhashchange 事件。

3.2、history 模式

history就是正常的 url,沒有#號(hào),使用的時(shí)候需要服務(wù)器進(jìn)行配置。history模式下,對(duì)應(yīng)的方法與上述 5 個(gè)方法是一樣的。

vue-router 中可以指定需要的模式:

const router = new VueRouter({
 mode:'history'
})

4、router-link的屬性

router-link 默認(rèn)會(huì)渲染成 a 標(biāo)簽,但是有時(shí)候你想渲染成別的標(biāo)簽也是可以的。

4.1、tag 屬性

tag屬性是用來設(shè)置 router-link 標(biāo)簽渲染類型的,如我們想把 router-link 渲染成 button,如:

<router-link to="/home" tag="button">首頁</router-link>


查看渲染后的元素,發(fā)現(xiàn)變成 button 標(biāo)簽了,對(duì)應(yīng)的 to 添加的屬性值就會(huì)失效。此時(shí)點(diǎn)擊無法跳轉(zhuǎn)到對(duì)應(yīng)內(nèi)容,可繼續(xù)閱讀下邊跳轉(zhuǎn)方式。

除了 button ,tag 的屬性值還可以是其他任意標(biāo)簽,router-link 自動(dòng)渲染成對(duì)應(yīng)的標(biāo)簽。

4.2、replace 屬性

replace與上邊 history 模式中的 replaceState 對(duì)應(yīng),跳轉(zhuǎn)的時(shí)候不會(huì)留下 history 記錄,指定replace 的情況下,不能返回上一頁。

<router-link to="/home" replace>首頁</router-link>

4.3、active-class

active-class 設(shè)置 router-link 點(diǎn)擊當(dāng)前選中的類名,默認(rèn)情況下類名為:router-link-active

<a href="#/" rel="external nofollow"  
 aria-current="page" 
 class="router-link-exact-active router-link-active">
 首頁
</a>


設(shè)置當(dāng)前元素樣式需要設(shè)置到:router-link-active。

設(shè)置 active-class ,如:

<router-link to="/" active-class="active">首頁</router-link>
// router-link-active 類名會(huì)被替換成 active


如果需要把全局的 router-link 的選擇類名都修改成自定義的,一個(gè)一個(gè)單獨(dú)設(shè)置工作量太大,可以在 router 中統(tǒng)一設(shè)置。

const router=new VueRouter({
 routes,
 mode: 'hash',
  linkActiveClasss: 'active' //統(tǒng)一設(shè)置類名
})

5、vue-Rrouter 頁面跳轉(zhuǎn)方式

5.1、router-link 實(shí)現(xiàn)

// 簡(jiǎn)單寫法
<router-link to="/">首頁</router-link>

//使用動(dòng)態(tài)的path
<router-link :to="{ path : '/' }"></router-link>
可以使用path 也可以使用name

//帶傳參跳轉(zhuǎn)1
<router-link :to="
{ name:'home', params:{ id:'123' , name:'gq' }}
">
</router-link>

//帶傳參跳轉(zhuǎn)
<router-link :to="
{ path:'/', query:{ id:'123' , name:'gq' }}
">
</router-link>
 

5.2、通過 js 實(shí)現(xiàn)跳轉(zhuǎn)

// 簡(jiǎn)單寫法
this.$router.push({ path:'/' })
// push 與history.pushState 一樣

//帶參跳轉(zhuǎn)
this.$router.push({
 name: 'home' , params: { id:'123' , name:'gq' }
})

//帶多種參數(shù)
this.$router.push({
 name: 'home' , 
 params: { id:'123' , name:'gq' },
 query: { plan:'private' }
})

6、動(dòng)態(tài)路由

在某些情況下,一個(gè)頁面的 path 路徑可能是不確定的,如:希望的路徑為 /user/123/user/456 。后邊的值為用戶 id 或其他值。

配置路由

routers:[
 {
     path: '/user/:id',
   component:()=>{ import('../views/user.vue') }
 }
]
 

添加路由

<router-link to="/user/123"> user:123 </router-link>
<router-link to="/user/456"> user:456 </router-link>

 
//動(dòng)態(tài)設(shè)置后邊id值
<router-link :to=" '/user/'+id "> user:{{ id }} </router-link>

獲取后邊動(dòng)態(tài)值

this.$route.params.id 


此處的 id 是配置路由處設(shè)置的 id ,只要保持一致就可以了

方式二:使用 query 進(jìn)行傳參

<router-link to="/user?id=123"></router-link>

//取值時(shí)
this.$route.query.id

另外,this.$router.addRoutes([]) 也可以添加動(dòng)態(tài)路由,里面?zhèn)鞯氖且粋€(gè)數(shù)組,與 routes 配置一樣。

7、路由的懶加載

懶加載通俗的講就是使用的時(shí)候再加載,不使用的時(shí)候不加載。

打包構(gòu)建應(yīng)用程序的時(shí)候,js包會(huì)變得很大,影響加載速度,如果我們能把不同路由對(duì)應(yīng)的組件分割成不同的代碼塊,然后訪問路由的時(shí)候才加載對(duì)應(yīng)的組件,這樣就更加高效了。

路由懶加載到底做了什么呢?主要作用就是將路由對(duì)應(yīng)的組件打包成一個(gè)js代碼塊,只有路由訪問的時(shí)候,才加載對(duì)應(yīng)的 js 。

//直接引用的
import Home from './component/home'
const routes = [
 {
  path:'/home',
  component:Home
 }
]

//懶加載
const routes = [
 {
  path:'/home',
  component:()=>{ import('./component/home') }
 }
]

8、嵌套路由

實(shí)際應(yīng)用中,通常由多層嵌套的組件組合而成。

實(shí)現(xiàn)步驟:

第一:創(chuàng)建對(duì)應(yīng)的子組件,并且在路由映射中配置對(duì)應(yīng)的子路由。

第二:組件內(nèi)部使用 router-view 標(biāo)簽

{
 path: "/body",
 component: ()=> import( "../components/bodyLayout.vue"),,
 children:[
  {
   path: "manager",
   component: ()=> import( "../components/blankView.vue"),
   children:[
    {
      path: "user",
      component: ()=> import( "../views/manager/user.vue")
     },
    ]
   },
  ]
}

訪問 user 組件時(shí),路由為:/body/manager/user

注意:嵌套路由設(shè)置 path 時(shí),不能添加 “/”,否則路由就變了。

{
 path: "/user",
 component: ()=> import( "../views/manager/user.vue")
}
//此時(shí)訪問路由就變成了 " /user "
 

9、router 與 route 區(qū)別

試著在main.js 打印 router 在任意組件內(nèi)打印 this.$router,打印結(jié)果如圖:

我們發(fā)現(xiàn)兩個(gè)結(jié)果是一模一樣的。這樣我們就不難理解下面的意思了。

router VueRouter 實(shí)例,擁有自己的方法,如:使用 new VueRouter創(chuàng)建的實(shí)例,想要導(dǎo)航到不同url,可以使用 router.push ,跳轉(zhuǎn)方式中有介紹。

route 為當(dāng)前活躍狀態(tài)路由對(duì)象,有當(dāng)前路由的信息,可以通過該對(duì)象,獲取 pathparams參數(shù)、query參數(shù)、namematched、hash

10、路由守衛(wèi)

為什么使用導(dǎo)航守衛(wèi)?我們來考慮一個(gè)需求:在 SPA應(yīng)用中,網(wǎng)頁標(biāo)題跟著頁面切換如何變動(dòng)?

// 在對(duì)應(yīng)的組件內(nèi)添加
created(){
 document.title="測(cè)試"
}

訪問該組件時(shí),標(biāo)題自動(dòng)切換為 ”測(cè)試“

如果使用上述方法,那么對(duì)應(yīng)已開發(fā)的組件有多少個(gè),我們就得添加多少次,實(shí)在是太麻煩了,所以我們要借助路由守衛(wèi),統(tǒng)一修改,也便于維護(hù)。

10.1、全局守衛(wèi)

1>、使用 router.beforeEach 注冊(cè)一個(gè)全局前置守衛(wèi),只要路由變動(dòng)時(shí),都會(huì)經(jīng)過它。beforeEach 接收的參數(shù)是一個(gè)函數(shù),包含的參數(shù)有三個(gè)。

router.beforeEach((to,from,next)=>{
// 路由從 from 跳轉(zhuǎn)到 to 
// 我們只需要在路由上增加一個(gè) name屬性就可以了
 document.title = from.name
 next()
})

注意:上述三個(gè)參數(shù)順序不能改變。next 不能丟,必須添加,否則頁面跳轉(zhuǎn)的時(shí)候沒法到下一步,卡在空白區(qū)域。

2>、使用 router.afterEach 注冊(cè)一個(gè)全局后置守衛(wèi)。

router.afterEach((to,from)=>{
 console.log('后置守衛(wèi)')
})


這兩個(gè)守衛(wèi)都是全局守衛(wèi),afterEach 是在路由跳轉(zhuǎn)完成才執(zhí)行的,所以不需要 next 。參數(shù)只有兩個(gè)。

10.2、路由獨(dú)享守衛(wèi)

路由配置上直接定義的守衛(wèi),用法與全局守衛(wèi)一致,只是將其放在其中一個(gè)路由對(duì)象中,只有這個(gè)路由下起作用。

{
 path: "/test",
 name: "測(cè)試",
 component: ()=> import( "../views/manager/test.vue"),
 beforeEnter:(to,from,next)=>{
  console.log('test進(jìn)入前')
  next()
 }
}

這些守衛(wèi)與全局前置守衛(wèi)的方法參數(shù)是一樣的。

10.3、組件內(nèi)守衛(wèi)

可以在路由組件內(nèi)直接定義路由導(dǎo)航守衛(wèi),定義在組件內(nèi)的就是組件內(nèi)守衛(wèi)。

const Foo = {
  template: `...`,
  beforeRouteEnter(to, from, next) {
    // 在渲染該組件的對(duì)應(yīng)路由被 confirm 前調(diào)用
    // 不!能!獲取組件實(shí)例 `this`
    // 因?yàn)楫?dāng)守衛(wèi)執(zhí)行前,組件實(shí)例還沒被創(chuàng)建
  },
  beforeRouteUpdate(to, from, next) {
    // 在當(dāng)前路由改變,但是該組件被復(fù)用時(shí)調(diào)用
    // 舉例來說,對(duì)于一個(gè)帶有動(dòng)態(tài)參數(shù)的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉(zhuǎn)的時(shí)候,
    // 由于會(huì)渲染同樣的 Foo 組件,因此組件實(shí)例會(huì)被復(fù)用。而這個(gè)鉤子就會(huì)在這個(gè)情況下被調(diào)用。
    // 可以訪問組件實(shí)例 `this`
  },
  beforeRouteLeave(to, from, next) {
    // 導(dǎo)航離開該組件的對(duì)應(yīng)路由時(shí)調(diào)用
    // 可以訪問組件實(shí)例 `this`
  }
}

 注意:beforeRouteLeave 離開路由時(shí)執(zhí)行,必須添加 next,否則無法正常跳轉(zhuǎn)到下一個(gè)路由。

11、keep-alive

切換路由的時(shí)候頁面每次都會(huì)重新渲染,我們有的組件會(huì)存在一些數(shù)據(jù)需要保留,不希望來回切換時(shí)每次都重新渲染,所以就使用 keep-alive 包裹組件,這樣只有第一次執(zhí)行加載時(shí)會(huì)執(zhí)行 created mounted 等鉤子函數(shù)。

keep-alive Vue 內(nèi)置的一個(gè)組件,可以使被包含的組件保留狀態(tài),或避免重新渲染。

<div id="app">
 <router-link to="/home">home</router-link>
 <router-link to="/login">login</router-link>
 <keep-alive>
  <router-view></router-view>
 </keep-alive>
</div>

添加 keep-alive 組件,切換的時(shí)候,組件只會(huì)在第一次的時(shí)候渲染組件,之后進(jìn)入不會(huì)重新渲染。

11.1、keep-alive 特定方法

activated(){
 console.log('activated')
},
deactivated(){
 console.log("deactivated")
}

這兩個(gè)函數(shù),只有組件被保持了狀態(tài),使用keep-alive時(shí),才是有效會(huì)執(zhí)行的。

keep-alive生命周期執(zhí)行順序:

created -> mounted -> activated

deactivated 在退出后才會(huì)觸發(fā)

11.2、keep-alive 屬性

keep-alive 有兩個(gè)非常重要的屬性:

include - 字符串或正則表達(dá)式,只有匹配組件的時(shí)候才會(huì)被緩存

exclude - 字符串或正則表達(dá)式,任何匹配的組件都不會(huì)被緩存

<keep-alive include="test">
 <router-view></router-view>
</keep-alive>

//test組件 添加name屬性
<template>
  <div>
    test
  </div>
</template>
<script>
 export default {
  name:'test'
 }
<script>

此時(shí)只有 test 組件會(huì)被緩存,其他任意組件都不會(huì)緩存。

如果還有其他組件同時(shí)需要被緩存,include可添加多個(gè)值,只用逗號(hào)隔開,但不能添加空格。

<keep-alive include="test,user">
 <router-view></router-view>
</keep-alive>
 

exclude的使用:

<keep-alive exclude="test,user">
 <router-view></router-view>
</keep-alive>


正好與上實(shí)例相反,只有 test,user 兩個(gè)組件不被緩存,其他的被緩存。

到此這篇關(guān)于 vue-Router安裝原理詳細(xì)過程的文章就介紹到這了,更多相關(guān) vue-Router內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue?proxytable代理根路徑的同時(shí)增加其他代理方式

    vue?proxytable代理根路徑的同時(shí)增加其他代理方式

    這篇文章主要介紹了vue?proxytable代理根路徑的同時(shí)增加其他代理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 對(duì)Vue.js之事件的綁定(v-on: 或者 @ )詳解

    對(duì)Vue.js之事件的綁定(v-on: 或者 @ )詳解

    今天小編就為大家分享一篇對(duì)Vue.js之事件的綁定(v-on: 或者 @ )詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue中的請(qǐng)求攔截器和響應(yīng)攔截器用法及說明

    Vue中的請(qǐng)求攔截器和響應(yīng)攔截器用法及說明

    這篇文章主要介紹了Vue中的請(qǐng)求攔截器和響應(yīng)攔截器用法及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 淺談vux之x-input使用以及源碼解讀

    淺談vux之x-input使用以及源碼解讀

    這篇文章主要介紹了淺談vux之x-input使用以及源碼解讀,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • 使用vue實(shí)現(xiàn)加載頁

    使用vue實(shí)現(xiàn)加載頁

    這篇文章主要為大家詳細(xì)介紹了使用vue實(shí)現(xiàn)加載頁,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Vue 自定義標(biāo)簽的src屬性不能使用相對(duì)路徑的解決

    Vue 自定義標(biāo)簽的src屬性不能使用相對(duì)路徑的解決

    這篇文章主要介紹了Vue 自定義標(biāo)簽的src屬性不能使用相對(duì)路徑的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • vue動(dòng)態(tài)繪制四分之三圓環(huán)圖效果

    vue動(dòng)態(tài)繪制四分之三圓環(huán)圖效果

    這篇文章主要介紹了vue動(dòng)態(tài)繪制四分之三圓環(huán)圖效果,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳細(xì)聊聊vue中組件的props屬性

    詳細(xì)聊聊vue中組件的props屬性

    父子組件之間的通信就是props down,events up,父組件通過屬性props向下傳遞數(shù)據(jù)給子組件,子組件通過事件events 給父組件發(fā)送消息,這篇文章主要給大家介紹了關(guān)于vue中組件的props屬性的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Vue通過路由實(shí)現(xiàn)頁面間參數(shù)的傳遞

    Vue通過路由實(shí)現(xiàn)頁面間參數(shù)的傳遞

    這篇文章主要介紹了Vue通過路由實(shí)現(xiàn)頁面間參數(shù)的傳遞,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • vue3 :deep()的使用教程

    vue3 :deep()的使用教程

    對(duì)應(yīng)前端小白來說,一看到:deep()這些模式的用法就不理解是啥意思,下面簡(jiǎn)單介紹一下:deep()是什么以及如何使用,感興趣的朋友跟隨小編一起看看吧
    2023-10-10

最新評(píng)論

浪卡子县| 内丘县| 贵阳市| 藁城市| 蓬安县| 双鸭山市| 保定市| 合山市| 永登县| 舞钢市| 丹江口市| 凤阳县| 本溪市| 珲春市| 西充县| 沈阳市| 邹城市| 固始县| 黔江区| 抚州市| 精河县| 绵竹市| 宝兴县| 佛山市| 确山县| 南宫市| 桓仁| 赤峰市| 霸州市| 兴化市| 尉犁县| 龙山县| 正镶白旗| 贞丰县| 邵武市| 宁安市| 永德县| 凌源市| 民乐县| 安福县| 陇川县|