Vue Router 是 Vue.js 官方路由管理插件,它是構建單頁應用程序 (SPA) 的必要工具之一,為我們提供了路由系統和組件生命周期的鉤子,幫助我們實現不同的頁面之間的跳轉和可復用組件,它具有易用性,自定義性,輕量性等特點。
在 Vue Router 的使用中,由于不同的頁面可能需要不同的數據,我們需要在路由切換之前從后端獲取數據,再交給組件進行渲染,這意味著我們需要處理 Vue Router 和數據獲取的配合問題。
一般來說,我們可以在 Vue Router 中設置一個異步的數據獲取方法,在路由切換之前調用,這樣可以確保每個組件在進入之前都已具備所需的數據。這里我們可以使用組件的生命周期鉤子函數 beforeRouteEnter(),在鉤子函數內使用 vue-resource 等數據獲取工具,將數據保存在組件的 data 中。示例代碼如下:
beforeRouteEnter(to, from, next) { Vue.http.get('/api/getdata').then(response =>{ next(vm =>{ vm.data = response.data; }); }); }
這里我們使用 vue-resource 發送了異步的 get 請求,獲取了數據,之后將數據存放于組件中。注意,在 beforeRouteEnter() 鉤子函數內,我們不能直接訪問組件實例,因此我們需要將獲取的數據通過 next() 調用后傳遞給虛擬組件 vm,最終實現數據在組件中的存放。
但在實際應用中,我們通常需要進行細致的數據處理和異常處理,這就需要我們在獲取數據之前,對異步請求進行封裝。舉個例子,我們可以定義一個 Vue 的插件 vue-loader,在其中封裝我們的數據加載方式。示例代碼如下:
const vueLoader = { install(Vue, options) { Vue.prototype.$loader = function(url, successCB, errorCB) { Vue.http.get(url).then(response =>{ successCB(response.data); }, response =>{ if (response.status === 401) { errorCB('Unauthorized'); } else if (response.status === 404) { errorCB('Not Found'); } else if (response.status === 500) { errorCB('Server Internal Error'); } else { errorCB('Unknown Error'); } }); }, Vue.mixin({ beforeRouteEnter(to, from, next) { next(vm =>{ vm.$loader('/api/getdata', data =>{ vm.data = data; }, err =>{ vm.$router.push('/error/' + err); }); }); } }); } }; Vue.use(vueLoader);
這里我們定義了一個插件 vueLoader,在這個插件內封裝了我們的數據獲取方式,并將其掛載到 Vue.prototype 上,這樣在每個組件中我們就可以直接使用 this.$loader() 來獲取數據,同時在插件中為我們進行異常處理。
最后,我們需要注意,在進行數據獲取的過程中,如果數據的來源是來自用戶的輸入等非可控源,則需要進行一系列的輸入檢查和過濾,以避免輕易地被注入惡意腳本等攻擊。