頁面路由指在應用程式中實現不同頁面之間的跳轉和數據傳遞。HarmonyOS提供了Router模塊,通過不同的url地址,可以方便地進行頁面路由,輕鬆地訪問不同的頁面。 一、基礎使用 Router模塊提供了兩種跳轉模式,分別是router.pushUrl()和router.replaceUrl()。這 ...
頁面路由指在應用程式中實現不同頁面之間的跳轉和數據傳遞。HarmonyOS提供了Router模塊,通過不同的url地址,可以方便地進行頁面路由,輕鬆地訪問不同的頁面。
一、基礎使用
Router模塊提供了兩種跳轉模式,分別是router.pushUrl()和router.replaceUrl()。這兩種模式決定了目標頁面是否會替換當前頁。
router.pushUrl()
:目標頁面不會替換當前頁,而是壓入頁面棧。這樣可以保留當前頁的狀態,並且可以通過返回鍵或者調用router.back()方法返回到當前頁。router.replaceUrl()
:目標頁面會替換當前頁,並銷毀當前頁。這樣可以釋放當前頁的資源,並且無法返回到當前頁。
註意:頁面棧的最大容量為
32
個頁面。如果超過這個限制,可以調用router.clear()方法清空歷史頁面棧,釋放記憶體空間。
Router模塊提供了兩種實例模式,分別是Standard和Single。這兩種模式決定了目標url是否會對應多個實例。
Standard
:多實例模式,也是預設情況下的跳轉模式。目標頁面會被添加到頁面棧頂,無論棧中是否存在相同url的頁面。Single
:單實例模式。如果目標頁面的url已經存在於頁面棧中,則會將離棧頂最近的同url頁面移動到棧頂,該頁面成為新建頁。如果目標頁面的url在頁面棧中不存在同url頁面,則按照預設的多實例模式進行跳轉。
在使用頁面路由Router相關功能之前,需要在代碼中先導入Router模塊。
import router from '@ohos.router';
跳轉示例
1.普通跳轉
function onJumpClick(): void {
router.pushUrl({
url: 'pages/Detail' // 目標url
});
}
2.帶跳轉模式和跳轉結果
比如從其他頁面,跳轉到登錄頁面(全局唯一)
function onJumpClick(): void {
router.pushUrl({
url: 'pages/Detail' // 目標url
}, router.RouterMode.Single, (err) => {
if (err) {
console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
return;
}
console.info('Invoke pushUrl succeeded.');
});
}
3.替換原頁面
比如從啟動頁面跳轉到首頁,同時需要銷毀啟動頁
function onJumpClick(): void {
router.replaceUrl({
url: 'pages/Profile' // 目標url
});
}
4.帶參數
在調用Router模塊的方法時,添加一個params
屬性,並指定一個對象作為參數:
class DataModelInfo {
age: number;
}
class DataModel {
id: number;
info: DataModelInfo;
}
function onJumpClick(): void {
// 在Home頁面中
let paramsInfo: DataModel = {
id: 123,
info: {
age: 20
}
};
router.pushUrl({
url: 'pages/Detail', // 目標url
params: paramsInfo // 添加params屬性,傳遞自定義參數
}, (err) => {
if (err) {
console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
return;
}
console.info('Invoke pushUrl succeeded.');
})
}
在目標頁面中,可以通過調用Router模塊的getParams()
方法來獲取傳遞過來的參數。
const params = router.getParams(); // 獲取傳遞過來的參數對象
const id = params['id']; // 獲取id屬性的值
const age = params['info'].age; // 獲取age屬性的值
頁面返回
1.返回上一頁
router.back();
2.返回到指定頁面
router.back({
url: 'pages/Home' // 指定url
});
3.返回到指定頁面,並傳遞自定義參數信息。
router.back({
url: 'pages/Home',
params: {
info: '來自Home頁'
}
});
4.目標頁面中,在需要獲取參數的位置調用router.getParams()
方法即可,例如在onPageShow()生命周期回調中:
onPageShow() {
const params = router.getParams(); // 獲取傳遞過來的參數對象
const info = params['info']; // 獲取info屬性的值
}
頁面返回的特別說明
當使用router.back()
方法返回到指定頁面時,該頁面會被重新壓入棧頂,而原棧頂頁面(包括)到指定頁面(不包括)之間的所有頁面棧都將被銷毀。
如果使用router.back()方法返回到原來的頁面,原頁面不會被重覆創建,因此使用@State聲明的變數不會重覆聲明,也不會觸發頁面的aboutToAppear()生命周期回調。如果需要在原頁面中使用返回頁面傳遞的自定義參數,可以在需要的位置進行參數解析。例如,在onPageShow()生命周期回調中進行參數解析。
二、命名路由
為了支持組件化,HarmonyOS支持多HAP機制和共用包機制
在開發中為了跳轉到共用包中的頁面,可以使用router.pushNamedRoute()
來實現,也就是命名路由的方式。
示例
在想要跳轉到的共用包頁面里,給@Entry修飾的自定義組件命名:
// library/src/main/ets/pages/Index.ets
// library為新建共用包自定義的名字
@Entry({ routeName : 'myPage' })
@Component
struct MyComponent {
}
配置成功後需要在需要跳轉的頁面中引入命名路由的頁面:
// entry/src/main/ets/pages/Index.ets
import router from '@ohos.router';
import 'library/src/main/ets/pages/Index' // 引入共用包library中的命名路由頁面
@Entry
@Component
struct Index {
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
Text('Hello World')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.margin({ top: 20 })
.backgroundColor('#ccc')
.onClick(() => { // 點擊跳轉到其他共用包中的頁面
try {
router.pushNamedRoute({
name: 'myPage',
params: {
data1: 'message',
data2: {
data3: [123, 456, 789]
}
}
})
} catch (err) {
console.error(`pushNamedRoute failed, code is ${err.code}, message is ${err.message}`);
}
})
}
.width('100%')
.height('100%')
}
}
其他
基於命名路由技術方案時,建議將路由URL統一放在一個文件中做管理。