怎么在小程序中實現(xiàn)跨頁面交互?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
創(chuàng)新互聯(lián)主營海南網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,重慶APP開發(fā)公司,海南h5重慶小程序開發(fā)搭建,海南網(wǎng)站營銷推廣歡迎海南等地區(qū)企業(yè)咨詢性能優(yōu)化類
對于小程序在頁面中點擊觸發(fā) wx.navigateTo 跳轉其他頁面,中間會有一段時間的空白加載期(對于分包出去的頁面,空白期則會更長),但是這是小程序內(nèi)部機制,沒有辦法進行優(yōu)化。我們只能眼睜睜的等待這段沒有意思的空白期過去。
當考慮到跳轉頁面后的第一件事情便是取數(shù)邏輯,那么我們是否能夠進行優(yōu)化呢?答案是肯定的。我們沒有辦法直接在當前頁面取得數(shù)據(jù)之后再進行跳轉操作(這樣操作更不好),但是我們卻可以利用緩存當前的請求,詳情可以參考我之前的博客文章 ——Promise對象 3 種妙用。
代碼如下:
const promiseCache = new Map() export function setCachePromise(key, promise) { promiseCache.set(key, promise) } export function getCachePromise(key) { // 根據(jù)key獲取當前的數(shù)據(jù) const promise = promiseCache.get(key) // 用完刪除,目前只做中轉用途,也可以添加其他用途 promiseCache.delete(key) return promise }
做一份全局的 Map,然后利用 Map 緩存 promise 對象,在跳轉之前代碼為:
// 導入 setCachePromise 函數(shù) Component({ methods: { getBookData(id) { const promise = // promise 請求 setCachePromise(`xxx:${id}`, promise) }, handleBookDetailShow(e) { const id = e.detail this.getBookData(id) wx.navigateTo({url: `xx/xx/x?id=${id}`}) } } })
而跳轉之后的代碼也如下所示:
// 導入 getCachePromise 函數(shù) Component({ properties: { id: Number }, lifetimes: { attached () { const id = this.data.id // 取得全局緩存的promise const bookPromise = getCachePromise(`xxx:${id}`) bookPromise.then((res) => { // 業(yè)務處理 }).catch(error => { // 錯誤處理 }) } }, methods: { getBook() { // 獲取數(shù)據(jù),以便于 錯誤處理 上拉刷新 等操作 } } })
如此便可以同時處理取數(shù)和頁面加載的邏輯,當然,這個對于頁面有耦合性,不利于后續(xù)的刪除與修改。但考慮如果僅僅加在分包跳轉之間可能會有不錯的效果。
想要無侵入式,可以進一步學習研究 微信小程序之提高應用速度小技巧 以及 wxpage 框架,同時考慮到無論是 ToC 還是 ToC 用戶,都有可能存在硬件以及網(wǎng)絡環(huán)境等問題,該優(yōu)化還是非常值得的。
當然微信小程序為了減少冷啟動時間,提供了周期性更新 數(shù)據(jù)預拉取 功能。
注: 上面的 promiseCache 只作為中轉的用途,不作為緩存的用途,如果你考慮添加緩存,可以參考我之前的博客文章—— 前端 api 請求緩存方案。
通知類
如果是 pc 端中進行交互,對于數(shù)據(jù)的 CRUD。例如在詳情頁面進行了數(shù)據(jù)的修改和刪除,返回列表時候就直接調(diào)取之前存儲的列表查詢條件再次查詢即可,而對于移動端這種下拉滾動的設計,就沒有辦法直接調(diào)用之前的查詢條件來進行搜索。
如果從列表頁面進入詳情頁面后,在詳情頁面只會進行添加或者修改操作。然后返回列表頁面。此時可以提示用戶數(shù)據(jù)已經(jīng)進行了修改,請用戶自行決定是否進行刷新操作。
如在編輯頁面修改了數(shù)據(jù):
const app = getApp() component({ methods: { async handleSave() { //... app.globalData.xxxChanged = true //... } } })
列表界面:
const app = getApp() component({ pageLifetimes: { show() { this.confirmThenRefresh() } }, methods: { confirmThenRefresh() { // 檢查 globalData,如果當前沒有進行修改,直接返回 if(!app.globalData.xxxChanged) return wx.showModal({ // ... complete: () => { // 無論確認刷新與否,都把數(shù)據(jù)置為 false app.globalData.xxxChanged = false } }) } } })
當然了,我們也可以利用 wx.setStorage 或者 getCurrentPage 獲取前面的頁面 setData 來進行數(shù)據(jù)通知,以便用戶進行頁面刷新。
訂閱發(fā)布類
如果僅僅只涉及到修改數(shù)據(jù)的前提下,我們可以選擇讓用戶進行刷新操作,但是如果針對于刪除操作而言,如果用戶選擇不進行刷新,然后用戶又不小心點擊到了已經(jīng)被刪除的數(shù)據(jù),就會發(fā)生錯誤。所以如果有刪除的需求,我們最好在返回列表頁面前就進行列表的修改,以免造成錯誤。
mitt
github 上有很多的 pub/sub 開源庫,如果沒有什么特定的需求,找到代碼量最少的就是 mitt 這個庫了,作者是喜歡開發(fā)微型庫的 developit 大佬,著名的 preact 也是出于這位大佬之手。 這里就不做過多的介紹,非常簡單。大家可能都能看明白,代碼如下(除去 flow 工具的檢查):
export default function mitt(all) { all = all || Object.create(null); return { on(type, handler) { (all[type] || (all[type] = [])).push(handler); }, off(type, handler) { if (all[type]) { all[type].splice(all[type].indexOf(handler) >>> 0, 1); } }, emit(type, evt) { (all[type] || []).slice().map((handler) => { handler(evt); }); (all['*'] || []).slice().map((handler) => { handler(type, evt); }); } }; }
僅僅只有3個方法,on emit以及 off。
只要在多個頁面導入 生成的 mitt() 函數(shù)生成的對象即可(或者直接放入 app.globalData 中也可)。
Component({ lifetimes: { attached: function() { // 頁面創(chuàng)建時執(zhí)行 const changeData = (type, data) => { // 處理傳遞過來的類型與數(shù)據(jù) } this._changed = changeData bus.on('xxxchanged', this._changed) }, detached: function() { // 頁面銷毀時執(zhí)行 bus.off('xxxchanged', this._changed) } } })
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
新聞名稱:怎么在小程序中實現(xiàn)跨頁面交互-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://vcdvsql.cn/article44/hdghe.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、建站公司、品牌網(wǎng)站建設、軟件開發(fā)、做網(wǎng)站、移動網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)