vue與原生app的對接互動的方法(混合開發)
小夥伴們在用vue開發h5專案特別是移動端的專案,很多都是打包後掛載在原生APP上的,那就少不了與原生互動了,我把我踩的一些坑,拿出來給大家分享下。 1.通過url傳輸資料:(一般是在入口頁面傳下app的使用者資訊進來供vue h5使用)
methods: { // 接收url後的資料 urltext() { let loc = location.href; 6 let n1 = loc.length;//地址的總長度 let n2 = loc.indexOf("=");//取得=號的位置 let outToken = loc.substr(n2 + 1, n1 - n2);//從=號後面的內容 console.log(loc,n1,n2,outToken) this.outTokenPost(outToken) //傳到處理函式 }, }
2.原生APP提供一個介面物件的引用(例如一個掃碼的介面,可能還有回撥函式以獲得掃碼結果)
思路就是萬物通過window 進行互動
// 將vue元件的要回調的函式暴露出去 mounted:function(){ // 將subscanQRCallBack方法繫結到window下面,提供給外部呼叫 window['scanQRCallBack'] = (result) => { this.subscanQRCallBack(result) } }, methods:{ scan(){ // alert('開始掃碼了') window.client.startScanQR('OS與js互動',scanQRCallBack) // 通過window呼叫app提供的client物件 }, subscanQRCallBack(result){ // alert('掃碼結果6466:'+result); this.scanPost(result) }, }
前端全棧學習交流圈:866109386,面向1-3經驗年前端開發人員,幫助突破技術瓶頸,提升思維能力,群內有大量PDF可供自取,更有乾貨實戰專案視訊進群免費領取。
由互動引發的對vue生命週期的思考
開發時遇到一個經典問題,需要在頁面剛載入時與app互動判斷是否顯示一個彈窗。看似很簡單,進入頁面調一個互動方法即可,但這個需求的解決經歷了幾個步驟:
1、created
因為created時,例項就建立完成了,我開始的選擇是在此生命週期掛載方法並呼叫互動,結果:頁面閃退,猜測:例項雖有,但模板未編譯掛載,app呼叫方法失敗導致閃退
2、mounted 第二次將掛載和呼叫寫在了mounted內,結果:頁面閃退,猜測(誤):掛載和呼叫靠的太近,可能方法未掛載完就直接呼叫,導致閃退
3、created+mounted created內掛載方法,mounted內呼叫互動,結果:我的ios12無異常,幾乎以為成功時,ios10還是發生了閃退,猜測ios12的webview對此問題進行了優化,考慮相容性,方案不可行。
4、延時 猜測是window沒有載入完便呼叫了window下的方法,導致閃退,對互動方法加了1s延時,成功!但體驗一般,因為硬性的定時容易引發許多不可控的問題,而且彈窗延時的存在導致使用者體驗低下。
5、window.onload onload 事件會在頁面或影象載入完成後立即發生。mounted鉤子裡新增程式碼window.onload=function(){//呼叫互動},在window載入完成以後觸發互動,而且此時間節點在vue的生命週期是不存在的,也是在mounted、created鉤子後發生的,這個原生的方法還是很棒的,完美解決~!