首頁 web前端 js教程 關於vue路由的使用解析

關於vue路由的使用解析

Jun 29, 2018 am 11:44 AM
vue 路由 路由使用

這篇文章主要介紹了關於vue路由的使用解析,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

vue-router是Vue.js官方的路由插件,它和vue.js是深度整合的,適合用於建立單頁面應用程式。

vue-router是Vue.js官方的路由插件,它和vue.js是深度整合的,適合用來建立單一頁面應用程式。 vue的單一頁面應用程式是基於路由和元件的,路由用於設定存取路徑,並將路徑和元件對應起來。傳統的頁面應用,是用一些超連結來實現頁面切換和跳轉的。在vue-router單一頁面應用程式中,則是路徑之間的切換,也就是元件的切換。

本文將以範例的形式來介紹vue-router的各個特性,總共包含6個範例,每個範例都有乞丐版,前5個範例有皇帝版。
乞丐版是將所有程式碼混雜在一起的HTML頁面,皇帝版是基於vue-webpack-simple模板建構的。

第一個單一頁面應用程式(01)

現在我們以一個簡單的單一頁面應用程式開啟vue-router之旅,這個單一頁面應用程式有兩個路徑:/home和/about,與這兩個路徑對應的是兩個元件Home和About。

1. 建立元件

#首先引入vue.js和vue-router.js:

<script src="js/vue.js"></script>
<script src="js/vue-router.js"></script>

然后创建两个组件构造器Home和About:
var Home = Vue.extend({
 template: &#39;<p><h1>Home</h1><p>{{msg}}</p></p>&#39;,
 data: function() {
 return {
  msg: &#39;Hello, vue router!&#39;
 }
 }
})

var About = Vue.extend({
 template: &#39;<p><h1>About</h1><p>This is the tutorial about vue-router.</p></p>&#39;
})
登入後複製

2. 建立Router

var router = new VueRouter()
登入後複製

呼叫建構器VueRouter,建立一個路由器實例router。

3. 映射路由

router.map({
 &#39;/home&#39;: { component: Home },
 &#39;/about&#39;: { component: About }
})
登入後複製

呼叫router的map方法映射路由,每個路由以key-value的形式存在,key是路徑,value是元件。

例如:'/home'是一條路由的key,它表示路徑;{component: Home}則表示該條路由對映的元件。

4. 使用v-link指令

<p class="list-group">
 <a class="list-group-item" v-link="{ path: &#39;/home&#39;}">Home</a>
 <a class="list-group-item" v-link="{ path: &#39;/about&#39;}">About</a>
</p>
登入後複製

在a元素上使用v-link指令跳到指定路徑。

5. 使用標籤

<router-view></router-view>
登入後複製

在頁面上使用<router-view></router-view>標籤,它用於渲染匹配的元件。

6. 啟動路由

var App = Vue.extend({})
router.start(App, &#39;#app&#39;)
登入後複製

路由器的運作需要一個根元件,router.start(App, '#app') 表示router會建立一個App實例,並且掛載到#app元素。

注意:使用vue-router的應用,不需要明確地建立Vue實例,而是呼叫start方法將根元件掛載到某個元素。

 當你從GitHub上取得到最新的原始碼後,如果想執行皇帝版,以demo01為例,在Git Bash下執行以下指令:

npm run demo01-dev
登入後複製

然後在瀏覽器中訪問地址http://127.0.0.1:8080

如果要編譯和發布,請在Git Bash下執行以下命令:

npm run demo01-build
登入後複製

編寫單一頁面的步驟

上面的6個步驟,可以說是建立一個單一頁面應用程式的基本步驟:

JavaScript

1.建立元件:建立單一頁面應用程式需要渲染的元件

2.建立路由:建立VueRouter實例

3.映射路由:呼叫VueRouter實例的map方法

4.啟動路由:呼叫VueRouter實例的start方法

#HTML

1.使用v-link指令

#2.使用標籤

router.redirect

應用程式在首次運行時右側是一片空白,應用程式通常都會有一個首頁,例如:Home頁。

使用router.redirect方法將根路徑重定向到/home路徑:

router.redirect({
 &#39;/&#39;: &#39;/home&#39;
})
登入後複製

router.redirect方法用於為路由器定義全域的重定向規則,全域的重定向會在符合目前路徑之前執行。

執行過程

當使用者點擊v-link指令元素時,我們可以大致猜想這中間發生了什麼事情:

  1. #vue-router首先會去找v-link指令的路由映射

  2. #然後根據路由映射找到匹配的元件

  3. 最後將元件渲染到標籤

#巢狀路由(02)

嵌套路由是個常見的需求,假設使用者能夠透過路徑/home/news和/home/message存取一些內容,一個路徑映射一個元件,存取這兩個路徑也會分別渲染兩個元件。

實作巢狀路由有兩個重點:

  1. #在元件內部使用標籤

  2. 在路由器对象中给组件定义子路由

现在我们就动手实现这个需求。

组件模板:




登入後複製

组件构造器:

var Home = Vue.extend({
 template: &#39;#home&#39;,
 data: function() {
 return {
  msg: &#39;Hello, vue router!&#39;
 }
 }
})

var News = Vue.extend({
 template: &#39;#news&#39;
})

var Message = Vue.extend({
 template: &#39;#message&#39;
})
登入後複製

路由映射:

router.map({
 &#39;/home&#39;: {
 component: Home,
 // 定义子路由
 subRoutes: {
  &#39;/news&#39;: {
  component: News
  },
  &#39;/message&#39;: {
  component: Message
  }
 }
 },
 &#39;/about&#39;: {
 component: About
 }
})
登入後複製

