router的使用
<div id="app">
<h1>Hello App!</h1>
<p>
<!-- 使用 router-link 組件來導航. -->
<!-- 通過傳入 `to` 屬性指定鏈接. -->
<!-- <router-link> 默認會被渲染成一個 `<a>` 標籤 -->
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的組件將渲染在這裏 -->
<router-view></router-view>
</div>
// 定義路由
// 每個路由應該映射一個組件。 其中"component" 可以是
// 通過 Vue.extend() 創建的組件構造器,
// 或者,只是一個組件配置對象。
// 我們晚點再討論嵌套路由。
const routes = [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
// 創建 router 實例,然後傳 `routes` 配置
// 你還可以傳別的配置參數, 不過先這麼簡單着吧。
const router = new VueRouter({
routes // (縮寫) 相當於 routes: routes
})
動態路由
- 什麼是動態路由?
動態路由就是可以接收參數數據的路由形式,路由地址的一部分是會發生變化的 - 如何接收動態路由傳遞的參數?
$route.params
通過props屬性獲取與傳遞參數數據的方式
A.我們可以將props屬性設置爲true,route.params將會被設置爲組件屬性,那麼組件可以通過props接收route.params
B.可以將props屬性設置爲一個對象,那麼組件可以通過props接收對象的數據
C.還可以將props屬性設置爲一個函數,那麼就可以同時將參數數據以及對象數據傳遞給組件。
編程式導航與路由傳參
// 1. 用name路徑的方式進行路由傳參
this.$router.push({ name: 'Goods', params: { goodsID: id } })
// 2. 用path路徑的方式進行路由傳參
this.$router.push({path:'goods',query:{goodsID:id}})
//接收this.$route.query.goodsID
Hash與History模式
vue- router默認hash模式, ur使用#後面定位路由,對seo不利,設置history,就可以使用普通的url模式
history模式即普通url模式,這種模式充分利用history.pushState API來完成URL跳轉而無須重新加載頁面
使用:
const router = new VueRouter({
mode: 'history',
routes: [...]
})
兩者的區別
- hash模式url帶#號,history模式不帶#號
- 如果考慮url規範的話,那就需要使用history模式,因爲history模式不帶#,是個正常的url,適合開發習慣
- 把用Vue和React做的頁面分享至第三方APP,有的app是不允許帶url的,所以要用history模式
- 使用history的一個問題就是,在訪問二級頁面的時候,做刷新操作會出現404錯誤,那麼就需要和後端人配合讓特配置一下Apache或者是Nginx的url重定向,重定向到你的首頁路由
路由守衛
可以用來做用戶在沒有登錄註冊時的攔截
你可以使用 router.beforeEach
註冊一個全局前置守衛:
const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
// ...
})
每個守衛方法接收三個參數:
- to: Route: 即將要進入的目標 路由對象
- from: Route: 當前導航正要離開的路由
- next: Function: 一定要調用該方法來 resolve 這個鉤子。執行效果依賴 next 方法的調用參數。
組件中的守衛
- beforeRouteEnter
- beforeRouteUpdate
- beforeRouteLeave
const Foo = {
template: `...`,
beforeRouteEnter (to, from, next) {
// 在渲染該組件的對應路由被 confirm 前調用
// 不!能!獲取組件實例 `this`
// 因爲當守衛執行前,組件實例還沒被創建
},
beforeRouteUpdate (to, from, next) {
// 在當前路由改變,但是該組件被複用時調用
// 舉例來說,對於一個帶有動態參數的路徑 /foo/:id,在 /foo/1 和 /foo/2 之間跳轉的時候,
// 由於會渲染同樣的 Foo 組件,因此組件實例會被複用。而這個鉤子就會在這個情況下被調用。
// 可以訪問組件實例 `this`
},
beforeRouteLeave (to, from, next) {
// 導航離開該組件的對應路由時調用
// 可以訪問組件實例 `this`
}
}