在 uni-app
微信小程序項目開發中,發現騰訊統計 mta
不上報數據。vue
uni-app
框架與 mta
組件都對原生的 Page
對象進行了重寫,在 onLoad
生命週期函數中上報數據,這一點開發者無感知uni-app
框架會首先加載自身框架腳本,致使 mta
後加載的腳本對 Page
對象重寫無效(二者衝突)mta
組件中設置了 "autoReport": true
會致使數據不上報("autoReport": false
配置不受影響,由於不須要重寫 Page
)uni-app 框架腳本重寫 Page
:git
var MPPage = Page; Page = function Page() {var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; initHook('onLoad', options); return MPPage(options); };
mta-wechat-analysis.js 重寫 Page
:github
function initOnload() { var a = Page; Page = function (b) { var c = b.onLoad; b.onLoad = function (a) { c && c.call(this, a); MTA.Data.lastPageQuery = MTA.Data.pageQuery; MTA.Data.pageQuery = a; MTA.Data.lastPageUrl = MTA.Data.pageUrl; MTA.Data.pageUrl = getPagePath(); MTA.Data.show = !1; MTA.Page.init() }; a(b) } }
按理說,先後兩次對 Page
進行重寫,應該是不衝突、都有效的,但 uni-app
在對 Vue 組件轉微信小程序原生組件時,使用了局部封裝的函數,致使後面其餘腳本對 Page
的重寫無效小程序
function createPage(vuePageOptions) { return Component(parsePage(vuePageOptions)); }
有兩個解決方案:微信小程序
mta-wechat-analysis.js
腳本放到 uni-app
框架腳本以前加載,但官方並無提供這個功能,因此放棄這個方法由於 Vue 組件是不能重寫生命週期函數的,因此只能重寫調用生命週期函數的方法 Vue.prototype.__call_hook
:微信
mta-wechat-analysis.js
:app
- function initOnload() { - var a = Page; - Page = function (b) { - var c = b.onLoad; - b.onLoad = function (a) { - c && c.call(this, a); - MTA.Data.lastPageQuery = MTA.Data.pageQuery; - MTA.Data.pageQuery = a; - MTA.Data.lastPageUrl = MTA.Data.pageUrl; - MTA.Data.pageUrl = getPagePath(); - MTA.Data.show = !1; - MTA.Page.init() - }; - a(b) - } - } + import Vue from 'vue'; + + function initOnload() { + // 重寫 Vue.prototype.__call_hook 方法 + Vue.prototype.__call_hook_proxy = Vue.prototype.__call_hook; + Vue.prototype.__call_hook = function(hook, args) { + if (hook === 'onLoad') { + MTA.Data.lastPageQuery = MTA.Data.pageQuery; + MTA.Data.pageQuery = args; + MTA.Data.lastPageUrl = MTA.Data.pageUrl; + MTA.Data.pageUrl = getPagePath(); + MTA.Data.show = !1; + MTA.Page.init(); + } + this.__call_hook_proxy(hook, args); + }; + }
改寫後的 mta-wechat-analysis.js 腳本能夠點這裏下載。框架
更多博客,查看 https://github.com/senntyou/blogs函數
做者:深予之 (@senntyou)this
版權聲明:自由轉載-非商用-非衍生-保持署名(創意共享 3.0 許可證)