
页面跳转可以分为页面内跳转和页面间跳转,页面内跳转是指所跳转的页面在同一个 Ability 内部,它们之间的跳转可以使用 Router 或者 Navigator 的方式;页面间跳转是指所跳转的页面属与不同的 Ability ,这种跳转需要借助 featureAbility 实现,跳转示意图如下所示:

本节将简单介绍这两种方式的页面跳转。
页面内跳转的实现比较简单,直接使用ArkUI开发框架提供的 Router 或者 Navigator 就可以了, Navigator 本质上是对 Router 的封装,这里就简单介绍一下 Router 的使用,想了解 Navigator 的小伙伴请参考官网文档。
declare namespace router {
function push(options: RouterOptions):void;
function replace(options: RouterOptions):void;
function back(options?: RouterOptions ):void;
function clear():void;
function getLength():string;
function getState():RouterState;
function enableAlertBeforeBackPage(options: EnableAlertOptions):void;
function disableAlertBeforeBackPage():void;
function getParams(): Object;
}RouterOptions 定义了以下参数:pages 下配置,否则不起作用。RouterState参数说明如下:router 之前,先要引入 router ,引入方式如下: import router from '@ohos.router';router.push 方法,简单样例如下所示: // 第一个页面
@Entry @Component struct ComponentTest {
build() {
Column({space: 10}) {
Text('第一个页面')
.fontSize(30)
.width('100%')
.textAlign(TextAlign.Center)
Button('打开下一页')
.onClick(() => {
router.push({ // 使用push入栈一个新页面
url: "pages/second" // 通过url指定新打开的页面
})
})
}
.size({width: '100%', height: '100%'})
}
}
// 第二个页面
@Entry @Component struct Second {
build() {
Column({space: 10}) {
Text('第二个页面')
.fontSize(30)
.width('100%')
.textAlign(TextAlign.Center)
Button('返回上一页')
.onClick(() => {
router.back(); // 返回上一页,当前页面会销毁
})
}
.size({width: '100%', height: '100%'})
}
}router 打开新页面需要传递参数时,可以使用 RouterOptions 的 params 参数传递一个对象,然后在接收方以 router.getParams() 的方式拿到传递过来的对象,取值的话以 .key 的形式取值(注意:从 3.1.6.5 版本起,取值方式变更为 ['key'] 的形式),样例如下: // 第一个页面
@Entry @Component struct ComponentTest {
build() {
Column({space: 10}) {
Text('第一个页面')
.fontSize(30)
.width('100%')
.textAlign(TextAlign.Center)
Button('打开下一页')
.onClick(() => {
router.push({
url: "pages/second", // 打开新页面
params: {value: 'Hi'} // 给新页面传递一个对象,key为value,取值以.value的形式
})
})
}
.size({width: '100%', height: '100%'})
}
}
// 第二个页面
@Entry @Component struct Second {
// 3.1.5.5版本之前,取值方式为:router.getParams().key
private value: string = router.getParams().value;
// 从3.1.6.5版本起,取值方式为:router.getParams()['key']
private value: string = router.getParams()['value'];
build() {
Column({space: 10}) {
Text('第二个页面:' + this.value) // 使用获取过来的参数
.fontSize(30)
.width('100%')
.textAlign(TextAlign.Center)
Button('返回上一页')
.onClick(() => {
router.back(); // 返回上一页
})
}
.size({width: '100%', height: '100%'})
}
}页面间跳转需要借助 featureAbility 模块的 startAbility() 方法,该方法和 router 的功能类似,可以支持参数传递以及打开指定页面等。
declare namespace featureAbility {
/**省略部分方法*/
function startAbility(parameter: StartAbilityParameter, callback: AsyncCallback<number>): void;
function startAbility(parameter: StartAbilityParameter): Promise<number>;
function startAbilityForResult(parameter: StartAbilityParameter, callback: AsyncCallback<AbilityResult>): void;
function startAbilityForResult(parameter: StartAbilityParameter): Promise<AbilityResult>;
}
点击 Finish 后, OpenHarmony 代码结构如下图所示:

startAbility() 方法打开目标 Ability。 // 引入featureAbility
import featureAbility from '@ohos.ability.featureAbility';
@Entry @Component struct Index {
build() {
Column() {
Button('open about ability')
.onClick(() => {
// 打开目标Ability
featureAbility.startAbility({
want: {
// 目标Ability所在的bundleName,也就是config.json里配置的bundleName
bundleName: "com.example.myapplication",
// 目标Ability的全路径
abilityName: "com.example.myapplication.SettingAbility"
}
})
.then((data) => {
console.info('Operation successful. Data: ' + JSON.stringify(data))
})
.catch((error) => {
console.error('Operation failed. Cause: ' + JSON.stringify(error));
})
})
}
.padding(10)
.width('100%')
.height('100%')
}
} @Entry @Component struct Index {
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
Text('我是SettingAbility的默认首页面')
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
.height('100%')
}
} @Entry @Component struct Second {
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
Text('你好,我是SettingAbility的第二个页面')
.fontSize(50)
.fontWeight(FontWeight.Bold)
}
.width('100%')
.height('100%')
}
} featureAbility.startAbility({
want: {
bundleName: "com.example.myapplication",
abilityName: "com.example.myapplication.SettingAbility",
// 添加uri参数,指定打开SettingAbility下的second页面。
uri: "pages/second"
}
})
.then((data) => {
console.info('Operation successful. Data: ' + JSON.stringify(data))
})
.catch((error) => {
console.error('Operation failed. Cause: ' + JSON.stringify(error));
})本节简单介绍了页面内和页面间的跳转方法以及在跳转过程中的参数传递和取值,另外请读者看一个场景:从不同的页面跳转到B页面,但是B页面需要登录才可以跳转,一般做法是在打开B页面时判断是否登录,如果登录了直接跳转B页面否则跳转登录页面去登录,登录成功后再跳转B页面。
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。