小程式跨頁面互動的作用和方法
去年年末,微信小程式的分包大小已經到達了12M 大小,一方面說明小程式的確逐步為開發者放開更大的權限,另一方面也說明了對於某些小程式8M的大小已經不夠用了。我個人今年也是在開發 to B 小程式應用程式。這裡列舉一些跨頁面互動的場景。
對於 B 端應用程式的業務需求來說,小程式開發的複雜度相對比網頁開發複雜一些。一個是雙執行緒的處理機制問題,另一個是頁面棧之間互動問題。
註: 筆者目前只需要開發微信小程序,為了在小程式頁面中可以使用 properties behaviors observers 等新功能,已經使用 Component 建構器來建構頁面。具體可以參考微信小程式 Component 建構器。如果你也沒有多端開發的需求,建議嘗試使用,可以得到不錯的體驗。
效能最佳化類別
對於小程式在頁面中點擊觸發wx.navigateTo 跳轉其他頁面,中間會有一段時間的空白加載期(對於分包出去的頁面,空白期則會更長),但是這是小程式內部機制,沒有辦法進行優化。我們只能眼睜睜的等待這段沒有意思的空白期過去。
當考慮到跳轉頁面後的第一件事情便是取數邏輯,那麼我們是否能夠進行最佳化呢?答案是肯定的。我們沒有辦法直接在當前頁面取得資料之後再進行跳轉操作(這樣操作更不好),但是我們卻可以利用快取當前的請求,詳情可以參考我之前的部落格文章 ——Promise物件 3 種妙用。
程式碼如下:
const promiseCache = new Map() export function setCachePromise(key, promise) { promiseCache.set(key, promise) } export function getCachePromise(key) { // 根据key获取当前的数据 const promise = promiseCache.get(key) // 用完删除,目前只做中转用途,也可以添加其他用途 promiseCache.delete(key) return promise }
做一份全域的Map,然後利用Map 快取promise 對象,在跳轉之前程式碼為:
// 导入 setCachePromise 函数 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 函数 Component({ properties: { id: Number }, lifetimes: { attached () { const id = this.data.id // 取得全局缓存的promise const bookPromise = getCachePromise(`xxx:${id}`) bookPromise.then((res) => { // 业务处理 }).catch(error => { // 错误处理 }) } }, methods: { getBook() { // 获取数据,以便于 错误处理 上拉刷新 等操作 } } })
如此便可以同時處理取數和頁面載入的邏輯,當然,這個對於頁面有耦合性,不利於後續的刪除與修改。但考慮如果僅加在分包跳轉之間可能會有不錯的效果。
想要無侵入式,可以進一步學習研究 微信小程式之提高應用速度小技巧 以及 wxpage 框架,同時考慮到無論是ToC 還是ToC 用戶,都有可能存在硬體以及網路環境等問題,該優化還是非常值得的。
當然微信小程式為了減少冷啟動時間,提供了週期性更新 資料預拉取 功能。
註: 上面的 promiseCache 只作為中轉的用途,不作為緩存的用途,如果你考慮添加緩存,可以參考我之前的博客文章—— 前端 api 請求緩存方案。
通知類
如果是 pc 端中進行交互,對於資料的 CRUD。例如在詳情頁面進行了資料的修改和刪除,返回清單時候就直接調取先前儲存的清單查詢條件再次查詢即可,而對於行動端這種下拉滾動的設計,就沒有辦法直接呼叫先前的查詢條件來進行搜尋。
如果從清單頁面進入詳情頁面後,在詳情頁面只會進行新增或修改操作。然後返回列表頁面。此時可以提示使用者資料已經進行了修改,請使用者自行決定是否進行刷新操作。
如在編輯頁面修改了資料:
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: () => { // 无论确认刷新与否,都把数据置为 false app.globalData.xxxChanged = false } }) } } })
當然了,我們也可以利用wx.setStorage 或getCurrentPage 來取得前面的頁面setData 來進行資料通知,以便使用者進行頁面重新整理。
訂閱發布類別
如果僅只涉及到修改資料的前提下,我們可以選擇讓使用者進行刷新操作,但是如果針對於刪除操作而言,如果用戶選擇不進行刷新,然後用戶又不小心點擊到了已經刪除的數據,就會發生錯誤。所以如果有刪除的需求,我們最好在返回清單頁面前就進行清單的修改,以免造成錯誤。
mitt
github 上有很多的pub/sub 開源函式庫,如果沒有特定的需求,找到程式碼量最少的就是 mitt這個庫了,作者是喜歡開發微型庫的 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() 函數產生的物件即可(或直接放入 app.globalData 中也可)。
Component({ lifetimes: { attached: function() { // 页面创建时执行 const changeData = (type, data) => { // 处理传递过来的类型与数据 } this._changed = changeData bus.on('xxxchanged', this._changed) }, detached: function() { // 页面销毁时执行 bus.off('xxxchanged', this._changed) } } })
这里mitt
可以有多个页面进行绑定事件,如果需求仅仅只涉及到两个页面之间,我们就可以使用 wx.navigateTo
中的 EventChannel
(页面间事件信息通道)。可以参考微信小程序wx.navigateTo
方法里的events
参数使用详情及场景,该方案的利好在于,传递到下一个页面的参数也可以通过 EventChannel
来通知,以便于解决 properties 传递数据不宜过大的问题。
注: 一个页面展示很多信息的时候,会造成小程序页面的卡顿以及白屏。小程序官方也有长列表组件 recycle-view
。有需求的情况下可以自行研究,这个不在这里详述。
鼓励一下
如果你觉得这篇文章不错,希望可以给与我一些鼓励,在我的 github 博客下帮忙 star
一下。
博客地址
推荐教程:《微信小程序》
以上是小程式跨頁面互動的作用和方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

隨著行動互聯網技術和智慧型手機的普及,微信成為了人們生活中不可或缺的一個應用。而微信小程式則讓人們可以在不需要下載安裝應用程式的情況下,直接使用小程式來解決一些簡單的需求。本文將介紹如何使用Python來開發微信小程式。一、準備工作在使用Python開發微信小程式之前,需要先安裝相關的Python函式庫。這裡推薦使用wxpy和itchat這兩個函式庫。 wxpy是一個微信機器

小程式能用react,其使用方法:1、基於「react-reconciler」實作一個渲染器,產生一個DSL;2、建立一個小程式元件,去解析和渲染DSL;3、安裝npm,並執行開發者工具中的建構npm;4、在自己的頁面中引入包,再利用api即可完成開發。

實作微信小程式中的卡片翻轉特效在微信小程式中,實現卡片翻轉特效是一種常見的動畫效果,可以提升使用者體驗和介面互動的吸引力。以下將具體介紹如何在微信小程式中實現卡片翻轉的特效,並提供相關程式碼範例。首先,需要在小程式的頁面佈局檔案中定義兩個卡片元素,一個用於顯示正面內容,一個用於顯示背面內容,具體範例程式碼如下:<!--index.wxml-->&l

本站10月31日消息,今年5月27日,螞蟻集團宣布啟動“漢字拾光計劃”,最近又迎來新進展:支付寶上線“漢字拾光-生僻字”小程序,用於向社會徵集生僻字,補充生僻字庫,同時提供不同的生僻字輸入體驗,以幫助完善支付寶內的生僻字輸入方法。目前,用戶搜尋「漢字拾光」、「生僻字」等關鍵字就可以進入「生僻字」小程式。在小程式裡,使用者可以提交尚未被系統辨識輸入的生僻字圖片,支付寶工程師確認後,將會對字庫進行補錄入。本站注意到,使用者也可以在小程式體驗最新的拆字輸入法,這項輸入法針對讀音不明確的生僻字設計。用戶拆

uniapp如何實現小程式和H5的快速轉換,需要具體程式碼範例近年來,隨著行動網路的發展和智慧型手機的普及,小程式和H5成為了不可或缺的應用形式。而uniapp作為一個跨平台的開發框架,可以在一套程式碼的基礎上,快速實現小程式和H5的轉換,大大提高了開發效率。本文將介紹uniapp如何實現小程式和H5的快速轉換,並給出具體的程式碼範例。一、uniapp簡介unia

實現思路x01服務端的建立首先,在服務端,使用socket進行訊息的接受,每接受一個socket的請求,就開啟一個新的線程來管理訊息的分發與接受,同時,又存在一個handler來管理所有的線程,從而實現對聊天室的各種功能的處理x02客戶端的建立客戶端的建立就要比服務端簡單多了,客戶端的作用只是對消息的發送以及接受,以及按照特定的規則去輸入特定的字符從而實現不同的功能的使用,因此,在客戶端這裡,只需要去使用兩個線程,一個是專門用於接受消息,一個是專門用於發送消息的至於為什麼不用一個呢,那是因為,只

小程序備案操作步驟:1、準備個人身分證影本、企業營業執照影本、法人身分證影本等備案資料;2、登入小程式管理後台;3、進入小程式設定頁;4、選擇“基本設定」;5、填寫備案資料;6、上傳備案資料;7、提交備案申請;8、等待審核結果,如果備案不透過要根據原因進行修改,並重新提交備案申請;9、備案後續操作即可。

1.開啟微信小程序,進入對應的小程式頁面。 2.在小程式頁面中尋找會員相關入口,通常會員入口在底部導覽列或個人中心等位置。 3.點選會員入口,進入會員申請頁。 4、在會員申請頁面,填寫相關信息,如手機號碼、姓名等,完成資料填寫後,提交申請。 5.小程式方會對會員申請審核,審核通過後,用戶即可成為微信小程式會員。 6.作為會員,用戶將享有更多的會員權益,如積分、優惠券、會員專屬活動等
