vue路由

vueRouter是基于vue的前端路由庫(kù)(設(shè)計(jì)成了 vue的插件)
讓前端實(shí)現(xiàn)SPA(single page application)單頁(yè)面應(yīng)用

spa優(yōu)點(diǎn):切換速度快 (加載速度快)

缺點(diǎn): 前端渲染 (nuxt 解決seo問(wèn)題)
seo 搜索引擎優(yōu)化 爬蟲(chóng)
不利于seo

npm 安裝:

cnpm i vue-router

模塊化工程中使用

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'

Vue.use(VueRouter)

頁(yè)面首先會(huì)加載,全局唯一一個(gè)html

引入

<script src="vue.js">
后面引入vue-router
<script src="vue-router.js">

定義 路由組件

    const Home = {
      template:`
        <div>
          <h1>home頁(yè)</h1>
        </div>
      `
    }
    const News = {
      template:`
        <div>
          <h1>新聞頁(yè)</h1>
        </div>
      `
    }

創(chuàng)建路由對(duì)象,

routes規(guī)則在外部定義,有哪些路由,路由對(duì)應(yīng)的組件是什么


    const routes = [ // 路由規(guī)則
      {
        path: '/home',
        component: Home
      },
      {
        path: '/news',
        component: News
      }
    ]
    // 創(chuàng)建路由對(duì)象
    const router = new VueRouter({
      routes
    })

在實(shí)例上增加router屬性

    const vm = new Vue({
      el:"xxx",
      router
    })

在模板上 需要 新增出口(占位)

在路由匹配到某個(gè)組件時(shí),組件在router-view位置渲染

<router-view /> 

router-link組件做路由跳轉(zhuǎn)

to定義跳轉(zhuǎn)path,tag定義渲染的標(biāo)簽

在匹配的router-link中會(huì)自定加入 router-link-active 高亮類(lèi)

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

解決 /路由默認(rèn)顯示 某個(gè)組件問(wèn)題

1,新增路由規(guī)則

  {
    path: '/',
    component: Home
  }

2,重定向 推薦

當(dāng)用戶(hù)訪問(wèn) /a時(shí),URL 將會(huì)被替換成 /b,然后匹配路由為 /b

 可以使home router-link 高亮
  {
    path: '/',
    redirect: '/home' // 當(dāng)?shù)刂窞?/ 會(huì)自動(dòng)變成/home
  }

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

當(dāng)vue-router引入時(shí),

如果是直接script src引入的話(huà),

自動(dòng)往構(gòu)造函數(shù)以及原型中添加一個(gè)屬性$route保存了當(dāng)前路由的基礎(chǔ)信息,

所有組件就可以直接通過(guò) this.$route獲取當(dāng)前路由基礎(chǔ)信息

定義動(dòng)態(tài)路由:

  routes = [
    {
      path:"/detail/:id", //定義一個(gè)動(dòng)態(tài)路由 定義了一個(gè)變量是id
      component: Detail
    }
  ]

跳轉(zhuǎn):

此時(shí) 2 是 動(dòng)態(tài)路由定義的 變量id 的值

  router-link to="/detail/2" 

獲?。簍his.$route.params.定義變量名,獲取動(dòng)態(tài)路由傳的參數(shù)

// path 
{
  path:"/a/:b/c/:d"
}
跳轉(zhuǎn)路徑:  /a/b/c/d
            /a/2/3/e 路徑是錯(cuò)誤的
結(jié)果:
  this.$route.params
        {
          b:"b",
          d:"d"
        }

動(dòng)態(tài)路由監(jiān)聽(tīng)路由參數(shù)(動(dòng)態(tài)路由傳的動(dòng)態(tài)的值)的變化

 watch:{
        "$route"(to, from){ // to去哪 from 從哪來(lái)
          console.log('變化了')
          console.log(to,from)
        }
      }

解決404

{
  path:"*", // *匹配任意路由  盡量將404頁(yè)面 路由規(guī)則放到最后
  component: NoutFound
}

嵌套路由

一級(jí)路由中 在路由組件中 還可以顯示 (根據(jù)路由的變化 父級(jí)組件)顯示不同子級(jí)的組件

  const routes = [
    {
      path: '/news',
      component: News,
      children: [ // 在父級(jí)路由規(guī)則中新增 children,在屬性中定義二級(jí)路由
        {
          path: '/news/native', // 建議二級(jí)路由path 攜帶一級(jí)路由的path作為前綴
          component: Native
        },
        {
          path:"/news/abroad",
          component: Abroad
        }
      ],
    }
  ]

  // 在一級(jí)路由 對(duì)于的 組件中 新增router-view 作為二級(jí)路由 出口(占位)
  const News = {
    template:` 
      <div>
        <h1>news組件</h1>
        <router-view/> 
      </div>
    ` 
  }

  <route-view />

命名路由

給每個(gè)路由規(guī)則新增name屬性,相當(dāng)于給每個(gè)路由起個(gè)名字

routes = [
  {
    path:'/home',
    name:'首頁(yè)', //給這個(gè)路由新增name屬性
    component:xxx
  }
]

編程式導(dǎo)航

聲明式導(dǎo)航:利用組件跳轉(zhuǎn)路由(router-link)

