在(zai)微信(xin)小(xiao)程(cheng)(cheng)序的(de)開發中,我們會經常遇到頁面間數據傳(chuan)遞或者(zhe)相(xiang)互影響的(de)問題。在(zai)實(shi)際的(de)開發過程(cheng)(cheng)中,可以通過以下幾種(zhong)方法來實(shi)現。
使用全局變量
全局變(bian)量實際上是定(ding)義了一個(ge)全局的(de)對象(xiang),并在每個(ge)頁(ye)面中(zhong)引入。在初始(shi)化代碼的(de)時(shi)候,小程序會(hui)讀取一個(ge)app.js的(de)文件,在這里(li)我(wo)們(men)可(ke)以(yi)定(ding)義我(wo)們(men)所需要的(de)全局變(bian)量。

使用全(quan)(quan)局變(bian)量全(quan)(quan)局變(bian)量實際上是定(ding)義了(le)一個全(quan)(quan)局的(de)對(dui)象,并在每個頁面中引入(ru)。在初始(shi)化(hua)代碼的(de)時候,小程(cheng)序會讀取一個 app.js 的(de)文(wen)件,在這里我們(men)可(ke)以(yi)定(ding)義我們(men)所需(xu)要(yao)的(de)全(quan)(quan)局變(bian)量。

由于(yu) app.js 在項目中是用來做基礎配(pei)置(zhi)的(de),因此不建議將很多(duo)變量放在這(zhe)里(li)(li)配(pei)置(zhi)。一(yi)般情(qing)況下會將一(yi)些(xie)持久化的(de)常量配(pei)置(zhi)在這(zhe)里(li)(li),對于(yu)經常需要(yao)變動的(de)量不建議用這(zhe)個方(fang)法。
使用本(ben)地(di)緩存
本(ben)地緩(huan)存是微信小(xiao)程(cheng)序提(ti)供(gong)的(de)一(yi)個功能,可以將(jiang)用戶(hu)產生的(de)數據做本(ben)地的(de)持久化,類似于 NoSQL,可以進(jin)行讀取(qu)和修(xiu)改的(de)操作。
那么在(zai)不(bu)同的頁(ye)面(mian)之間,如(ru)何利用它,進行數(shu)據的交(jiao)互(hu)呢?假設(she)我們(men)在(zai) A 頁(ye)面(mian)保存了用戶的信息。

這樣做,這個數(shu)據(ju)(ju)就存在了(le)本(ben)地(di)。當(dang)在 B 頁面需(xu)要使用的(de)時候,可以直接的(de)獲(huo)取到數(shu)據(ju)(ju)池中(zhong)的(de)數(shu)據(ju)(ju),并(bing)進行 CRUD 操作:

需要注(zhu)意的(de)(de)是,在回到 A 頁面的(de)(de)時候(hou),小(xiao)程序需要重新讀(du)取數據。這時候(hou),可以選擇放在生命周(zhou)期的(de)(de) onShow 中對(dui)數據重新加載(zai)
父級(ji)往子級(ji)頁面(mian)(模(mo)板)的數(shu)據傳(chuan)遞
我們通(tong)常會在頁面之間進(jin)行跳(tiao)轉、重定向的(de)操作。這時候,我們可以選擇(ze)將(jiang)部(bu)分數據放(fang)在 url 里面,并(bing)在新頁面 onLoad 的(de)時候進(jin)行初始化。

在 D 頁面中,我們可以這樣接收到(dao)到(dao)所(suo)傳進來的參數:

wx.navigateTo 和 wx.redirectTo 不(bu)允(yun)許跳(tiao)轉到(dao) tab 所包含的(de)頁面,只能用 wx.switchTab 跳(tiao)轉。需要(yao)注(zhu)意(yi)的(de)是,wx.switchTab 中(zhong)的(de) url 不(bu)能傳參數。
微信新提供的(de) wx.reLaunch 接口(kou)可以傳(chuan)入參數。
另外,在頁面(mian)中我(wo)們通常會用到一些組(zu)件模板,因此在父子之間也會有(you)相應的數據傳(chuan)遞。
使用(yong)(yong) name 屬性(xing),作為(wei)模板的(de)(de)名字。然后在這里面(mian)使用(yong)(yong) is 屬性(xing),聲明(ming)需要的(de)(de)使用(yong)(yong)的(de)(de)模板。

然后將模(mo)板(ban)所需要(yao)的 data 傳入(ru),如(ru):

傳入(ru)模(mo)板的除了變量(liang),還可(ke)以(yi)是事件方法(fa)對(dui)象(xiang)(xiang)。例如,模(mo)板中(zhong)的點擊(ji)事件,可(ke)以(yi)傳遞(di)到使用模(mo)板的元素中(zhong)。通過獲(huo)取(qu)到頁(ye)面對(dui)象(xiang)(xiang)進行數(shu)據(ju)操作(zuo)這個方法(fa)的精髓,是通過獲(huo)取(qu)到其他頁(ye)面的對(dui)象(xiang)(xiang)原型,然(ran)后通過原型方法(fa) setData 對(dui)當前對(dui)象(xiang)(xiang)管理的 data 進行修改,示(shi)例如下:

當跳轉到下一個頁面 F 之后(hou),假定(ding)在 F 中有操作(zuo)需要對(dui) E 中的數據有修改,則可(ke)以(yi)使用以(yi)下方法:

這(zhe)個方(fang)法可(ke)(ke)以(yi)(yi)操(cao)作頁(ye)面(mian)堆棧里(li)面(mian)的頁(ye)面(mian)的數據(ju)(ju),可(ke)(ke)以(yi)(yi)做到讓后一級頁(ye)面(mian)對(dui)上(shang)級頁(ye)面(mian)群的數據(ju)(ju)管(guan)理。小(xiao)結在微(wei)信小(xiao)程序中(zhong)有以(yi)(yi)上(shang)并且不局(ju)限于以(yi)(yi)上(shang)幾(ji)種(zhong)的方(fang)式進行(xing)頁(ye)面(mian)間數據(ju)(ju)傳遞、交(jiao)互,在實際應用(yong)中(zhong)可(ke)(ke)以(yi)(yi)組合(he)使用(yong)。比如說:一些常量(liang),可(ke)(ke)以(yi)(yi)交(jiao)由 app.js 管(guan)理;需(xu)要持久化的量(liang)可(ke)(ke)以(yi)(yi)放(fang)在本地保(bao)存(cun)。
涉及到下級(ji)頁面(mian)或(huo)者(zhe)模板元素的數據,可以通(tong)(tong)過傳入參(can)數的方(fang)式傳入。后級(ji)頁面(mian)可以通(tong)(tong)過獲(huo)取堆棧里的頁面(mian)對象快速修改上級(ji)的數據。在實(shi)際應用中結合(he)使用,可以更好地管理小(xiao)程序的數據。