在/home路由下定义了一个subRoutes选项,/news和/message是两条子路由,它们分别表示路径/home/news和/home/message,这两条路由分别映射组件News和Message。

该示例运行如下:

注意:这里有一个概念要区分一下,/home/news和/home/message是/home路由的子路由,与之对应的News和Message组件并不是Home的子组件。

具名路径(03)

在有些情况下,给一条路径加上一个名字能够让我们更方便地进行路径的跳转,尤其是在路径较长的时候。

我们再追加一个组件NewsDetail,该组件在访问/home/news/detail路径时被渲染,组件模板:

<template id="newsDetail">
 <p>
 News Detail - {{$route.params.id}} ......
 </p>
</template>
登入後複製

组件构造器:

var NewsDetail = Vue.extend({
 template: &#39;#newsDetail&#39;
})
登入後複製

具名路由映射

router.map({
 &#39;/home&#39;: {
 component: Home,
 subRoutes: {
  &#39;/news&#39;: {
  name: &#39;news&#39;,
  component: News,
  subRoutes: {
   &#39;detail/:id&#39;: {
   name: &#39;detail&#39;,
   component: NewsDetail
   }
  }
  },
  &#39;/message&#39;: {
  component: Message
  }
 }
 },
 &#39;/about&#39;: {
 component: About
 }
})
登入後複製

注意:我们在定义/homes/news/和home/news/detail/:id路由时,给该路由指定了name属性。

/:id是路由参数,例如:如果要查看id = '01'的News详情,那么访问路径是/home/news/detail/01。

Home组件和News组件模板:

登入後複製
登入後複製

NewsNews 01这两行HTML代码,使用了用了具名路径。

该示例运行如下:

v-link指令

用了这么久的v-link指令,是该介绍一下它了。

v-link 是一个用来让用户在 vue-router 应用的不同路径间跳转的指令。该指令接受一个 JavaScript 表达式,并会在用户点击元素时用该表达式的值去调用 router.Go。

具体来讲,v-link有三种用法:

<!-- 字面量路径 -->
<a v-link="&#39;home&#39;">Home</a>

<!-- 效果同上 -->
<a v-link="{ path: &#39;home&#39; }">Home</a>

<!-- 具名路径 -->
<a v-link="{ name: &#39;detail&#39;, params: {id: &#39;01&#39;} }">Home</a>
登入後複製

v-link 会自动设置 的 href 属性,你无需使用href来处理浏览器的调整,原因如下:

它在 HTML5 history 模式和 hash 模式下的工作方式相同,所以如果你决定改变模式,或者 IE9 浏览器退化为 hash 模式时,都不需要做任何改变。

在 HTML5 history 模式下,v-link 会监听点击事件,防止浏览器尝试重新加载页面。

在 HTML5 history 模式下使用 root 选项时,不需要在 v-link 的 URL 中包含 root 路径。

路由对象(04)

在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route ,并且当路由切换时,路由对象会被更新。

路由对象暴露了以下属性:

$route.path

字符串,等于当前路由对象的路径,会被解析为绝对路径,如 "/home/news" 。

