
當用戶在瀏覽器端進行路由導航時,有些目標路由的組件需要從服務器端抓取數據,再把這些數據顯示到網頁上。抓取數據有以下兩種方式。
(1)導航後抓取:在導航完成後,在目標路由的組件的生命周期函數中抓取數據。在抓取的過程中,可以在網頁上顯示「正在加載中...」的提示信息。
(2)導航前抓取:先在導航守衛函數beforeRouteEnter()和beforeRouteUpdate()中抓取數據,接下來再進行導航。
以上兩種方式都能完成抓取任務,到底選用哪一種,取決於開發人員的喜好及開發團隊的要求。
1
導航後抓取
例程1定義了ItemPostFetch組件,在它的created()鈎子函數中,調用$watch()函數監聽$route.params變量,如果該變量發生更新,就會執行fetchData()方法。該$watch()函數的第三個參數{ immediate: true }確保在ItemPostFetch組件的初始化階段也會執行一次fetchData()方法。
fetchData()方法負責抓取數據,在實際應用中,會通過Ajax請求到服務器端抓取數據,本方法做了簡化,通過setTimeOut()函數模擬耗時的抓取數據的行為。
■ 例程1 ItemPostFetch.vue
在index.js中,為ItemPostFetch組件設置如下路由:
通過瀏覽器訪問http://localhost:8080/#/postfetch/1,會看到網頁上首先顯示「商品數據加載中...」,接下來再顯示id為1的商品信息。
通過瀏覽器訪問http://localhost:8080/#/postfetch/5,會看到網頁上首先顯示「商品數據加載中...」,接下來再顯示「商品數據加載失敗」。
2
導航前抓取
在例程2定義了ItemPreFetch組件。在beforeRouteEnter()和beforeRouteUpdate()導航守衛函數中都會通過fetchData()函數抓取數據。fetchData()是一個獨立的函數,不屬於ItemPreFetch組件。fetchData()函數有一個作為回調函數的callback參數,當抓取數據完畢後,callback回調函數會把item變量和isError變量賦值給ItemPreFetch組件的item變量和isError變量。
由於在beforeRouteEnter()函數中不能通過this關鍵字訪問ItemPreFetch組件,因此通過next()函數來為ItemPreFetch組件的item變量和isError變量賦值。
■ 例程2 ItemPreFetch.vue
beforeRouteEnter()函數如果不使用next參數,還可以改寫為:
在index.js中,為ItemPreFetch組件設置如下路由:
通過瀏覽器訪問http://localhost:8080/#/prefetch/1,會看到網頁首先停留在原來的頁面,接下來再顯示id為1的商品信息。
通過瀏覽器訪問http://localhost:8080/#/prefetch/5,會看到網頁首先停留在原來的頁面,接下來再顯示「商品數據加載失敗」。
3
參考書籍

《精通Vue.js:Web前端開發技術詳解(微課視頻版)》
詳細闡述用Vue框架的各種技術;深刻揭示前端開發的響應式編程核心思想;介紹與其他流行技術的整合;典型範例幫助讀者迅速獲得實戰經驗。
ISBN:9787302602903
作者:孫衛琴,杜聚賓
價格:119元



實例講解
精通Vue.js:
Web前端開發技術詳解

精彩回顧
1. Vue組件的命名規則
2. 註冊全局組件和局部組件
下期預告
4. 路由管理器的基本用法
5. 命名路由
6. CSS中DOM元素的過渡模式
7. 插槽slot的基本用法
8. 組件的遞歸
9. 在Vue項目中使用Axios
10. 自定義指令v-drag範例
11. Vuex中的異步操作
12. 分割setup函數
13. Vue組件的單向數據流
14. Vue的數據監聽



