Vue實(shí)現(xiàn)路由跳轉(zhuǎn)和嵌套
一、配置 Router
用 vue-cli 創(chuàng)建的初始模板里面,并沒有 vue-router,需要通過(guò) npm 安裝
cnpm i vue-router -D
安裝完成后,在 src 文件夾下,創(chuàng)建一個(gè) routers.js 文件,和 main.js 平級(jí)
然后在 router.js 中引入所需的組件,創(chuàng)建 routers 對(duì)象
import Home from './components/home.vue' const routers = [ { path: '/home', name: 'home', component: Home }, { path: '/', component: Home }, ] export default routers
在創(chuàng)建的 routers 對(duì)象中, path 配置了路由的路徑,component 配置了映射的組件
需要注意的是,export default routers 必須寫在文件底部,而且后面還需要接一空行,否則無(wú)法通過(guò) ESlint 語(yǔ)法驗(yàn)證
然后 main.js 也需要修改:
import Vue from 'vue' import VueRouter from 'vue-router' import routers from './routers' import App from './App' Vue.use(VueRouter) const router = new VueRouter({ mode: 'history', routes: routers }) new Vue({ el: '#app', router, render: h => h(App) })
在創(chuàng)建的 router 對(duì)象中,如果不配置 mode,就會(huì)使用默認(rèn)的 hash 模式,該模式下會(huì)將路徑格式化為 #! 開頭。
添加 mode: 'history' 之后將使用 HTML5 history 模式,該模式下沒有 # 前綴,而且可以使用 pushState 和 replaceState 來(lái)管理記錄。
關(guān)于 html5 history 模式的更多內(nèi)容,可以參考官方文檔:https://router.vuejs.org/zh-cn/essentials/history-mode.html
二、嵌套路由
在這個(gè)實(shí)例中,為了加深項(xiàng)目層級(jí),App.vue 只是作為一個(gè)存放組件的容器:
其中 <router-view> 是用來(lái)渲染通過(guò)路由映射過(guò)來(lái)的組件,當(dāng)路徑更改時(shí),<router-view> 中的內(nèi)容也會(huì)發(fā)生更改
上面已經(jīng)配置了兩個(gè)路由,當(dāng)打開 http://localhost:8080 或者 http://localhost:8080/home 的時(shí)候,就會(huì)在 <router-view> 中渲染 home.vue 組件
home.vue 是真正的父組件,first.vue、login.vue 等子組件都會(huì)渲染到 home.vue 中的 <router-view>
如此一來(lái),就需要在一級(jí)路由中嵌套二級(jí)路由,修改 routers.js
import Home from './components/home.vue' import First from './components/children/first.vue' import Login from './components/children/login.vue' const routers = [ { path: '/', component: Home, children: [ { path: '/', component: Login } ] }, { path: '/home', name: 'home', component: Home, children: [ { path: '/', name: 'login', component: Login }, { path: 'first', name: 'first', component: First } ] } ] export default routers
在配置的路由后面,添加 children,并在 children 中添加二級(jí)路由,就能實(shí)現(xiàn)路由嵌套
配置 path 的時(shí)候,以 " / " 開頭的嵌套路徑會(huì)被當(dāng)作根路徑,所以子路由的 path 不需要添加 " / "
三、使用 <router-link> 映射路由
home.vue 中引入了 header.vue 組件,其中含有導(dǎo)航菜單
當(dāng)點(diǎn)擊導(dǎo)航菜單的時(shí)候,會(huì)切換 home.vue 中 <router-view> 中的內(nèi)容
這種只需要跳轉(zhuǎn)頁(yè)面,不需要添加驗(yàn)證方法的情況,可以使用 <router-link> 來(lái)實(shí)現(xiàn)導(dǎo)航的功能:
在編譯之后,<router-link> 會(huì)被渲染為 <a> 標(biāo)簽, to 會(huì)被渲染為 href,當(dāng) <router-link> 被點(diǎn)擊的時(shí)候,url 會(huì)發(fā)生相應(yīng)的改變
如果使用 v-bind 指令,還可以在 to 后面接變量,配合 v-for 指令可以渲染導(dǎo)航菜單
如果對(duì)于所有 ID 各不相同的用戶,都要使用 home 組件來(lái)渲染,可以在 routers.js 中添加動(dòng)態(tài)參數(shù):
{ path: '/home/:id', component: Home }
這樣 "/home/user01"、"/home/user02"、"/home/user03" 等路由,都會(huì)映射到 Home 組件
然后還可以使用 $route.params.id 來(lái)獲取到對(duì)應(yīng)的 id
四、編程式導(dǎo)航
實(shí)際情況下,有很多按鈕在執(zhí)行跳轉(zhuǎn)之前,還會(huì)執(zhí)行一系列方法,這時(shí)可以使用 this.$router.push(location) 來(lái)修改 url,完成跳轉(zhuǎn)
push 后面可以是對(duì)象,也可以是字符串:
// 字符串 this.$router.push('/home/first') // 對(duì)象 this.$router.push({ path: '/home/first' }) // 命名的路由 this.$router.push({ name: 'home', params: { userId: wise }})
五、前車之鑒
在學(xué)習(xí)的過(guò)程中,遇到一個(gè)困擾許久的問(wèn)題,大概是從 first 組件跳轉(zhuǎn)回 login 之后,無(wú)法再跳轉(zhuǎn)回去。但是 url 已經(jīng)被修改,刷新頁(yè)面也能正常顯示。
這是因?yàn)槲以?first.vue 組件中的 data 里面沒有寫 return
在 vue 組件中,data 必須寫為函數(shù),且需要用 return 來(lái)返回參數(shù)。但是當(dāng) data 為空時(shí),即使不寫 return 也不會(huì)報(bào)錯(cuò),所以導(dǎo)致了上面的問(wèn)題。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
自定義elementui上傳文件以及攜帶參數(shù)問(wèn)題
這篇文章主要介紹了自定義elementui上傳文件以及攜帶參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08結(jié)合Vue控制字符和字節(jié)的顯示個(gè)數(shù)的示例
這篇文章主要介紹了結(jié)合Vue控制字符和字節(jié)的顯示個(gè)數(shù)的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05vue項(xiàng)目打包之后生成一個(gè)可修改IP地址的文件(具體操作)
這篇文章主要介紹了vue項(xiàng)目打包之后生成一個(gè)可修改IP地址的文件(具體操作),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03