摘要:可以從其他文件進來定義路由每個路由應該映射一個組件。其中可以是通過創建的組件構造器,或者,只是一個組件配置對象。我們晚點再討論嵌套路由。通過訪問組件實例更新的時候路由離開以通過來取消。路由懶加載參考路由懶加載
起步
HTML
Hello App!
Go to Foo Go to Bar
JavaScript
// 0. 如果使用模塊化機制編程,導入Vue和VueRouter,要調用 Vue.use(VueRouter) // 1. 定義 (路由) 組件。 // 可以從其他文件 import 進來 const Foo = { template: "foo" } const Bar = { template: "bar" } // 2. 定義路由 // 每個路由應該映射一個組件。 其中"component" 可以是 // 通過 Vue.extend() 創建的組件構造器, // 或者,只是一個組件配置對象。 // 我們晚點再討論嵌套路由。 const routes = [ { path: "/foo", component: Foo }, { path: "/bar", component: Bar } ] // 3. 創建 router 實例,然后傳 `routes` 配置 // 你還可以傳別的配置參數, 不過先這么簡單著吧。 const router = new VueRouter({ routes // (縮寫) 相當于 routes: routes }) // 4. 創建和掛載根實例。 // 記得要通過 router 配置參數注入路由, // 從而讓整個應用都有路由功能 const app = new Vue({ router }).$mount("#app") // 現在,應用已經啟動了!
通過注入路由器,我們可以在任何組件內通過 this.$router 訪問路由器,也可以通過 this.$route 訪問當前路由:
export default { computed: { username () { // 我們很快就會看到 `params` 是什么 return this.$route.params.username } }, methods: { goBack () { window.history.length > 1 ? this.$router.go(-1) : this.$router.push("/") } } }routes 選項 (Array) redirect(重定向 )
//此時訪問/a會跳轉到/b const router = new VueRouter({ routes: [ { path: "/a", redirect: "/b" } ] }) //重定向的目標也可以是一個命名的路由: const router = new VueRouter({ routes: [ { path: "/a", redirect: { name: "foo" }} ] }) //甚至是一個方法,動態返回重定向目標: const router = new VueRouter({ routes: [ { path: "/a", redirect: to => { // 方法接收 目標路由 作為參數 // return 重定向的 字符串路徑/路徑對象 }} ] })命名路由
export default [ { path:"/", redirect:"/app" //默認跳轉路由 }, { path: "/app", //路由命名,可用于跳轉 name: "app", } ] //可用于跳轉路由元信息app
定義路由的時候可以配置 meta 字段:
export default [ { path:"/", redirect:"/app" //默認跳轉路由 }, { path: "/app", //**相當于HTML的meta標簽** meta: { title: "this is app", description: "asdasd" }, } ]嵌套路由
export default [ { path:"/", redirect:"/app" //默認跳轉路由 }, { path: "/app", //子路由 匹配 /app/test children: [ { path: "test", component: Login } ] } ]路由組件傳參
export default [ { path:"/", redirect:"/app" //默認跳轉路由 }, { path: "/app/:id", // /app/xxx ,組件內部可以通過$route.params.id拿到這個值 // 會把:后面的參數通過props傳遞給組件Todozhong 中 //布爾模式 props: true, //對象模式 props:{id:456} //函數模式 props: (route) => ({ id: route.query.b }), component: Todo, } ]mode選項(string)
vue-router 默認 hash 模式 —— 使用 URL 的 hash 來模擬一個完整的 URL,于是當 URL 改變時,頁面不會重新加載。
如果不想要很丑的 hash,我們可以用路由的 history 模式,這種模式充分利用 history.pushState API 來完成 URL 跳轉而無須重新加載頁面。
const router = new VueRouter({ mode: "history", routes: [...] })
這種模式要玩好,還需要后臺配置支持。
base(string)應用的基路徑。例如,如果整個單頁應用服務在 /app/ 下,然后 base 就應該設為 "/app/"
return new Router({ routes, mode: "history",//默認使用hash# base: "/base/", //在path前面都會加上/base/,基路徑 })linkActiveClass(string)
默認值: "router-link-active"
全局配置
return new Router({ routes, mode: "history",//默認使用hash# base: "/base/", //在path前面都會加上/base/,基路徑 // 點擊calss名字 linkActiveClass: "active-link", //匹配到其中一個子集 linkExactActiveClass: "exact-active-link",//完全匹配 })linkExactActiveClass(string)
默認值: "router-link-exact-active"
全局配置
路由跳轉后是否滾動
export default () => { return new Router({ routes, mode: "history",//默認使用hash# base: "/base/", //在path前面都會加上/base/,基路徑 //頁面跳轉是否需要滾動 /* to:去向路由,完整路由對象 from:來源路由 savedPosition:保存的滾動位置 */ scrollBehavior (to, from, savedPosition) { if (savedPosition) { return savedPosition } else { return { x: 0, y: 0 } } }, }) }parseQuery / stringifyQuery (Function)
/每次import都會創建一個router,避免每次都是同一個router export default () => { return new Router({ routes, mode: "history",//默認使用hash# base: "/base/", //在path前面都會加上/base/,基路徑 // 路由后面的參數?a=2&b=3,string->object parseQuery (query) { }, //object->string stringifyQuery (obj) { } }) }fallback(boolean)
當瀏覽器不支持 history.pushState 控制路由是否應該回退到 hash 模式。默認值為 true。
如果設置為false,則跳轉后刷新頁面,相當于多頁應用
高級用法 命名視圖
導航守衛const router = new VueRouter({ routes: [ { path: "/", components: { //默認組件 default: Foo, //命名組件 a: Bar, b: Baz } } ] })
全局守衛
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() // 全局導航守衛(鉤子) // 驗證一些用戶是否登錄 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() }) // 每次跳轉后觸發 router.afterEach((to, from) => { console.log("after each invoked") }) new Vue({ router, render: (h) => h(App) }).$mount("#root")
路由獨享的守衛
可以在路由配置上直接定義 beforeEnter 守衛:
export default [ { path:"/", redirect:"/app" //默認跳轉路由 }, { path: "/app", // 路由獨享的守衛鉤子 beforeEnter(to, from, next) { console.log("app route before enter") next() } component: Todo, } ]
組件內的守衛
export default { //進來之前 beforeRouteEnter(to, from, next) { // 不!能!獲取組件實例 `this` // 因為當守衛執行前,組件實例還沒被創建 console.log("todo before enter", this); //todo before enter undefined //可以通過傳一個回調給 next來訪問組件實例。在導航被確認的時候執行回調,并且把組件實例作為回調方法的參數。 next(vm => { // 通過 `vm` 訪問組件實例 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) }, };路由懶加載
參考:路由懶加載
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/96850.html
摘要:項目來源以前曾用過搭建自己的博客網站,但感覺很是臃腫。所以一直想自己寫一個博客內容管理器。正好近日看完了各個插件的文檔,就用著嘗試寫了這個簡約的博客內容管理器。關于后端后端是用作為服務器的,使用了框架。 項目來源 以前曾用過WordPress搭建自己的博客網站,但感覺WordPress很是臃腫。所以一直想自己寫一個博客內容管理器。 正好近日看完了Vue各個插件的文檔,就用著Vue嘗試寫...
摘要:學習筆記狀態管理與狀態管理與非父子組件跨級組件和兄弟組件通信時,使用了中央事件總線的一個方法,用來觸發和接收事件,進一步起到通信的作用。倉庫包含了應用的數據狀態和操作過程。新建文件,并寫入的配置,會依賴此配置文件來使用編譯代碼。 學習筆記:狀態管理與Vuex 狀態管理與Vuex 非父子組件(跨級組件和兄弟組件)通信時,使用了bus(中央事件總線)的一個方法,用來觸發和接收事件,進一步...
摘要:路由模塊的本質就是建立起和頁面之間的映射關系。模式的原理是事件監測值變化,可以在對象上監聽這個事件。這兩個方法應用于瀏覽器記錄棧,在當前已有的基礎之上,它們提供了對歷史記錄修改的功能。 vue-router 這里的路由并不是指我們平時所說的硬件路由器,這里的路由就是SPA(單頁應用)的路徑管理器。再通俗的說,vue-router就是WebApp的鏈接路徑管理系統。vue-router是...
摘要:提供了兩種向組件傳遞參數的方式。子路由項路徑不要使用開頭,以開頭的嵌套路徑會被當作根路徑。路由實例的方法這里學習兩個路由實例的方法和。實際上,是通過不同的將這些資源加載后打包,然后輸出打包后文件。 一、vue-router 1、簡介 我們經常使用vue開發單頁面應用程序(SPA)。在開發SPA過程中,路由是必不可少的部分,vue的官方推薦是vue-router。單頁面應用程序看起來好像...
摘要:提供了兩種向組件傳遞參數的方式。子路由項路徑不要使用開頭,以開頭的嵌套路徑會被當作根路徑。路由實例的方法這里學習兩個路由實例的方法和。實際上,是通過不同的將這些資源加載后打包,然后輸出打包后文件。 一、vue-router 1、簡介 我們經常使用vue開發單頁面應用程序(SPA)。在開發SPA過程中,路由是必不可少的部分,vue的官方推薦是vue-router。單頁面應用程序看起來好像...
閱讀 2520·2021-09-26 10:18
閱讀 3397·2021-09-22 10:02
閱讀 3196·2019-08-30 15:44
閱讀 3333·2019-08-30 15:44
閱讀 1838·2019-08-29 15:25
閱讀 2581·2019-08-26 14:04
閱讀 2047·2019-08-26 12:15
閱讀 2446·2019-08-26 11:43