Vue Router路由

路由

  • 一個(gè)路由就是一組映射關(guān)系(key-value)key為路徑。在前端路由中,value是component,用于改變頁面展示內(nèi)容,當(dāng)瀏覽器路徑改變時(shí)對應(yīng)組件就會(huì)顯示;在后端路由中value是function,用于處理客戶端請求。

Vue-Router

vue的一個(gè)專門用來實(shí)現(xiàn)SPA應(yīng)用的插件庫。

單頁面web應(yīng)用SPA single page web application

整個(gè)應(yīng)用只有一個(gè)完整頁面
點(diǎn)擊頁面中的導(dǎo)航鏈不會(huì)刷新頁面,只會(huì)做頁面的局部更新
數(shù)據(jù)需要通過Ajax請求獲取

路由實(shí)現(xiàn)

路由局部組件一般放在page文件夾中,配置的路由一般放置在routers文件夾中
通過切換隱藏路由組件,默認(rèn)是銷毀,需要是時(shí)候再進(jìn)行掛載
每個(gè)組件都有自己的$route屬性,來存放自己的路由信息
整個(gè)組件只有一個(gè)router,可以通過組件的$router屬性獲取到
$router是用來操作路由,$route是用來獲取路由信息
$router是VueRouter的一個(gè)實(shí)例,他包含了所有的路由,包括路由的跳轉(zhuǎn)方法,鉤子函數(shù)等,也包含一些子對象(例如history)
$route是一個(gè)跳轉(zhuǎn)的路由對象(路由信息對象),每一個(gè)路由都會(huì)有一個(gè)$route對象,是一個(gè)局部的對象。

  • 安裝vue-router
    vue2如果安裝路由插件要用npm install vue-router@3如果backage.json文件中有vue-router依賴說明安裝成功。
    backage.json文件vue-router依賴

-編寫router配置項(xiàng)
vue-router報(bào)錯(cuò)文件名后容易抽風(fēng),重新啟動(dòng)一下本地服務(wù)器就好了

import VueRouter from 'vue-router'//引入vuerouter
import 路由組件 from '地址'
//創(chuàng)建router實(shí)例,管理路由規(guī)則
const router =new VueRouter({
  routers:[
    {
      path:'組件地址',
      component:組件聲名
    },
    {
      path:'組件地址',
      component:組件聲名
    }
  ]
})
//暴露router
export default router
  • 聲明式路由導(dǎo)航:實(shí)現(xiàn)路由切換用router-link標(biāo)簽,to屬性為目標(biāo)地址
  • 指定展示位,router-view標(biāo)簽

children 多級路由

routers:[
  {
    path:'組件地址',
    component:組件聲名,
  },
  {
    path:'組件地址',
    component:組件地址,
    children:[
    {
      path:'二級組件地址',//此處寫地址不要帶斜杠
      component:二級組件聲名,
     },
    ]
  }
]

跳轉(zhuǎn),要寫完整路徑
<ronuter-link to='/一級路由組件/二級路由組件'><router-link/>

query參數(shù)

傳遞參數(shù)

<router-link
  :to="{
    path:'路由組件地址',
    query:{
      id:m.id,
      title:m.title
    }
  }"
>
<router-link/>

接收參數(shù),query參數(shù)可以不再路由中配置直接調(diào)用

$route.query.id
$route.query.tilte

命名路由

命名路由可以簡化路由跳轉(zhuǎn),在路由規(guī)則中配置name屬性給路由命名。
簡化后,在router-link標(biāo)簽的to屬性中使用對象寫法直接賦值{name:'路由名'}。

Params參數(shù)

在routers實(shí)例中,配置路由規(guī)則,聲明接受params參數(shù)。

{
path:'地址',
component:組件聲明,
  children:[
  mame:'路由命名',
  path:'地址/:屬性名/:屬性名?'//使用占位符聲明接受params參數(shù),在值后加上問號,可以保證不傳值的情況下,URL不會(huì)出現(xiàn)問題
  component:組件聲明
  ]
}
  • 參數(shù)傳遞
    路由攜帶params參數(shù)時(shí),若使用to的對象寫法,則不能使用path配置項(xiàng),必須使用name配置項(xiàng)
