Vue-router基本使用

1路由,其實就是指向的意思,當我點擊頁面上的home按鈕時,頁面中就要顯示home的內容,如果點擊頁面上的about 按鈕,頁面中就要顯示about 的內容。Home按鈕? => home 內容, about按鈕 => about 內容,也可以說是一種映射. 所以在頁面上有兩個部分,一個是點擊部分,一個是點擊之后,顯示內容的部分。

點擊之后,怎么做到正確的對應,比如,我點擊home 按鈕,頁面中怎么就正好能顯示home的內容。這就要在js 文件中配置路由。

路由中有三個基本的概念 route, routes, router。

1, route,它是一條路由,由這個英文單詞也可以看出來,它是單數, Home按鈕? => home內容, 這是一條route, ?about按鈕 => about 內容, 這是另一條路由。

2, routes 是一組路由,把上面的每一條路由組合起來,形成一個數組。[{home 按鈕 =>home內容 }, { about按鈕 => about 內容}]

3, router 是一個機制,相當于一個管理者,它來管理路由。因為routes 只是定義了一組路由,它放在哪里是靜止的,當真正來了請求,怎么辦? 就是當用戶點擊home 按鈕的時候,怎么辦?這時router 就起作用了,它到routes 中去查找,去找到對應的 home 內容,所以頁面中就顯示了 home 內容。

4,客戶端中的路由,實際上就是dom 元素的顯示和隱藏。當頁面中顯示home 內容的時候,about 中的內容全部隱藏,反之也是一樣。客戶端路由有兩種實現方式:基于hash 和基于html5 history api.

vue-router中的路由也是基于上面的內容來實現的

在vue中實現路由還是相對簡單的。因為我們頁面中所有內容都是組件化的,我們只要把路徑和組件對應起來就可以了,然后在頁面中把組件渲染出來。

1, 頁面實現(html模版中)

在vue-router中, 我們看到它定義了兩個標簽 和來對應點擊和顯示部分。 就是定義頁面中點擊的部分, 定義顯示部分,就是點擊后,區配的內容顯示在什么地方。所以? 還有一個非常重要的屬性 to,定義點擊之后,要到哪里去, 如:Home

2, js 中配置路由

首先要定義route, ?一條路由的實現。它是一個對象,由兩個部分組成: path和component. ?path 指路徑,component 指的是組件。如:{path:’/home’, component: home}

我們這里有兩條路由,組成一個routes:

const routes =[

{ path:'/home', component: Home },

{ path:'/about', component: About }

]

最后創建router 對路由進行管理,它是由構造函數 new vueRouter() 創建,接受routes 參數。

const router =newVueRouter({

routes//routes: routes 的簡寫})

配置完成后,把router 實例注入到 vue 根實例中,就可以使用路由了

const app =newVue({

router

}).$mount('#app')

執行過程:當用戶點擊 router-link 標簽時,會去尋找它的 to 屬性, 它的 to 屬性和 js 中配置的路徑{ path: '/home', component: Home}? path 一一對應,從而找到了匹配的組件, 最后把組件渲染到 標簽所在的地方。所有的這些實現才是基于hash 實現的。

vue-cli 創建一個項目體驗一下, 當然不要忘記安裝vue-router

1, 在src 目錄下新建兩個組件,home.vue 和 about.vue

? ?

? ? ? ?

home

? ? ? ?

{{msg}}

? ?
exportdefault{

data () {return{

msg:"我是home 組件"}

}

}

? ?

? ? ? ?

about

? ? ? ?

{{aboutMsg}}

? ?
exportdefault{

data () {return{

aboutMsg:'我是about組件'}

}

}

2, 在 App.vue中 定義 和?

?

? ? ? ? ? ? ? ? ? Home? ? ? About? ? ? ? ? ? ? ?
exportdefault{

}

3, ?在 src目錄下再新建一個router.js 定義router, 就是定義 路徑到 組件的 映射。

import Vue from "vue";

import VueRouter from"vue-router";//引入組件import home from "./home.vue";

import about from"./about.vue";//要告訴 vue 使用 vueRouterVue.use(VueRouter);

const routes=[

{

path:"/home",

component: home

},

{

path:"/about",

component: about

}

]varrouter =newVueRouter({

routes

})

exportdefaultrouter;

4,?把路由注入到根實例中,啟動路由。這里其實還有一種方法,就像vuex ?store 注入到根實例中一樣,我們也可以把vueRouter 直接注入到根實例中。在main.js中引入路由,注入到根實例中。

import Vue from 'vue'import App from'./App.vue'//引入路由import router from "./router.js"newVue({

el:'#app',

router,//注入到根實例中render: h =>h(App)

})

