HarmonyOS 鸿蒙Next-前端学鸿蒙-路由跳转
HarmonyOS 鸿蒙Next-前端学鸿蒙-路由跳转
前端开发 SPA 应用的时候通常会存在多个页面的跳转,我们称之为路由跳转,React 有 react-router,Vue 下 vue-router,常见的小程序框架也有一套对应的路由跳转 API,比如:xx.redirectTo; xx.navigateTo; xx.navigateBack。
在鸿蒙原生中,也有对应的路由系统。它在应用程序中实现不同页面之间的跳转和数据传递。Router模块通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。
跳转
2 种跳转模式
前端有类似概念可以比较好理解
Router模块提供了两种跳转模式,分别是router.pushUrl()和router.replaceUrl()。这两种模式决定了目标页面是否会替换当前页。
-
router.pushUrl():目标页面不会替换当前页,而是压入页面栈。这样可以保留当前页的状态,并且可以通过返回键或者调用router.back()方法返回到当前页。
-
router.replaceUrl():目标页面会替换当前页,并销毁当前页。这样可以释放当前页的资源,并且无法返回到当前页。
2 种实例模式
前端无类似概念
Router模块提供了两种实例模式,分别是Standard和Single。这两种模式决定了目标url是否会对应多个实例。
-
Standard:多实例模式,也是默认情况下的跳转模式。目标页面会被添加到页面栈顶,无论栈中是否存在相同url的页面。
-
Single:单实例模式。如果目标页面的url已经存在于页面栈中,则会将离栈顶最近的同url页面移动到栈顶,该页面成为新建页。如果目标页面的url在页面栈中不存在同url页面,则按照默认的多实例模式进行跳转。
我们通常使用 mode 来控制
router.pushUrl9+
pushUrl(options: RouterOptions, mode: RouterMode): Promise<void>
跳转到应用内的指定页面。
元服务API: 从API version 11开始,该接口支持在元服务中使用。
系统能力: SystemCapability.ArkUI.ArkUI.Full
参数:
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
options | RouterOptions | 是 | 跳转页面描述信息。 |
mode | RouterMode | 是 | 跳转页面使用的模式。 |
具体实例
有一个设置页(Setting)和一个主题切换页(Theme),希望从设置页点击主题选项,跳转到主题切换页。同时,需要保证每次只有一个主题切换页存在于页面栈中,在返回时直接回到设置页。这种场景下,可以使用pushUrl()方法,并且使用Single实例模式。
import { router } from ‘@kit.ArkUI’;
// 在Setting页面中
function onJumpClick(): void {
router.pushUrl({
url: ‘pages/Theme’ // 目标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.’);
});
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
如何携带参数
如果需要在跳转时传递一些数据给目标页面,则可以在调用Router模块的方法时,添加一个params属性,并指定一个对象作为参数。例如:
import { router } from ‘@kit.ArkUI’;
class DataModelInfo {
age: number = 0;
}
class DataModel {
id: number = 0;
info: DataModelInfo|null = null;
}
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.’);
})
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
在目标页面中,可以通过调用Router模块的getParams()方法来获取传递过来的参数。例如:
import { router } from ‘@kit.ArkUI’;
class InfoTmp {
age: number = 0
}
class RouTmp {
id: object = () => {
}
info: InfoTmp = new InfoTmp()
}
const params: RouTmp = router.getParams() as RouTmp; // 获取传递过来的参数对象
const id: object = params.id // 获取id属性的值
const age: number = params.info.age // 获取age属性的值
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
返回
当用户在一个页面完成操作后,通常需要返回到上一个页面或者指定页面,这就需要用到页面返回功能。在返回的过程中,可能需要将数据传递给目标页面,这就需要用到数据传递功能。
3 种方式
方式一:返回到上一个页面。
import { router } from ‘@kit.ArkUI’;
router.back();
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
方式二:返回到指定页面。
import { router } from ‘@kit.ArkUI’;
router.back({
url: ‘pages/Home’
});
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
方式三:返回到指定页面,并传递自定义参数信息。
import { router } from ‘@kit.ArkUI’;
router.back({
url: ‘pages/Home’,
params: {
info: ‘来自Home页’
}
});
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
在目标页面中,在需要获取参数的位置调用router.getParams()方法即可,例如在onPageShow()生命周期回调中:
import { router } from ‘@kit.ArkUI’;
@Entry
@Component
struct Home {
@State message: string = ‘Hello World’;
onPageShow() {
const params = router.getParams() as Record<string, string>; // 获取传递过来的参数对象
if (params) {
const info: string = params.info as string; // 获取info属性的值
}
}
…
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
说明
当使用router.back()方法返回到指定页面时,原栈顶页面(包括)到指定页面(不包括)之间的所有页面栈都将从栈中弹出并销毁。
另外,如果使用router.back()方法返回到原来的页面,原页面不会被重复创建,因此使用@State声明的变量不会重复声明,也不会触发页面的aboutToAppear()生命周期回调。如果需要在原页面中使用返回页面传递的自定义参数,可以在需要的位置进行参数解析。例如,在onPageShow()生命周期回调中进行参数解析。
返回前确认
在开发应用时,为了避免用户误操作或者丢失数据,有时候需要在用户从一个页面返回到另一个页面之前,弹出一个询问框,让用户确认是否要执行这个操作。
如果想要在目标界面开启页面返回询问框,需要在调用router.back()方法之前,通过调用router.showAlertBeforeBackPage()方法设置返回询问框的信息。例如,在支付页面中定义一个返回按钮的点击事件处理函数:
import { router } from ‘@kit.ArkUI’;
import { BusinessError } from ‘@kit.BasicServicesKit’;
// 定义一个返回按钮的点击事件处理函数
function onBackClick(): void {
// 调用router.showAlertBeforeBackPage()方法,设置返回询问框的信息
try {
router.showAlertBeforeBackPage({
message: ‘您还没有完成支付,确定要返回吗?’ // 设置询问框的内容
});
} catch (err) {
let message = (err as BusinessError).message
let code = (err as BusinessError).code
console.error(Invoke showAlertBeforeBackPage failed, code is ${code}, message is ${message}
);
}
// 调用router.back()方法,返回上一个页面
router.back();
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>
HarmonyOS 鸿蒙Next中,路由跳转主要使用Navigation组件替代了原先的Router。确保页面栈配置正确,如使用NavPathStack管理页面。跳转时,通过Navigation的pushPath等方法实现页面间导航。同时,支持页面传参和页面栈管理,如popPath用于返回上一页。如果问题依旧没法解决请加我微信,我的微信是itying888。