(轉)Vue 爬坑之路(三)—— 使用 vue-router 跳轉頁面

使用 Vue.js 作項目的時候,一個頁面是由多個組件構成的,因此在跳轉頁面的時候,並不適合用傳統的 href,因而 vue-router 應運而生。html

官方文檔: https://router.vuejs.org/zh-cn/essentials/getting-started.htmlvue

 

有不少朋友找我要 demo,可是博客中的這個案例被我刪掉了,我只好隨手寫了一個超簡單的 demo,但願能有所幫助web

連接: https://pan.baidu.com/s/1pMfi5tD  密碼: pjwxvue-router

 

此次的實例主要實現下圖的效果:vue-cli

 

項目結構:npm

 

 

1、配置 Router編程

 用 vue-cli 建立的初始模板裏面,並無 vue-router,須要經過 npm 安裝app

cnpm i vue-router -D

安裝完成後,在 src 文件夾下,建立一個 routers.js 文件,和 main.js 平級函數

而後在 router.js 中引入所需的組件,建立 routers 對象學習

複製代碼
import Home from './components/home.vue'

const routers = [ { path: '/home', name: 'home', component: Home },
{ path: '/', component: Home },
]
export default routers

複製代碼

在建立的 routers 對象中, path 配置了路由的路徑,component 配置了映射的組件

須要注意的是,export default routers 必須寫在文件底部,並且後面還須要接一空行,不然沒法經過 ESlint 語法驗證

 

而後 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) })
複製代碼

在建立的 router 對象中,若是不配置 mode,就會使用默認的 hash 模式,該模式下會將路徑格式化爲 #! 開頭。

添加 mode: 'history' 以後將使用 HTML5 history 模式,該模式下沒有 # 前綴,並且可使用 pushState 和 replaceState 來管理記錄。

關於 HTML5 history 模式的更多內容,能夠參考官方文檔:https://router.vuejs.org/zh-cn/essentials/history-mode.html

 

 

2、嵌套路由

在這個實例中,爲了加深項目層級,App.vue 只是做爲一個存放組件的容器:

其中 <router-view> 是用來渲染經過路由映射過來的組件,當路徑更改時,<router-view> 中的內容也會發生更改

上面已經配置了兩個路由,當打開 http://localhost:8080 或者 http://localhost:8080/home 的時候,就會在 <router-view> 中渲染 home.vue 組件

 

home.vue 是真正的父組件,first.vue、login.vue 等子組件都會渲染到 home.vue 中的 <router-view>

 

如此一來,就須要在一級路由中嵌套二級路由,修改 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 中添加二級路由,就能實現路由嵌套

配置 path 的時候,以 " / " 開頭的嵌套路徑會被看成根路徑,因此子路由的 path 不須要添加 " / "

 

 

3、使用 <router-link> 映射路由

home.vue 中引入了 header.vue 組件,其中含有導航菜單

當點擊導航菜單的時候,會切換 home.vue 中 <router-view> 中的內容

這種只須要跳轉頁面,不須要添加驗證方法的狀況,可使用 <router-link> 來實現導航的功能:

在編譯以後,<router-link> 會被渲染爲 <a> 標籤, to 會被渲染爲 href,當 <router-link> 被點擊的時候,url 會發生相應的改變

若是使用 v-bind 指令,還能夠在 to 後面接變量,配合 v-for 指令能夠渲染導航菜單

 

若是對於全部 ID 各不相同的用戶,都要使用 home 組件來渲染,能夠在 routers.js 中添加動態參數

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

這樣 "/home/user01"、"/home/user02"、"/home/user03" 等路由,都會映射到 Home 組件

而後還可使用 $route.params.id 來獲取到對應的 id

 

 

4、編程式導航

實際狀況下,有不少按鈕在執行跳轉以前,還會執行一系列方法,這時可使用 this.$router.push(location) 來修改 url,完成跳轉

push 後面能夠是對象,也能夠是字符串:

複製代碼
// 字符串 this.$router.push('/home/first') // 對象 this.$router.push({ path: '/home/first' }) // 命名的路由 this.$router.push({ name: 'home', params: { userId: wise }})
複製代碼

 

 

5、前車可鑑

在學習的過程當中,遇到一個困擾許久的問題,大概是從 first 組件跳轉回 login 以後,沒法再跳轉回去。可是 url 已經被修改,刷新頁面也能正常顯示。

這是由於我在 first.vue 組件中的 data 裏面沒有寫 return

 

在 vue 組件中,data 必須寫爲函數,且須要用 return 來返回參數。可是當 data 爲空時,即便不寫 return 也不會報錯,因此致使了上面的問題。

原文出處:http://www.cnblogs.com/wisewrong/p/6277262.html

相關文章
相關標籤/搜索