5, 這時點擊頁面上的home 和about 可以看到組件來回切換。但是有一個問題,當首次進入頁面的時候,頁面中并沒有顯示任何內容。這是因為首次進入頁面時,它的路徑是 '/',我們并沒有給這個路徑做相應的配置。一般,頁面一加載進來都會顯示home頁面,我們也要把這個路徑指向home組件。但是如果我們寫{ path: '/', component: Home },vue 會報錯,因為兩條路徑卻指向同一個方向。這怎么辦?這需要重定向,所謂重定向,就是重新給它指定一個方向,它本來是訪問 / 路徑,我們重新指向‘/home’, 它就相當于訪問 '/home', 相應地, home組件就會顯示到頁面上。vueRouter中用?redirect 來定義重定向。

const routes =[

{

path:"/home",

component: home

},

{

path:"/about",

component: about

},//重定向{

path:'/',

redirect:'/home'}

]

現在頁面正常了,首次進入顯示home, 并且點擊也可以看到內容的切換。

6, 最后,我們看一下路由是怎么實現的

打開瀏覽器控制臺,首先看到 router-link 標簽渲染成了 a 標簽,to 屬性變成了a 標簽的 href 屬性,這時就明白了點擊跳轉的意思。router-view 標簽渲染成了我們定義的組件,其實它就是一個占位符,它在什么地方,匹配路徑的組件就在什么地方,所以 router-link 和router-view 標簽一一對應,成對出現。

這里還看到,當點擊Home和About 來回切換時,a 標簽有一個樣式類?.router-link-active 也在來回切換, 原來這是當router-link 處于選中狀態時,vueRouter 會自動添加這個類,因此我們也可以利用這個類來改變選中時的狀態,如選中時,讓它變成紅色。但當設置 .router-link-active {color: red;},它并沒有生效,這時還要在類前面加一個a, a.router-link-active {color: red;}, 這樣就沒有問題了。未處于選中狀態的router-link, 我們也想給它更改樣式,怎么辦? 直接給它添加一個 class 就可以了, Home

動態路由

上面我們定義的路由,都是嚴格匹配的,只有router-link 中的to屬性和 js 中一條路由route中 path 一模一樣,才能顯示相應的組件component. 但有時現實卻不是這樣的,當我們去訪問網站并登錄成功后,它會顯示 歡迎你,+ 你的名字。不同的用戶登錄, 只是顯示“你的名字” 部分不同,其它部分是一樣的。這就表示,它是一個組件,假設是user組件。不同的用戶(就是用戶的id不同),它都會導航到同一個user ?組件中。這樣我們在配置路由的時候,就不能寫死, 就是路由中的path屬性,不能寫死,那要怎么設置? 導航到 user 組件,路徑中肯定有user,?id 不同,那就給路徑一個動態部分來匹配不同的id. ?在vue-router中,動態部分 以 : 開頭,那么路徑就變成了 /user/:id, 這條路由就可以這么寫: ?{?path:"/user/:id",?component: user?}.

我們定義一個user組件(自己隨便寫一個就好了),頁面中再添加兩個router-link 用于導航, 最后router.js中添加路由配置,來體驗一下

app.vue 中添加兩個router-link:

Home

About


User123

User456

router.js 配置user動態路由:

const routes =[

{

path:"/home",

component: home

},

{

path:"/about",

component: about

},/*新增user路徑,配置了動態的id*/{

path:"/user/:id",

component: user

},

{

path:'/',

redirect:'/home'}

]

user組件

? ?

? ? ? ?

User

? ? ? ?
我是user組件
? ?
exportdefault{

}

這時在頁面中點擊user123 和user456, 可以看到它們都導航到user組件,配置正確。

在動態路由中,怎么獲取到動態部分? 因為在組件中是可以顯示不同部分的,就是上面提到的“你的名字”。其實,當整個vue-router 注入到根實例后,在組件的內部,可以通過this.$route 來獲取到 router 實例。它有一個params 屬性,就是來獲得這個動態部分的。它是一個對象,屬性名,就是路徑中定義的動態部分 id, 屬性值就是router-link中to 屬性中的動態部分,如123。使用vuex時,組件中想要獲取到state 中的狀態,是用computed 屬性,在這里也是一樣,在組件中,定義一個computed 屬性dynamicSegment,user 組件修改如下:

? ?

? ? ? ?

User

? ? ? ?
我是user組件, 動態部分是{{dynamicSegment}}
? ?
exportdefault{

computed: {

dynamicSegment () {returnthis.$route.params.id

}

}

}

