mpvue 頁面預載入,新增preLoad生命週期
阿新 • • 發佈:2018-12-12
存在的必要性:mpvue開發微信小程式,在頁面跳轉到新頁面的過程中會有200ms左右的延遲,這個200ms如果用來請求新頁面的介面,那麼跳轉到新頁面或許已經渲染好了頁面。
就是兩種方式:
1.新頁面跳轉之前,就請求新頁面資料。
2.跳轉到新頁面後,再請求資料,可能還會有一個loading的狀態。
第二種方式是正常的的頁面跳轉,不say了。
這裡講解的都是第一種方式:
從上面結構圖可以看出系統跳轉的延時時間可以用來請求新資料,大大提高了使用者體驗性。
方案是有了,該怎麼實現呢。
我們知道mpvue的生命週期有onLoad mounted onShow 等。
我們自建一個preLoad生命週期進行頁面預載入邏輯處理。
是不是有個疑問,怎麼讓程式執行我們的這個preLoad生命週期呢?
講解一下vue的執行機制:
mpvue建立每個頁面都會有個main.js檔案,執行了app = new Vue(app);在專案初始化時,都會先被執行,push到一個數組裡,這就是小程式頁面堆疊的原理了。
原先的頁面跳轉,會執行這個App中的生命週期函式。找到一點靈感有沒有,我們可以在初始化時,對這個 App from './index' 的App物件進行全域性儲存。在跳轉時同時對執行App中preLoad函式進行呼叫,而小程式正常執行App生命週期,
當preLoad執行完後把資料傳給App return 中的這個物件,就實現了渲染更新。
export default{ data(){ return {} //把資料傳到這個物件上 } }
上程式碼:
兩個頁面,展示從joy-material 跳轉到home的過程
global.js
let $navs = { //作用收集每個頁面的例項App; }; let $router =(path,className)=>{ //每個頁面例項都會有個name欄位,進行$navs匹配
setTimeout(()=>{ wx.navigateTo({ url:path }); },150);
$navs[className].preLoad(); //匹配到新頁面的例項,呼叫preLoad函式,不影響正常跳轉。 }; export default { $navs:$navs, $router:$router };
joy-material index.vue
<template> <div class="joy-content"> <h4 class="normal-style" hover-stay-time="100" @tap="to">{{name}}</h4> </div> </template> <script> import pre from "@/utils/global" let m = { name:"material", data(){ return { name:"大蘋果" } }, mounted(){ }, methods :{ to(){ pre.$router("/pages/home/main","home"); //第二個引數是這個新頁面name欄位值,用來從$navs從匹配此例項。 } } }; pre.$navs[m.name] = m; //把例項儲存到全域性$navs中; export default m; </script> <style scoped lang="scss"> </style>
home index.vue
<template> <div>{{info}}</div> </template> <script> import pre from "@/utils/global" let data = { info:"1111" } let h = { name:"home", data(){ return data; }, mounted(){ }, preLoad(){ data.info = "pppppp"; } }; pre.$navs[h.name] = h; export default h; </script> <style scoped> </style>