起步
創(chuàng)新互聯(lián)公司基于分布式IDC數(shù)據(jù)中心構(gòu)建的平臺為眾多戶提供聯(lián)通機(jī)房服務(wù)器托管 四川大帶寬租用 成都機(jī)柜租用 成都服務(wù)器租用。
HTML
Hello App!
Go to Foo Go to Bar
JavaScript
// 0. 如果使用模塊化機(jī)制編程,導(dǎo)入Vue和VueRouter,要調(diào)用 Vue.use(VueRouter) // 1. 定義 (路由) 組件。 // 可以從其他文件 import 進(jìn)來 const Foo = { template: 'foo' } const Bar = { template: 'bar' } // 2. 定義路由 // 每個路由應(yīng)該映射一個組件。 其中"component" 可以是 // 通過 Vue.extend() 創(chuàng)建的組件構(gòu)造器, // 或者,只是一個組件配置對象。 // 我們晚點(diǎn)再討論嵌套路由。 const routes = [ { path: '/foo', component: Foo }, { path: '/bar', component: Bar } ] // 3. 創(chuàng)建 router 實(shí)例,然后傳 `routes` 配置 // 你還可以傳別的配置參數(shù), 不過先這么簡單著吧。 const router = new VueRouter({ routes // (縮寫) 相當(dāng)于 routes: routes }) // 4. 創(chuàng)建和掛載根實(shí)例。 // 記得要通過 router 配置參數(shù)注入路由, // 從而讓整個應(yīng)用都有路由功能 const app = new Vue({ router }).$mount('#app') // 現(xiàn)在,應(yīng)用已經(jīng)啟動了!
通過注入路由器,我們可以在任何組件內(nèi)通過 this.$router 訪問路由器,也可以通過 this.$route 訪問當(dāng)前路由:
export default { computed: { username () { // 我們很快就會看到 `params` 是什么 return this.$route.params.username } }, methods: { goBack () { window.history.length > 1 ? this.$router.go(-1) : this.$router.push('/') } } }
routes 選項(xiàng) (Array)
redirect(重定向 )
//此時訪問/a會跳轉(zhuǎn)到/b const router = new VueRouter({ routes: [ { path: '/a', redirect: '/b' } ] }) //重定向的目標(biāo)也可以是一個命名的路由: const router = new VueRouter({ routes: [ { path: '/a', redirect: { name: 'foo' }} ] }) //甚至是一個方法,動態(tài)返回重定向目標(biāo): const router = new VueRouter({ routes: [ { path: '/a', redirect: to => { // 方法接收 目標(biāo)路由 作為參數(shù) // return 重定向的 字符串路徑/路徑對象 }} ] })
命名路由
export default [ { path:'/', redirect:'/app' //默認(rèn)跳轉(zhuǎn)路由 }, { path: '/app', //路由命名,可用于跳轉(zhuǎn) name: 'app', } ] //可用于跳轉(zhuǎn)app
路由元信息
定義路由的時候可以配置 meta 字段:
export default [ { path:'/', redirect:'/app' //默認(rèn)跳轉(zhuǎn)路由 }, { path: '/app', //**相當(dāng)于HTML的meta標(biāo)簽** meta: { title: 'this is app', description: 'asdasd' }, } ]
嵌套路由
export default [ { path:'/', redirect:'/app' //默認(rèn)跳轉(zhuǎn)路由 }, { path: '/app', //子路由 匹配 /app/test children: [ { path: 'test', component: Login } ] } ]
路由組件傳參
export default [ { path:'/', redirect:'/app' //默認(rèn)跳轉(zhuǎn)路由 }, { path: '/app/:id', // /app/xxx ,組件內(nèi)部可以通過$route.params.id拿到這個值 // 會把:后面的參數(shù)通過props傳遞給組件Todozhong 中 //布爾模式 props: true, //對象模式 props:{id:456} //函數(shù)模式 props: (route) => ({ id: route.query.b }), component: Todo, } ]
mode選項(xiàng)(string)
vue-router 默認(rèn) hash 模式 —— 使用 URL 的 hash 來模擬一個完整的 URL,于是當(dāng) URL 改變時,頁面不會重新加載。
如果不想要很丑的 hash,我們可以用路由的 history 模式,這種模式充分利用 history.pushState API 來完成 URL 跳轉(zhuǎn)而無須重新加載頁面。
const router = new VueRouter({ mode: 'history', routes: [...] })
這種模式要玩好,還需要后臺配置支持。
base(string)
應(yīng)用的基路徑。例如,如果整個單頁應(yīng)用服務(wù)在 /app/ 下,然后 base 就應(yīng)該設(shè)為 "/app/"
return new Router({ routes, mode: 'history',//默認(rèn)使用hash# base: '/base/', //在path前面都會加上/base/,基路徑 })
linkActiveClass(string)
默認(rèn)值: "router-link-active"
全局配置
return new Router({ routes, mode: 'history',//默認(rèn)使用hash# base: '/base/', //在path前面都會加上/base/,基路徑 // 點(diǎn)擊calss名字 linkActiveClass: 'active-link', //匹配到其中一個子集 linkExactActiveClass: 'exact-active-link',//完全匹配 })
linkExactActiveClass(string)
默認(rèn)值: "router-link-exact-active"
全局配置
scrollBehavior(Function)
路由跳轉(zhuǎn)后是否滾動
export default () => { return new Router({ routes, mode: 'history',//默認(rèn)使用hash# base: '/base/', //在path前面都會加上/base/,基路徑 //頁面跳轉(zhuǎn)是否需要滾動 /* to:去向路由,完整路由對象 from:來源路由 savedPosition:保存的滾動位置 */ scrollBehavior (to, from, savedPosition) { if (savedPosition) { return savedPosition } else { return { x: 0, y: 0 } } }, }) }
parseQuery / stringifyQuery (Function)
/每次import都會創(chuàng)建一個router,避免每次都是同一個router export default () => { return new Router({ routes, mode: 'history',//默認(rèn)使用hash# base: '/base/', //在path前面都會加上/base/,基路徑 // 路由后面的參數(shù)?a=2&b=3,string->object parseQuery (query) { }, //object->string stringifyQuery (obj) { } }) }
fallback(boolean)
當(dāng)瀏覽器不支持 history.pushState 控制路由是否應(yīng)該回退到 hash 模式。默認(rèn)值為 true。
如果設(shè)置為false,則跳轉(zhuǎn)后刷新頁面,相當(dāng)于多頁應(yīng)用
過渡動效
高級用法
命名視圖
const router = new VueRouter({ routes: [ { path: '/', components: { //默認(rèn)組件 default: Foo, //命名組件 a: Bar, b: Baz } } ] })
導(dǎo)航守衛(wèi)
全局守衛(wèi)
import Vue from 'vue' import VueRouter from 'vue-router' import App from './app.vue' import './assets/styles/global.styl' // const root = document.createElement('div') // document.body.appendChild(root) import createRouter from './config/router' Vue.use(VueRouter) const router = createRouter() // 全局導(dǎo)航守衛(wèi)(鉤子) // 驗(yàn)證一些用戶是否登錄 router.beforeEach((to, from, next) => { console.log('before each invoked') next() // if (to.fullPath === '/app') { // next({ path: '/login' }) // console.log('to.fullPath :'+to.fullPath ) // } else { // next() // } }) router.beforeResolve((to, from, next) => { console.log('before resolve invoked') next() }) // 每次跳轉(zhuǎn)后觸發(fā) router.afterEach((to, from) => { console.log('after each invoked') }) new Vue({ router, render: (h) => h(App) }).$mount("#root")
路由獨(dú)享的守衛(wèi)
可以在路由配置上直接定義 beforeEnter 守衛(wèi):
export default [ { path:'/', redirect:'/app' //默認(rèn)跳轉(zhuǎn)路由 }, { path: '/app', // 路由獨(dú)享的守衛(wèi)鉤子 beforeEnter(to, from, next) { console.log('app route before enter') next() } component: Todo, } ]
組件內(nèi)的守衛(wèi)
export default { //進(jìn)來之前 beforeRouteEnter(to, from, next) { // 不!能!獲取組件實(shí)例 `this` // 因?yàn)楫?dāng)守衛(wèi)執(zhí)行前,組件實(shí)例還沒被創(chuàng)建 console.log("todo before enter", this); //todo before enter undefined //可以通過傳一個回調(diào)給 next來訪問組件實(shí)例。在導(dǎo)航被確認(rèn)的時候執(zhí)行回調(diào),并且把組件實(shí)例作為回調(diào)方法的參數(shù)。 next(vm => { // 通過 `vm` 訪問組件實(shí)例 console.log("after enter vm.id is ", vm.id); }); }, //更新的時候 beforeRouteUpdate(to, from, next) { console.log("todo update enter"); next(); }, // 路由離開 beforeRouteLeave(to, from, next) { console.log("todo leave enter"); const answer = window.confirm('Do you really want to leave? you have unsaved changes!') if (answer) { next() } else { //以通過 next(false) 來取消。 next(false) } }, props:['id'], components: { Item, Tabs }, mounted() { console.log(this.id) }, };
路由懶加載
參考:路由懶加載
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。