這里還有最后一個問題,就是動態路由在來回切換時,由于它們都是指向同一組件,vue不會銷毀再創建這個組件,而是復用這個組件,就是當第一次點擊(如:user123)的時候,vue 把對應的組件渲染出來,但在user123, user456點擊來回切換的時候,這個組件就不會發生變化了,組件的生命周期不管用了。這時如果想要在組件來回切換的時候做點事情,那么只能在組件內部(user.vue中)利用watch 來監聽$route 的變化。把上面的代碼用監聽$route 實現

exportdefault{

data () {return{

dynamicSegment:''}

},

watch: {

$route (to,from){//to表示的是你要去的那個組件,from 表示的是你從哪個組件過來的,它們是兩個對象,你可以把它打印出來,它們也有一個param 屬性console.log(to);

console.log(from);this.dynamicSegment =to.params.id

}

}

}

嵌套路由

嵌套路由,主要是由我們的頁面結構所決定的。當我們進入到home頁面的時候,它下面還有分類,如手機系列,平板系列,電腦系列。當我們點擊各個分類的時候,它還是需要路由到各個部分,如點擊手機,它肯定到對應到手機的部分。

在路由的設計上,首先進入到 home ,然后才能進入到phone, tablet, computer.? Phone, tablet, compute 就相當于進入到了home的子元素。所以vue? 提供了childrens 屬性,它也是一組路由,相當于我們所寫的routes。

首先,在home頁面上定義三個router-link 標簽用于導航,然后再定義一個router-view標簽,用于渲染對應的組件。router-link 和router-view 標簽要一一對應。home.vue 組件修改如下:

? ?

? ? ? ?

home

? ? ? ?

? ? ? ? ? ? 手機? ? ? ? ? ? 平板? ? ? ? ? ? 電腦? ? ? ?

? ? ? ? ? ?

router.js 配置路由,修改如下:

const routes =[

{

path:"/home",

// 下面這個屬性也不少,因為,我們是先進入home頁面,才能進入子路由? ? ? ? component: home,

// 子路由? ? ? ? children: [? ? ? ? ? ? {? ? ? ? ? ? ? ? path:

"phone",

component: phone

},

{

path:"tablet",

component: tablet

},

{

path:"computer",

component: computer

}]

},

{

path:"/about",

component: about

},{

path:"/user/:id",

component: user

},

{

path:'/',

redirect:'/home'}

]

這時當我們點擊home 時,它下面出現手機等字樣,但沒有任何對應的組件進行顯示,這通常不是我們想要的。要想點擊home時,要想渲染相對應的子組件,那還需要配置一條路由。當進入到home 時,它在children中對應的路由path 是空 ‘’,完整的childrens 如下:

children: [

{

path:"phone",

component: phone

},

{

path:"tablet",

component: tablet

},

{

path:"computer",? ? ? ? component: computer? ? },

// 當進入到home時,下面的組件顯示? ? {? ? ? ? path:

"",

component: phone

}

]

命名路由

命名路由,很簡單,因為根據名字就可以知道,這個路由有一個名字,那就直接給這個路由加一個name 屬性,就可以了。 給user 路由加一個name 屬性:

{

path:"/user/:id",

name:"user",

component: user

}

命名路由的使用, 在router-link 中to 屬性就可以使用對象了,

User123 // 和下面等價

User? // 當使用對象作為路由的時候,to前面要加一個冒號,表示綁定

編程式導航:這主要應用到按鈕點擊上。當點擊按鈕的時候,跳轉另一個組件, 這只能用代碼,調用rourter.push() 方法。 當們把router 注入到根實例中后,組件中通過 this.$router 可以獲取到router, 所以在組件中使用

this.$router.push("home"), 就可以跳轉到home界面

2轉載自https://www.cnblogs.com/SamWeb/p/6610733.html

3

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • Vue-router學習指南 日記:本文按照vue-router官網的知識結合例子進行分析和講解,搭建工具(vue...
    sunny519111閱讀 1,483評論 0 6
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • Vue2簡單入門 Vue.js再入門 Vue.js使用vue-router構建單頁應用 Vue.js狀態管理工具V...
    _ihhu閱讀 17,670評論 1 49
  • 路由,其實就是指向的意思,當我點擊頁面上的home 按鈕時,頁面中就要顯示home的內容,如果點擊頁面上的abou...
    Elliott_d3ae閱讀 345評論 0 0
  • 介紹 weex是阿里出品的一個類似RN的框架,可以使用前端技術來開發移動應用,實現一份代碼支持H5,iOS和And...
    不知者謂我何求閱讀 2,275評論 1 4