關(guān)于vue-router的那些事兒
一、引子
要學(xué)習(xí)vue-router就要先知道這里的路由是什么?為什么我們不能像原來(lái)一樣直接用標(biāo)簽編寫(xiě)鏈接哪?vue-router如何使用?常見(jiàn)路由操作有哪些?等等這些問(wèn)題,就是本篇要探討的主要問(wèn)題
二、vue-router是什么
這里的路由并不是指我們平時(shí)所說(shuō)的硬件路由器, 這里的路由就是SPA(單頁(yè)應(yīng)用)的路徑管理器 。再通俗的說(shuō),vue-router就是WebApp的鏈接路徑管理系統(tǒng)。 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用于構(gòu)建單頁(yè)面應(yīng)用。vue的單頁(yè)面應(yīng)用是基于路由和組件的,路由用于設(shè)定訪問(wèn)路徑,并將路徑和組件映射起來(lái)。傳統(tǒng)的頁(yè)面應(yīng)用,是用一些超鏈接來(lái)實(shí)現(xiàn)頁(yè)面切換和跳轉(zhuǎn)的。在vue-router單頁(yè)面應(yīng)用中,則是路徑之間的切換,也就是組件的切換。 路由模塊的本質(zhì) 就是建立起url和頁(yè)面之間的映射關(guān)系 。 至于我們?yōu)樯恫荒苡胊標(biāo)簽,這是因?yàn)橛肰ue做的都是單頁(yè)應(yīng)用,就相當(dāng)于只有一個(gè)主的index.html頁(yè)面,所以你寫(xiě)的標(biāo)簽是不起作用的,你必須使用vue-router來(lái)進(jìn)行管理。
三、vue-router實(shí)現(xiàn)原理
SPA(single page application):單一頁(yè)面應(yīng)用程序,只有一個(gè)完整的頁(yè)面;它在加載頁(yè)面時(shí),不會(huì)加載整個(gè)頁(yè)面,而是只更新某個(gè)指定的容器中內(nèi)容。 單頁(yè)面應(yīng)用(SPA)的核心之一是: 更新視圖而不重新請(qǐng)求頁(yè)面 ;vue-router在實(shí)現(xiàn)單頁(yè)面前端路由時(shí),提供了兩種方式:Hash模式和History模式;根據(jù)mode參數(shù)來(lái)決定采用哪一種方式。
1、Hash模式:
vue-router 默認(rèn) hash 模式 —— 使用 URL 的 hash 來(lái)模擬一個(gè)完整的 URL,于是當(dāng) URL 改變時(shí),頁(yè)面不會(huì)重新加載。hash(#)是URL 的錨點(diǎn),代表的是網(wǎng)頁(yè)中的一個(gè)位置,單單改變#后的部分,瀏覽器只會(huì)滾動(dòng)到相應(yīng)位置,不會(huì)重新加載網(wǎng)頁(yè),也就是說(shuō) #是用來(lái)指導(dǎo)瀏覽器動(dòng)作的,對(duì)服務(wù)器端完全無(wú)用,HTTP請(qǐng)求中也不會(huì)不包括#;同時(shí)每一次改變#后的部分,都會(huì)在瀏覽器的訪問(wèn)歷史中增加一個(gè)記錄,使用”后退”按鈕,就可以回到上一個(gè)位置;所以說(shuō) Hash模式通過(guò)錨點(diǎn)值的改變,根據(jù)不同的值,渲染指定DOM位置的不同數(shù)據(jù)
2、History模式:
由于hash模式會(huì)在url中自帶#,如果不想要很丑的 hash,我們可以用路由的 history 模式,只需要在配置路由規(guī)則時(shí),加入"mode: 'history'",這種模式充分利用 history.pushState API 來(lái)完成 URL 跳轉(zhuǎn)而無(wú)須重新加載頁(yè)面。
//main.js文件中 const router = new VueRouter({ mode: 'history', routes: [...] })
當(dāng)你使用 history 模式時(shí),URL 就像正常的 url,例如 http://yoursite.com/user/id,比較好看! 不過(guò)這種模式要玩好,還需要后臺(tái)配置支持。因?yàn)槲覀兊膽?yīng)用是個(gè)單頁(yè)客戶端應(yīng)用,如果后臺(tái)沒(méi)有正確的配置,當(dāng)用戶在瀏覽器直接訪問(wèn) http://oursite.com/user/id 就會(huì)返回 404,這就不好看了。 所以呢, 你要在服務(wù)端增加一個(gè)覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態(tài)資源,則應(yīng)該返回同一個(gè) index.html 頁(yè)面,這個(gè)頁(yè)面就是你 app 依賴(lài)的頁(yè)面。
export const routes = [ {path: "/", name: "homeLink", component:Home} {path: "/register", name: "registerLink", component: Register}, {path: "/login", name: "loginLink", component: Login}, {path: "*", redirect: "/"}]
此處就設(shè)置如果URL輸入錯(cuò)誤或者是URL 匹配不到任何靜態(tài)資源,就自動(dòng)跳到到Home頁(yè)面
3、使用路由模塊來(lái)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的方式
方式1:直接修改地址欄
方式2:this.$router.push(‘路由地址')
方式3: <router-link to="路由地址"></router-link>
四、vue-router使用方式
1:下載 npm i vue-router -S
2:在main.js中引入 import VueRouter from 'vue-router';
3:安裝插件 Vue.use(VueRouter);
4:創(chuàng)建路由對(duì)象并配置路由規(guī)則
let router = new VueRouter({routes:[{path:'/home',component:Home}]});
5:將其路由對(duì)象傳遞給Vue的實(shí)例,options中加入 router:router
6:在app.vue中留坑 <router-view></router-view>
具體實(shí)現(xiàn)請(qǐng)看如下代碼:
//main.js文件中引入 import Vue from 'vue'; import VueRouter from 'vue-router'; //主體 import App from './components/app.vue'; import Home from './components/home.vue' //安裝插件 Vue.use(VueRouter); //掛載屬性 //創(chuàng)建路由對(duì)象并配置路由規(guī)則 let router = new VueRouter({ routes: [ //一個(gè)個(gè)對(duì)象 { path: '/home', component: Home } ] }); //new Vue 啟動(dòng) new Vue({ el: '#app', //讓vue知道我們的路由規(guī)則 router: router, //可以簡(jiǎn)寫(xiě)router render: c => c(App), })
最后記得在在app.vue中“留坑”
//app.vue中 <template> <div> <!-- 留坑,非常重要 --> <router-view></router-view> </div> </template> <script> export default { data(){ return {} } } </script>
五、vue-router核心要點(diǎn)
1.vue-router如何參數(shù)傳遞
①用name傳遞參數(shù)
在路由文件src/router/index.js里配置name屬性
routes: [ { path: '/', name: 'Hello', component: Hello } ]
模板里(src/App.vue)用 $router.name
來(lái)接收 比如: <p>{{ $router.name}}</p>
②通過(guò) <router-link>
標(biāo)簽中的to傳參
這種傳參方法的基本語(yǔ)法:
<router-link :to="{name:xxx,params:{key:value}}">valueString</router-link>
比如先在src/App.vue文件中
<router-link :to="{name:'hi1',params:{username:'jspang',id:'555'}}">Hi頁(yè)面1</router-link>
然后把src/router/index.js文件里給hi1配置的路由起個(gè)name,就叫hi1.
{path:'/hi1',name:'hi1',component:Hi1}
最后在模板里(src/components/Hi1.vue)
用 $route.params.username
進(jìn)行接收.
{{$route.params.username}}-{{$route.params.id}}
③vue-router 利用url傳遞參數(shù)----在配置文件里以冒號(hào)的形式設(shè)置參數(shù)。
我們?cè)?src/router/index.js文件里配置路由
{ path:'/params/:newsId/:newsTitle', component:Params }
我們需要傳遞參數(shù)是新聞ID(newsId)和新聞標(biāo)題(newsTitle).所以我們?cè)诼酚膳渲梦募镏贫诉@兩個(gè)值。 在src/components目錄下建立我們params.vue組件,也可以說(shuō)是頁(yè)面。我們?cè)陧?yè)面里輸出了url傳遞的的新聞ID和新聞標(biāo)題。
<template> <div> <h2>{{ msg }}</h2> <p>新聞ID:{{ $route.params.newsId}}</p> <p>新聞標(biāo)題:{{ $route.params.newsTitle}}</p> </div> </template> <script> export default { name: 'params', data () { return { msg: 'params page' } } } </script>
在App.vue文件里加入我們的 <router-view>
標(biāo)簽。這時(shí)候我們可以直接利用url傳值了
<router-link to="/params/198/jspang website is very good">params</router-link>
2.單頁(yè)面多路由區(qū)域操作
在一個(gè)頁(yè)面里我們有2個(gè)以上 <router-view>
區(qū)域,我們通過(guò)配置路由的js文件,來(lái)操作這些區(qū)域的內(nèi)容
①App.vue文件,在 <router-view>
下面新寫(xiě)了兩行 <router-view> 標(biāo)簽,并加入了些CSS樣式
<template> <div id="app"> <img src="./assets/logo.png"> <router-link :to="{name:'HelloWorld'}"><h1>H1</h1></router-link> <router-link :to="{name:'H1'}"><h1>H2</h1></router-link> <router-view></router-view> <router-view name="left" style="float:left;width:50%;background-color:#ccc;height:300px;"/> <router-view name="right" style="float:right;width:50%;background-color:yellowgreen;height:300px;"/> </div> </template>
②需要在路由里配置這三個(gè)區(qū)域,配置主要是在components字段里進(jìn)行
export default new Router({ routes: [ { path: '/', name: 'HelloWorld', components: {default: HelloWorld, left:H1,//顯示H1組件內(nèi)容'I am H1 page,Welcome to H1' right:H2//顯示H2組件內(nèi)容'I am H2 page,Welcome to H2' } }, { path: '/h1', name: 'H1', components: {default: HelloWorld, left:H2,//顯示H2組件內(nèi)容 right:H1//顯示H1組件內(nèi)容 } } ] })
上邊的代碼我們編寫(xiě)了兩個(gè)路徑,一個(gè)是默認(rèn)的‘/',另一個(gè)是‘/Hi'.在兩個(gè)路徑下的components里面,我們對(duì)三個(gè)區(qū)域都定義了顯示內(nèi)容。最后頁(yè)面展示如下圖:
3.vue-router配置子路由(二級(jí)路由)
實(shí)際生活中的應(yīng)用界面,通常由多層嵌套的組件組合而成。同樣地,URL中各段動(dòng)態(tài)路徑也按某種結(jié)構(gòu)對(duì)應(yīng)嵌套的各層組件,例如:
如何實(shí)現(xiàn)下圖效果(H1頁(yè)面和H2頁(yè)面嵌套在主頁(yè)中)?
①首先用標(biāo)簽增加了兩個(gè)新的導(dǎo)航鏈接
<router-link :to="{name:'HelloWorld'}">主頁(yè)</router-link> <router-link :to="{name:'H1'}">H1頁(yè)面</router-link> <router-link :to="{name:'H2'}">H2頁(yè)面</router-link>
②在HelloWorld.vue加入 <router-view> 標(biāo)簽,給子模板提供插入位置
<template> <div class="hello"> <h1>{{ msg }}</h1> <router-view></router-view> </div> </template>
③在components目錄下新建兩個(gè)組件模板 H1.vue 和 H2.vue 兩者內(nèi)容類(lèi)似,以下是H1.vue頁(yè)面內(nèi)容:
<template> <div class="hello"> <h1>{{ msg }}</h1> </div> </template> <script> export default { data() { return { msg: 'I am H1 page,Welcome to H1' } } } </script>
④修改router/index.js代碼,子路由的寫(xiě)法是在原有的路由配置下加入children字段。
routes: [ { path: '/', name: 'HelloWorld', component: HelloWorld, children: [{path: '/h1', name: 'H1', component: H1}, {path: '/h2', name: 'H2', component: H2} ] } ]
4.vue-router跳轉(zhuǎn)方法
<button @click="goToMenu" class="btn btn-success">Let's order!</button> ..... <script> export default{ methods:{ goToMenu(){ this.$router.go(-1)//跳轉(zhuǎn)到上一次瀏覽的頁(yè)面 this.$router.replace('/menu')//指定跳轉(zhuǎn)的地址 this.$router.replace({name:'menuLink'})// 指定跳轉(zhuǎn)路由的名字下 this.$router.push('/menu')通過(guò)push進(jìn)行跳轉(zhuǎn) this.$router.push({name:'menuLink'})通過(guò)push進(jìn)行跳轉(zhuǎn)路由的名字下 } } } </script>
5.404頁(yè)面的設(shè)置
用戶會(huì)經(jīng)常輸錯(cuò)頁(yè)面,當(dāng)用戶輸錯(cuò)頁(yè)面時(shí),我們希望給他一個(gè)友好的提示頁(yè)面,這個(gè)頁(yè)面就是我們常說(shuō)的404頁(yè)面。vue-router也為我們提供了這樣的機(jī)制。 ①設(shè)置我們的路由配置文件(/src/router/index.js)
{ path:'*', component:Error }
這里的path:'*'就是輸入地址不匹配時(shí),自動(dòng)顯示出Error.vue的文件內(nèi)容
②在/src/components/文件夾下新建一個(gè)Error.vue的文件。簡(jiǎn)單輸入一些有關(guān)錯(cuò)誤頁(yè)面的內(nèi)容。
<template> <div> <h2>{{ msg }}</h2> </div> </template> <script> export default { data () { return { msg: 'Error:404' } } } </script>
此時(shí)我們隨意輸入一個(gè)錯(cuò)誤的地址時(shí),便會(huì)自動(dòng)跳轉(zhuǎn)到404頁(yè)面
總結(jié)
以上所述是小編給大家介紹的關(guān)于vue-router的那些事兒,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- vue-router相關(guān)基礎(chǔ)知識(shí)及工作原理
- vue中使用vue-router切換頁(yè)面時(shí)滾動(dòng)條自動(dòng)滾動(dòng)到頂部的方法
- vue router使用query和params傳參的使用和區(qū)別
- vue-router實(shí)現(xiàn)組件間的跳轉(zhuǎn)(參數(shù)傳遞)
- Vue-Router實(shí)現(xiàn)組件間跳轉(zhuǎn)的三種方法
- Vue-router路由判斷頁(yè)面未登錄跳轉(zhuǎn)到登錄頁(yè)面的實(shí)例
- vue router仿天貓底部導(dǎo)航欄功能
- vue-router實(shí)現(xiàn)tab標(biāo)簽頁(yè)(單頁(yè)面)詳解
- vue-router+vuex addRoutes實(shí)現(xiàn)路由動(dòng)態(tài)加載及菜單動(dòng)態(tài)加載
相關(guān)文章
vue3?element-plus?實(shí)現(xiàn)表格數(shù)據(jù)更改功能詳細(xì)步驟
這篇文章主要介紹了vue3 element-plus實(shí)現(xiàn)表格數(shù)據(jù)更改功能,本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07如何配置vue.config.js 處理static文件夾下的靜態(tài)文件
這篇文章主要介紹了如何配置vue.config.js 處理static文件夾下的靜態(tài)文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Vue用mixin合并重復(fù)代碼的實(shí)現(xiàn)
這篇文章主要介紹了Vue用mixin合并重復(fù)代碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Vite使用unplugin-auto-import實(shí)現(xiàn)vue3中的自動(dòng)導(dǎo)入
本文主要介紹了Vite使用unplugin-auto-import實(shí)現(xiàn)vue3中的自動(dòng)導(dǎo)入,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06Vue2.0+ElementUI+PageHelper實(shí)現(xiàn)的表格分頁(yè)功能
ElementUI也是一套很不錯(cuò)的組件庫(kù),對(duì)于我們經(jīng)常用到的表格、表單、時(shí)間日期選擇器等常用組件都有著很好的封裝和接口。這篇文章主要介紹了Vue2.0+ElementUI+PageHelper實(shí)現(xiàn)的表格分頁(yè),需要的朋友可以參考下2021-10-10vue文件上傳Required request part ‘file‘ is&n
這篇文章主要介紹了vue文件上傳Required request part ‘file‘ is not present問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11