$route.params

对象,包含路由中的动态片段和全匹配片段的键值对

$route.query

对象,包含路由中查询参数的键值对。例如,对于 /home/news/detail/01?favorite=yes ,会得到$route.query.favorite == 'yes' 。

$route.router

路由规则所属的路由器(以及其所属的组件)。

$route.matched

数组,包含当前匹配的路径中所包含的所有片段所对应的配置参数对象。

$route.name

当前路径的名字,如果没有使用具名路径,则名字为空。

在页面上添加以下代码,可以显示这些路由对象的属性:

$route.path, $route.params, $route.name, $route.query这几个属性很容易理解,看示例就能知道它们代表的含义。

(由于$route.matched内容较长,所以没有将其显示在画面上)

这里我要稍微说一下$router.matched属性,它是一个包含性的匹配,它会将嵌套它的父路由都匹配出来。

例如,/home/news/detail/:id这条路径,它包含3条匹配的路由:

1./home/news/detail/:id

2./home/news

3./home

另外,带有 v-link 指令的元素,如果 v-link 对应的 URL 匹配当前的路径,该元素会被添加特定的class,该class的默认名称为v-link-active。例如,当我们访问/home/news/detail/03这个URL时,根据匹配规则,会有3个链接被添加v-link-active。

让链接处于活跃状态(05)

以上画面存在两个问题:

1.当用户点击Home链接或About链接后,链接没有显示为选中

2.当用户点击News或Message链接后,链接没有显示为选中

设置activeClass

第1个问题,可以通过设定v-link指令的activeClass解决。

设定了v-link指令的activeClass属性后,默认的v-link-active被新的class取代。