<router-link
  :to='{
    name:'路由名',
    params:{
      屬性名:屬性值,
    }
  }'
>
</router-link>
  • 接受參數(shù)
    $route.params.屬性名

路由傳參兩種方法,query和params配置項(xiàng)區(qū)別
query使用path傳參,params使用name傳參。
路由傳參三種寫法:


字符串 模板字符串 對象

路由props配置

props值為函數(shù),接受params屬性,該函數(shù)return返回的對象中沒一組key-value都會(huì)通過props傳給該路由組件

前端路由ky鍵值對應(yīng):key,URL,地址欄中的路徑;value,相應(yīng)的路由組件。

路由跳轉(zhuǎn) replace方法

replace控制路由跳轉(zhuǎn)時(shí)操作瀏覽器歷史紀(jì)錄和模式
瀏覽器的歷史紀(jì)錄有兩種寫入方法:push和replace
push是追加歷史紀(jì)錄;replace是替換當(dāng)前記錄,路由跳轉(zhuǎn)時(shí)默認(rèn)為push方法。
<router-link :replace='true'></router-link>簡寫<router-link replace></router-link>

瀏覽記錄本質(zhì)是一個(gè)棧,默認(rèn)為push,點(diǎn)開新頁面就會(huì)在棧頂追加一個(gè)地址,后退,棧頂指針向下移動(dòng),改為replace就是不追加,將棧頂?shù)刂诽鎿Q。

編程式路由導(dǎo)航

路由跳轉(zhuǎn)兩種方式:

聲明式導(dǎo)航,利用router-link標(biāo)簽to屬性實(shí)現(xiàn)路由跳轉(zhuǎn)
編程式導(dǎo)航,利用$router.push||replece方法實(shí)現(xiàn)路由跳轉(zhuǎn)

不借助router-link標(biāo)簽實(shí)現(xiàn)路由跳轉(zhuǎn),讓路由更加靈活
在輸入類標(biāo)簽中綁定一個(gè)路由跳轉(zhuǎn)事件,在methods實(shí)例中聲明該事件,在路由跳轉(zhuǎn)函數(shù)中配置路由地址和傳遞參數(shù)

this.$router.push({})//和to屬性相同
this.$router.replace({})
this.$router.forward()//前進(jìn)
this.$router.back()//后退
this.$router.go(n)//n為正數(shù)前進(jìn),n為負(fù)數(shù)后退
編程式導(dǎo)航跳轉(zhuǎn)到當(dāng)前路由,參數(shù)不變,多次執(zhí)行會(huì)拋出Navigation Duplicated的錯(cuò)誤警告。

原因:push方法是一個(gè)promise,promise需要傳遞成功和失敗兩個(gè)參數(shù),聲明式導(dǎo)航在底層已經(jīng)寫好。
方法:push是VueRouter.Prototype的一個(gè)方法,在router中的index中重寫即可。

//1、先把VueRouter原型對象的push,保存一份
let originPush = VueRouter.prototype.push;
//2、重寫push|replace
//第一個(gè)參數(shù):告訴原來的push,跳轉(zhuǎn)的目標(biāo)位置和傳遞了哪些參數(shù)
VueRouter.prototype.push = function (location,resolve,reject){
    if(resolve && reject){//判斷是否帶有傳遞狀態(tài)的參數(shù)
        originPush.call(this,location,resolve,reject)
    }else{
        originPush.call(this,location,() => {},() => {})//后面兩項(xiàng)分別代表執(zhí)行成功和失敗的回調(diào)函數(shù)
    }
}

路由守衛(wèi)

對路由進(jìn)行權(quán)限控制
全局路由守衛(wèi)聲明在index文件中;獨(dú)享路由守衛(wèi)聲明在router實(shí)例路由規(guī)則中;組件內(nèi)路由聲明在路由組件中

router.beforeEach((to,from,next)=>{
  if(to.meta.isAuth)//判讀當(dāng)前路由是否需要權(quán)限控制
    if(){next()//放行}//權(quán)限控制具體規(guī)則
    else{console.log('無權(quán)限')}
nex()//不需要路由規(guī)則放行
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容