LocalStorage是頁面級的UI狀態(tài)存儲,頁面組件(組件樹根節(jié)點(diǎn))獲取LocalStorage是通過@Entry裝飾器接收的參數(shù)傳入,子組件自動獲取LocalStorage的訪問權(quán)限,獲取的也是通過@Entry傳入的LocalStorage。頁面內(nèi)共享同一個(gè)LocalStorage實(shí)例。支持一個(gè)UIAbility內(nèi)多個(gè)頁面間共享一個(gè)LocalStorage。getShared僅能獲取當(dāng)前Stage通過UIAbility中windonStage.loadcontent傳入的LocalStorage
不與自定義組件進(jìn)行關(guān)聯(lián)的使用場景:
LocalStorage若是想要跟自定義組件建立聯(lián)系,需要使用裝飾器:@LocalStorageProp和@LocalStorageLink
一、@LocalStorageProp:此裝飾器裝飾的變量與LocalStorage中key對應(yīng)的屬性建立單向同步關(guān)系
示例:@LocalStorageProp(key) name:string = ‘’;
裝飾的變量需要初始化,因?yàn)榇薻ey(常量字符串)可能沒值。另外不能通過父組件傳值賦值,只能通過LocalStorage中的key初始化,若沒有對應(yīng)key,用默認(rèn)值初始化,并將值存入LocalStorage中,注意:此時(shí)是存入,不是同步。
支持初始化子節(jié)點(diǎn),可用于初始化子節(jié)點(diǎn)的@State 、@Prop、@Link、@Provide狀態(tài)變量
只能在組件內(nèi)訪問,不支持在組件外部訪問
同步類型:數(shù)據(jù)單向同步。
框架行為:
1、被@LocalStorageProp裝飾的變量值改變時(shí),不會同步會回LocalStorage中,但會驅(qū)動對應(yīng)的UI組件刷新渲染.
2、若是LocalStorage(key)的值發(fā)生改變,那么所有@LocalStorageProp(key)裝飾的變量都會發(fā)生改變,并且覆蓋其本地的改變。
示例1:
示例1中:
1、點(diǎn)擊name1,name1值改為‘value change’,驅(qū)動name1顯示內(nèi)容改變,不會同步給LocalStorage,所以name2顯示內(nèi)容不變。
2、點(diǎn)擊name2,會改變LocalStorage中name對應(yīng)的值,單向同步給name1。改為'keke'
二、@LocalStorageLink:此裝飾器裝飾的變量與LocalStorage中key對應(yīng)的屬性建立雙向同步關(guān)系
示例:@LocalStorageLink(key)? age:number:= 11;
裝飾的變量需要初始化,因?yàn)榇薻ey可能沒值。同樣不能通過父組件傳值賦值,只能通過LocalStorage中的key初始化。若沒有對應(yīng)的key,用默認(rèn)值初始化,并存入LocalStorage中。
支持初始化子節(jié)點(diǎn),可用于初始化子節(jié)點(diǎn)的@State、@Prop、@Link、@Provide狀態(tài)變量
同樣只能在組件內(nèi)訪問,不支持在組件外部訪問
@LocalStorageLink(key)和LocalStorage中key對應(yīng)的值會建立數(shù)據(jù)雙向同步。
本地變量age改變,會把值同步回LocalStorage中key對應(yīng)的值,同樣LocalStorage中key對應(yīng)的值改變,也會把值同步到本地變量age。即:把a(bǔ)ge的新值同步回LocalStorage中key對應(yīng)的值,同樣LocalStorage中key對應(yīng)的值發(fā)生改變,本地變量age的值也發(fā)生同步改變。
同步類型:雙向同步。
框架行為:
當(dāng)@LocalStorageLink(key)裝飾的的變量發(fā)生改變時(shí),會把修改的結(jié)果值同步回LocalStorage中key對應(yīng)的屬性值。
當(dāng)LocalStorage中的key對應(yīng)的屬性值發(fā)生改變時(shí),會把改變的結(jié)果值同步到所有key綁定的數(shù)據(jù)上面(包括LocalStorageLink(key)和LocalStorageProp裝飾的變量。
當(dāng)@LocalStorageLink(key)裝飾的變量發(fā)生該改變時(shí),在同步數(shù)據(jù)回LocalStorage中的同時(shí),還會驅(qū)動與其綁定的UI組件進(jìn)行刷新渲染
示例2:
示例2中:
1、點(diǎn)擊name1,name1值改為‘value change’,驅(qū)動name1顯示內(nèi)容改變,同時(shí)會同步給LocalStorage,所以name2顯示內(nèi)容對應(yīng)的不是狀態(tài)變量,所以顯示內(nèi)容不會改變,但LocalStorage的值改變會同步給所有綁定了對應(yīng)key的數(shù)據(jù),所以name3也會改變,并驅(qū)動name3的UI刷新渲染。
2、點(diǎn)擊name2,會改變LocalStorage中name對應(yīng)的值,會同步給name1和name3。均改為'keke',同時(shí)驅(qū)動name1和name3組件UI重新渲染
示例代碼3:若LocaStorage中沒有對應(yīng)的key,用默認(rèn)值初始化,并將值存入LocalStorage中,下次通過key取的值是LocalStorage中的值,而不是新的默認(rèn)值
下面示例3是針對初始值而言:
示例3中,因?yàn)橐婚_始LocalStorage中沒有name鍵,?value1在使用默認(rèn)值123初始化的時(shí)候,也把值存到了存到LocalStorage中name對應(yīng)的屬性值上面,所以當(dāng)value2是優(yōu)先用LocalStorage中name對應(yīng)的值來初始化的,所以還是123。用@LocalStorageLink('name')同樣如此。
Ability內(nèi)多個(gè)頁面共享的示例如下:
1、在當(dāng)前Ability中的windowStage.loadConent傳入LocalStorage
2、在組件入口處通過getShare獲取,并通過@Entry傳入