第2个问题,为v-link指令设定activeClass是不起作用的,因为我们使用的是bootstrap的样式,需要设置a标签的父元素

  • 才能让链接看起来处于选中状态,就像下面的代码所展现的:

    <ul class="nav nav-tabs">
     <li class="active">
     <a v-link="{ path: &#39;/home/news&#39;}">News</a>
     </li>
     <li>
     <a v-link="{ path: &#39;/home/message&#39;}">Messages</a>
     </li>
    </ul>
    登入後複製

    如何实现这个效果呢?你可能会想到,为Home组件的data选项追加一个currentPath属性,然后使用以下方式绑定class。

    <ul class="nav nav-tabs">
     <li :class="currentPath == &#39;/home/news&#39; ? &#39;active&#39;: &#39;&#39;">
     <a v-link="{ path: &#39;/home/news&#39;}">News</a>
     </li>
     <li :class="currentPath == &#39;/home/message&#39; ? &#39;active&#39;: &#39;&#39;">
     <a v-link="{ path: &#39;/home/message&#39;}">Messages</a>
     </li>
    </ul>
    登入後複製

    现在又出现了另一个问题,在什么情况下给currentPath赋值呢?

    用户点击v-link的元素时,是路由的切换。

    每个组件都有一个route选项,route选项有一系列钩子函数,在切换路由时会执行这些钩子函数。

    其中一个钩子函数是data钩子函数,它用于加载和设置组件的数据。

    var Home = Vue.extend({
     template: &#39;#home&#39;,
     data: function() {
     return {
      msg: &#39;Hello, vue router!&#39;,
      currentPath: &#39;&#39;
     }
     },
     route: {
     data: function(transition){
      transition.next({
      currentPath: transition.to.path
      })
     }
     }
    })
    登入後複製

    该示例运行效果如下:

    钩子函数(06)

    路由的切换过程,本质上是执行一系列路由钩子函数,钩子函数总体上分为两大类:

    1. 全局的钩子函数

    2. 组件的钩子函数

    全局的钩子函数定义在全局的路由对象中,组件的钩子函数则定义在组件的route选项中。

    全局钩子函数

    全局钩子函数有2个:

    1. beforeEach:在路由切换开始时调用

    2. afterEach:在每次路由切换成功进入激活阶段时被调用

    组件的钩子函数

    组件的钩子函数一共6个:

    1. data:可以设置组件的data

    2. activate:激活组件

    3. deactivate:禁用组件

    4. canActivate:组件是否可以被激活

    5. canDeactivate:组件是否可以被禁用

    6. canReuse:组件是否可以被重用

    切换对象

    每个切换钩子函数都会接受一个 transition 对象作为参数。这个切换对象包含以下函数和方法:

    transition.to

    表示将要切换到的路径的路由对象。

    transition.from

    代表当前路径的路由对象。

    transition.next()

    调用此函数处理切换过程的下一步。

    transition.abort([reason])

    调用此函数来终止或者拒绝此次切换。

    transition.redirect(path)

    取消当前切换并重定向到另一个路由。

    钩子函数的执行顺序

    全局钩子函数和组件钩子函数加起来一共8个,为了熟练vue router的使用,有必要了解这些钩子函数的执行顺序。

    为了直观地了解这些钩子函数的执行顺序,在画面上追加一个Vue实例:

    var well = new Vue({
     el: &#39;.well&#39;,
     data: {
     msg: &#39;&#39;,
     color: &#39;#ff0000&#39;
     },
     methods: {
     setColor: function(){
      this.color = &#39;#&#39; + parseInt(Math.random()*256).toString(16)
       + parseInt(Math.random()*256).toString(16)
       + parseInt(Math.random()*256).toString(16)
     },
     setColoredMessage: function(msg){
      this.msg += &#39;<p style="color: &#39; + this.color + &#39;">&#39; + msg + &#39;</p>&#39;
     },
     setTitle: function(title){
      this.msg = &#39;<h2 style="color: #333">&#39; + title + &#39;</h2>&#39;
     }
     }
    })
    登入後複製

    well实例的HTML:

    <p class="well">
     {{{ msg }}}
    </p>
    登入後複製

    然后,添加一个RouteHelper函数,用于记录各个钩子函数的执行日志:

    function RouteHelper(name) {
     var route = {
     canReuse: function(transition) {
      well.setColoredMessage(&#39;执行组件&#39; + name + &#39;的钩子函数:canReuse&#39;)
      return true
     },
     canActivate: function(transition) {
      well.setColoredMessage(&#39;执行组件&#39; + name + &#39;的钩子函数:canActivate&#39;)
      transition.next()
     },
     activate: function(transition) {
      well.setColoredMessage(&#39;执行组件&#39; + name + &#39;的钩子函数:activate&#39;)
      transition.next()
     },
     canDeactivate: function(transition) {
      well.setColoredMessage(&#39;执行组件&#39; + name + &#39;的钩子函数:canDeactivate&#39;)
      transition.next()
     },
     deactivate: function(transition) {
      well.setColoredMessage(&#39;执行组件&#39; + name + &#39;的钩子函数:deactivate&#39;)
      transition.next()
     },
     data: function(transition) {
      well.setColoredMessage(&#39;执行组件&#39; + name + &#39;的钩子函数:data&#39;)
      transition.next()
     }
     }
     return route;
    }
    登入後複製

    最后,将这些钩子函数应用于各个组件:

    var Home = Vue.extend({
     template: &#39;#home&#39;,
     data: function() {
     return {
      msg: &#39;Hello, vue router!&#39;,
      path: &#39;&#39;
     }
     },
     route: RouteHelper(&#39;Home&#39;)
    })
    
    var News = Vue.extend({
     template: &#39;#news&#39;,
     route: RouteHelper(&#39;News&#39;)
    })
    
    var Message = Vue.extend({
     template: &#39;#message&#39;,
     route: RouteHelper(&#39;Message&#39;)
    })
    
    var About = Vue.extend({
     template: &#39;#about&#39;,
     route: RouteHelper(&#39;About&#39;)
    })
    登入後複製

    我们按照以下步骤做个小实验:

    1.运行应用(访问/home路径)

    2.访问/home/news路径

    3.访问/home/message路径

    4.访问/about路径

     切换控制流水线

    当用户点击了/home/news链接,然后再点击/home/message链接后,vue-router做了什么事情呢?它执行了一个切换管道

    如何做到这些呢?这个过程包含一些我们必须要做的工作:

    1.可以重用组件Home,因为重新渲染后,组件Home依然保持不变。

    2.需要停用并移除组件News。

    3.启用并激活组件Message。

    4.在執行步驟2和3之前,需要確保切換效果有效-也就是說,為保證切換中涉及的所有元件都能按照期望的那樣被停用/啟動。

    切換的各個階段

    我們可以把路由的切換分成三個階段:可重複使用階段,驗證階段和啟動階段。

    我們以home/news切換到home/message為例來描述各個階段。 (以下文字描述參考:http://router.vuejs.org/zh-cn/pipeline/index.html)

    1. 可重複使用階段

    ##檢查目前的視圖結構中是否存在可以重複使用的元件。這是透過比較兩個新的元件樹,找出共用的元件,然後檢查它們的可重複使用性(透過 canReuse 選項)。預設情況下, 所有元件都是可重複使用的,除非是自訂過。

    2. 驗證階段

    #檢查目前的元件是否能夠停用以及新元件是否可以被啟動。這是透過呼叫路由配置階段的canDeactivate 和canActivate 鉤子函數來判斷的。

    3.激活階段

    #一旦所有的驗證鉤子函數都被呼叫而且沒有終止切換,切換就可以認定是合法的。路由器則開始停用目前元件並啟用新元件。

    此階段對應鉤子函數的呼叫順序和驗證階段相同,其目的是在元件切換真正執行之前提供一個進行清理和準備的機會。介面的更新會等到所有受影響元件的 deactivate 和 activate 鉤子函數執行之後才進行。

    data 這個鉤子函數會在 activate 之後被調用,或者當前元件元件可以重複使用時也會被調用。


    以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

    相關建議:

    vue.extend實作alert模態框彈窗元件

    關於vue如何引入sass全域變數的解析

    如何解決Vue下路由History模式打包後頁面空白

    以上是關於vue路由的使用解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

  • 本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    vue中怎麼用bootstrap vue中怎麼用bootstrap Apr 07, 2025 pm 11:33 PM

    在 Vue.js 中使用 Bootstrap 分為五個步驟:安裝 Bootstrap。在 main.js 中導入 Bootstrap。直接在模板中使用 Bootstrap 組件。可選:自定義樣式。可選:使用插件。

    vue怎麼給按鈕添加函數 vue怎麼給按鈕添加函數 Apr 08, 2025 am 08:51 AM

    可以通過以下步驟為 Vue 按鈕添加函數:將 HTML 模板中的按鈕綁定到一個方法。在 Vue 實例中定義該方法並編寫函數邏輯。

    vue中的watch怎麼用 vue中的watch怎麼用 Apr 07, 2025 pm 11:36 PM

    Vue.js 中的 watch 選項允許開發者監聽特定數據的變化。當數據發生變化時,watch 會觸發一個回調函數,用於執行更新視圖或其他任務。其配置選項包括 immediate,用於指定是否立即執行回調,以及 deep,用於指定是否遞歸監聽對像或數組的更改。

    vue多頁面開發是啥意思 vue多頁面開發是啥意思 Apr 07, 2025 pm 11:57 PM

    Vue 多頁面開發是一種使用 Vue.js 框架構建應用程序的方法,其中應用程序被劃分為獨立的頁面:代碼維護性:將應用程序拆分為多個頁面可以使代碼更易於管理和維護。模塊化:每個頁面都可以作為獨立的模塊,便於重用和替換。路由簡單:頁面之間的導航可以通過簡單的路由配置來管理。 SEO 優化:每個頁面都有自己的 URL,這有助於搜索引擎優化。

    vue.js怎麼引用js文件 vue.js怎麼引用js文件 Apr 07, 2025 pm 11:27 PM

    在 Vue.js 中引用 JS 文件的方法有三種:直接使用 &lt;script&gt; 標籤指定路徑;利用 mounted() 生命週期鉤子動態導入;通過 Vuex 狀態管理庫進行導入。

    vue返回上一頁的方法 vue返回上一頁的方法 Apr 07, 2025 pm 11:30 PM

    Vue.js 返回上一頁有四種方法:$router.go(-1)$router.back()使用 &lt;router-link to=&quot;/&quot;&gt; 組件window.history.back(),方法選擇取決於場景。

    vue遍歷怎麼用 vue遍歷怎麼用 Apr 07, 2025 pm 11:48 PM

    Vue.js 遍歷數組和對像有三種常見方法:v-for 指令用於遍歷每個元素並渲染模板;v-bind 指令可與 v-for 一起使用,為每個元素動態設置屬性值;.map 方法可將數組元素轉換為新數組。

    vue的div怎麼跳轉 vue的div怎麼跳轉 Apr 08, 2025 am 09:18 AM

    Vue 中 div 元素跳轉的方法有兩種:使用 Vue Router,添加 router-link 組件。添加 @click 事件監聽器,調用 this.$router.push() 方法跳轉。

    See all articles