文章目錄
- 一、路由數據傳遞(router)
- 1、路由數據傳遞定義
- 2、路由數據傳遞使用方法
- 3、數據傳遞兩個頁面的效果
- 二、頁面間數據共享(EntryAbility)
- 1、定義
- 2、實現案例
- 3、避坑點
- 三、數據傳遞練習
一、路由數據傳遞(router)
1、路由數據傳遞定義
即使用router.pushUrl進行路由跳轉,從而實現頁面間的數據傳遞。這個方法可以實現一個頁面向另一個指定頁面的數據傳遞和共享。
2、路由數據傳遞使用方法
(1)例如在LifeCircle頁面的Build()組件下創建一個頁面跳轉的按鈕,實現頁面跳轉,
//驗證頁面跳轉的數據傳遞按鈕Button('頁面跳轉')
(2)在按鈕中創建點擊事件,點擊事件內容就是使用router.pushUrl()進行頁面跳轉,跳轉到另外一個新建的頁面“pages/LifeCircle2”中。并且跳轉時攜帶一個對象數據,包含有id、name、age3個數據元素。
//創建點擊事件.onClick(()=>{//調用路由函數,進行頁面的跳轉,除了路徑,同時帶有一個對象,包括三個鍵值對元素router.pushUrl({url:"pages/LifeCircle2",params: {id:'001',name:'頁面壹',age:25}})})
(3)在另外一個頁面LifeCircle2中接收數據,獲取跳轉對象的數據,利用鍵值對的鍵名進行取值。
let pageID = router.getParams()['id'] as string
let pageName = router.getParams()['name']
let pageAge = router.getParams()['age']
(4)最后在第二個頁面LifeCircle2呈現從其他頁面獲取的數據。
Divider()
Text(pageID).fontSize(40).backgroundColor(Color.Yellow)
Text(pageName).fontSize(40).backgroundColor(Color.Yellow)
Text(pageAge).fontSize(40).backgroundColor(Color.Yellow)
(5)在第二個頁面LifeCircle2內創建返回按鈕和返回路由函數調用。
//驗證頁面跳轉的數據傳遞按鈕Button('點擊返回')//創建點擊事件.onClick(() => {//調用路由函數,進行頁面的跳轉,除了路徑,同時帶有一個對象,包括三個鍵值對元素router.back()})
3、數據傳遞兩個頁面的效果
LifeCircle效果:
LifeCircle2效果:
二、頁面間數據共享(EntryAbility)
1、定義
這是一種全局的數據共享方法,可以在所有頁面之間進行數據共享。實現方法就是在EntryAbility.ts
文件中使用AppStorage.SetOrCreate()
進行數據的定義,這個數據就可以在這個項目所有的頁面中進行數據獲取,通過AppStorage.Get()
獲取。
2、實現案例
(1)首先在roject/entry/src/main/ets/entryability/EntryAbility.ts文件中定義一個數據:
(2)然后在LifeCircle中進行數據獲取:
3、避坑點
Previewer預覽器中無法顯示效果,因為在預覽該頁面時,EntryAbility.ts文件還沒有執行,因此無法獲取到頁面之間共享的數據。
解決方法:使用本地模擬器、真機模擬器或者遠程模擬器(建議),記得將默認的啟動頁面修改為需要調試的頁面。如何修改請參考文章:HarmonyOS 修改App的默認加載的界面(ArkTS版本)本次使用的華為官方的遠程模擬器,這樣就可以看到效果了:
三、數據傳遞練習
1、EntryAbility頁面
2、LifeCircle頁面
import router from '@ohos.router'//在應用程序的各個頁面中取出由EntryAbility定義的共享數據:使用AppStorage.Get
let name:string = AppStorage.Get('AppName')@Entry
@Component
struct LifeCircle {//調用從EntryAbility中獲取的數據賦值給message,并在后方用Text呈現@State message: string = name@State isAppear:boolean = truebuild() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Divider()Button('顯示/隱藏子組件').backgroundColor(Color.Orange).onClick(()=>{this.isAppear = !this.isAppear})if(this.isAppear){LifeCircle_son()}//驗證頁面跳轉的數據傳遞按鈕Button('頁面跳轉')//創建點擊事件.onClick(()=>{//調用路由函數,進行頁面的跳轉,除了路徑,同時帶有一個對象,包括三個鍵值對元素router.pushUrl({url:"pages/LifeCircle2",params: {id:'001',name:'頁面壹',age:25}})})}.width('100%')}.height('100%')}//頁面顯示onPageShow(){//打印出頁面顯示的提醒console.log('LifeCircle1: Page is onPageShow')}//頁面隱藏onPageHide(){//打印出頁面隱藏的提醒console.log('LifeCircle1: Page is onPageHide')}//頁面返回:手機按鈕上的返回onBackPress(){//打印出頁面返回的提醒console.log('LifeCircle1: Page is onBackPress')}//aboutToAppear和aboutToDisappear也可以放在入口組件中,后者表示程序被sha死時調用的函數//組件即將出現時回調該接?aboutToAppear(){console.log('LifeCircle1: Page is 入口aboutToAppear')}//組件析構銷毀時觸發的函數aboutToDisappear(){console.log('LifeCircle1: Page is 入口aboutToDisappear')}
}//子組件的內容
@Component
struct LifeCircle_son{build(){Column(){Text('頁面1子組件內容').fontSize(40).fontStyle(FontStyle.Italic)}}//組件即將出現時回調該接?aboutToAppear(){console.log('LifeCircle1: Page is 子組件aboutToAppear')}//組件析構銷毀時觸發的函數aboutToDisappear(){console.log('LifeCircle1: Page is 子組件aboutToDisappear')}
}
3、LifeCircle2頁面
import router from '@ohos.router';
//獲取跳轉對象的數據:利用鍵值對的鍵名進行取值
//從其他頁面接收的數據不知道其變量,暫時作為string接收
let pageID = router.getParams()['id'] as string
let pageName = router.getParams()['name']
let pageAge = router.getParams()['age']@Entry
@Component
struct LifeCircle2 {@State message: string = 'Hello World'@State isAppear:boolean = truebuild() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Divider()Button('顯示/隱藏子組件').backgroundColor(Color.Orange).onClick(() => {this.isAppear = !this.isAppear})if (this.isAppear) {LifeCircle_son()}//在第二個頁面使用從其他頁面獲取的數據Divider()Text(pageID).fontSize(40).backgroundColor(Color.Yellow)Text(pageName).fontSize(40).backgroundColor(Color.Yellow)Text(pageAge).fontSize(40).backgroundColor(Color.Yellow)//驗證頁面跳轉的數據傳遞按鈕Button('點擊返回')//創建點擊事件.onClick(() => {//調用路由函數,進行頁面的跳轉,除了路徑,同時帶有一個對象,包括三個鍵值對元素router.back()})}.width('100%')}.height('100%')}//頁面顯示onPageShow(){//打印出頁面顯示的提醒console.log('LifeCircle2: Page is onPageShow')}//頁面隱藏onPageHide(){//打印出頁面隱藏的提醒console.log('LifeCircle2: Page is onPageHide')}//頁面返回:手機按鈕上的返回onBackPress(){//打印出頁面返回的提醒console.log('LifeCircle2: Page is onBackPress')}//aboutToAppear和aboutToDisappear也可以放在入口組件中,后者表示程序被sha死時調用的函數//組件即將出現時回調該接?aboutToAppear(){console.log('LifeCircle2: Page is 入口aboutToAppear')}//組件析構銷毀時觸發的函數aboutToDisappear(){console.log('LifeCircle2: Page is 入口aboutToDisappear')}
}//子組件的內容
@Component
struct LifeCircle_son{build(){Column(){Text('頁面2子組件內容').fontSize(40).fontStyle(FontStyle.Italic)}}//組件即將出現時回調該接?aboutToAppear(){console.log('LifeCircle2: Page is 子組件aboutToAppear')}//組件析構銷毀時觸發的函數aboutToDisappear(){console.log('LifeCircle2: Page is 子組件aboutToDisappear')}
}