編程式導(dǎo)航:js內(nèi)部通過(guò)方法來(lái)控制路由跳轉(zhuǎn)

跳轉(zhuǎn)路由的參數(shù)同router-link的to屬性
跳轉(zhuǎn)路由 并往歷史記錄中添加一條新的記錄

this.$router.push() 

跳轉(zhuǎn)路由 參數(shù)同router-link 的to 屬性

跳轉(zhuǎn)路由,不添加新記錄 而是 覆蓋當(dāng)前的記錄

this.$router.replace() 

跳轉(zhuǎn)路由

this.$router.go(n)
            0  //刷新
            -1  //回退一步
            1 // 前進(jìn)一步
            n // 前進(jìn)n步

別名

/a 的別名是 /b,意味著,當(dāng)用戶(hù)訪問(wèn) /b 時(shí),URL 會(huì)保持為 /b,但是路由匹配則為 /a,就像用戶(hù)訪問(wèn) /a 一樣。

const router = new VueRouter({
  routes: [
    { path: '/a', component: A, alias: '/b' }
  ]
})

路由組件傳參

  • 動(dòng)態(tài)路由傳參
{
  path:"/news/:id"
  component:News
}
// 跳轉(zhuǎn)時(shí)
<router-link to="/news/2">
// 獲取
this.$route.params.id
  • params傳參

1,直接寫(xiě)字符串這種情況必須寫(xiě)path

router-link to="/news" 
this.$router.push("/news")

2,參數(shù)可以是對(duì)象

router-link :to="{name:'home'}" 可以以名字跳轉(zhuǎn)

params傳參

1,聲明式導(dǎo)航

<router-link :to="{name:'news',params:{a:10,b:20}}">

2,編程式導(dǎo)航

this.$router.push({name:'news',params:{a:10,b:20}})

獲?。?/p>

  this.$route.params.xxx

注意:
params傳參 必須結(jié)合命名路由一起使用

跳轉(zhuǎn)時(shí),必須要通過(guò)name跳轉(zhuǎn),否則傳不過(guò)去

params傳參的優(yōu)點(diǎn):隱式傳參 地址欄看不見(jiàn)

缺點(diǎn):刷新后數(shù)據(jù)會(huì)丟失
  • query傳參
router-link
      :to="{path:'/news',query:{a:10,b:20}}"

this.$router.push({
  path:'/news',
  query:{
    a:10,
    b:20
  }
})

獲取

this.$route.query.xxx
優(yōu)點(diǎn):刷新后 數(shù)據(jù)不丟失
缺點(diǎn):參數(shù)放在地址欄上
query最好結(jié)合path 盡量不結(jié)合name

路由模式

1,hash模式

原理:利用瀏覽器的url 的hash值得變化(url加hash值 #/home)

利用 window.onhashchange 當(dāng)?shù)刂窓诘膆ash值改變時(shí)觸發(fā)

優(yōu)勢(shì):地址欄的 路徑指向不會(huì)改變

缺點(diǎn):丑

2,history模式

/home #/news 變成 xxx/home xxx/news

原理:h5新增的api history pushState方法和replaceState()方法

優(yōu)點(diǎn):好看 沒(méi)有#

缺點(diǎn):/寫(xiě)在最前面 代表根路徑,在本地和瀏覽器運(yùn)行不一樣

導(dǎo)航守衛(wèi) 、 導(dǎo)航鉤子函數(shù)

監(jiān)聽(tīng)甚至攔截路由變化

  • 全局守衛(wèi) (攔截所有的路由)
// 全局前置 守衛(wèi)
router.beforeEach((to,from,next)=>{
  // to 目標(biāo)路由 
  // from 從哪來(lái)路由
  // next 攔截器 不調(diào)用next()路由無(wú)法進(jìn)入,next參數(shù)同router-link to屬性的值,重定向地址
  next()
})
  • 路由獨(dú)享的 (定義在路由規(guī)則中,只攔截這個(gè)路由)
  • 組件內(nèi)部
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 前沿: vue-router的路由跳轉(zhuǎn)時(shí)傳遞參數(shù)有兩種方式,: 一種是路由參數(shù), 通過(guò)定義動(dòng)態(tài)路由傳遞參數(shù) 另一種...
    時(shí)光如劍閱讀 882評(píng)論 2 12
  • 路由 路由起步 監(jiān)聽(tīng)地址欄的改變.根據(jù)改變渲染不同的組件 基本使用下載安裝路由 npm install vue-r...
    jie_han閱讀 286評(píng)論 0 0
  • 1.mvvm 框架是什么? 定義:M:Model(服務(wù)器上的業(yè)務(wù)邏輯操作) V:View(頁(yè)面)VM:ViewMo...
    走的是前方的路_端的是生活的苦閱讀 14,964評(píng)論 0 3
  • https://router.vuejs.org/zh/ 1.使用路由vue-router 1.安裝npm ins...
    GaoXiaoGao閱讀 377評(píng)論 0 0
  • 什么是路由 對(duì)于普通的網(wǎng)站,所有的超鏈接都是URL地址,所有的URL地址都對(duì)應(yīng)服務(wù)器上對(duì)應(yīng)的資源; 對(duì)于單頁(yè)面應(yīng)用...
    wanminglei閱讀 316評(píng)論 0 0

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