之前做的上傳水印這塊的功能。
有時候由於網絡過慢,重復點擊的話可能會導致重復打包(生成照片包)。本身做法可以在請求的過程中可以讓button禁用,這個就不多討論。
我當時臨時采用的是利用一個變量來控制,請求發出前把變量全局變量isSaving變成true,然后再按鈕的點擊事件剛進來的時候判讀,如果isSaving是true的話那么就return。
saveAndShare(){ if(isSaving){ return } let files = this.data.files; let _this = this; if(files.length == 0){ wx.showModal({ content: '請上傳照片!', showCancel: false, success: function (res) { if (res.confirm) { _this.chooseImage() } } }) return } if(!this.data.title){ wx.showModal({ content: '請填寫標題', showCancel: false, success: function (res) { _this.setData({ titleFocus:true }) } }) return } //驗證是不是上傳圖片后面時才加的水印,這里需要重新攔截處理 //無需考慮復雜操作,只考慮同款水印,要么都有,要么沒有。 //第一步:驗證圖片路徑有沒有水印信息。 if (!files[0].includes('x-oss-process') && _this.data.encodeWord){ console.log('執行') for(let i = 0;i<files.length;i++){ files[i] += '?' + _this.data.urlHead + _this.data.encodeWord + _this.data.urlFoot; } } let uid = wx.getStorageSync('id'); let contentList = []; let creator = null; for(let i = 0;i < files.length;i++){ contentList.push({ sequence:i, path: files[i].replace(_this.data.host,'') }) } if (app.globalData.userInfo){ creator = app.globalData.userInfo.nickName; } isSaving = true wx.request({ url: util.head+'/mp/pr/img/package', method: 'POST', data: { uid, watermark: _this.data.word, title: _this.data.title, notes: _this.data.note, creator, contentList, contentNum: _this.data.files.length }, success: function (res) { console.log(res.data) if (res.data.status == 'SUCCESS'){ let id = res.data.data; let creator = app.globalData.userInfo.nickName; let face = _this.data.files[0].split('?')[0]; let title = _this.data.title wx.showToast({ title: '打包成功', icon: 'success', duration: 1000, success: function () { setTimeout(function () { wx.reLaunch({ url: `/pages/msg/msg?id=${id}&creator=${creator}&face=${face}&title=${title}`, }) }, 800) } }) }else{ isSaving = false; wx.showToast({ title: '打包失敗', icon: 'none', duration: 1000 }) } } }) }, /**
其實這里我的漏洞是打包成功后應該把變量還原的。但是考慮到成功后會relauch跳轉到消息頁。
根據官方的路由說明,重啟動路由方式執行后,當前的這個上傳頁面會unload掉。
包括我進入了消息頁之后(消息頁是非Tab頁),然后用switchTab進入了列表頁(第二個tab選項),再重新切到第一個tab選項,再點擊navigate進入回到上傳頁面,一系列操作后,
講道理頁面第一步的時候已經卸載掉了,重新進入也是執行onload的,但是為什么isSaving還是true呢?
原因分析:小程序考慮到內存問題的情況下,所以在不同的路由情況會卸載路由前的頁面,以緩解內存壓力,但是可能這種不是完全的釋放內存,Unload卸載的是page對象內的一系列東西,包含data以及鈎子函數。
但是由於isSaving是寫在page外面的全局變量,還是存在於微信緩存中的,所以頁面卸載后再重新加載,它的值始終是沒有重置的。
以下是isSaving的寫法:
另外重新試了下,var聲明的isSaving 只是相對於組件的全局變量,我在打包成功后的跳轉到的消息頁page中打印是以下結果:
總結:對於自己的的沒有處理好數據導致的小Bug,對小程序的人認識又增進一步真的是喜憂參半。大家對於小程序的page鈎子函數,頁面unload的理解要多注意,分辨出page之外定義的偽全局變量帶來的影響。
追述:小程序page函數,app對象之外的變量類似為頂級變量。需要小程序退出(后台5分鍾或者內存超標)才會注銷。根據小程序的模塊化概念可以單獨抽離出js文件,再結合生命周期概念,小程序中定義的頁面這一概念來配合對應的onload,onshow,unload等鈎子,針對的是page整個對象,所以即使這個a變量和page函數是寫在一個wx.j文件里,但我們不能就看成是綁定在一起的整體,事實上頁面的卸載是執行的清理掉對應的page對象,而不是釋放整個js文件。所以a的值會始終保持一個狀態!
ps:以上只是自己的想法和推測,希望路過的大神能多多指正!