页面路由指在应用程序中实现不同页面之间的跳转和数据传递
说明:页面栈的最大容量为32个页面。如果超过这个限制,可以调用[router.clear()]方法清空历史页面栈,释放内存空间。
1.Standard:标准实例模式,每次跳转都会新建一个目标页并压入栈顶。默认就是这种模式
2.Single:单实例模式,如果目标页已经在栈中,则离栈顶最近的同Url页面会被移动到栈顶并重新并重新加载
如:有一个设置页(Setting)和一个主题切换页(Theme),希望从设置页点击主题选项,跳转到主题切换页。同时,需要保证每次只有一个主题切换页存在于页面栈中,在返回时直接回到设置页,用single。
import router from ‘@ohos.router’;
示例1: 由一个页面跳转到另一个页面
新建aaa.etc bbb.etc
配置路由文件resource/base/profile/main_pages.js:
{
"src": [
"pages/Index",
"pages/aaa",
"pages/bbb"
]
}
aaa.etc源代码
import router from '@ohos.router';
@Entry
@Component
struct RouterTest012{
build() {
Column() {
Button() {
Text('我是主页,点击跳转内页')
.fontSize(25)
.fontWeight(FontWeight.Bold)
}
.backgroundColor('red')
.onClick(() => {
Jumpfun()
})
}
}
}
function Jumpfun(): void {
//router.RouterMode.Standard 可以省略
router.pushUrl({
url: 'pages/bbb'
}, router.RouterMode.Standard, (err) => {
if (err) {
console.error(`错误代码: ${err.code},信息: ${err.message}`);
return;
}
console.info('成功');
});
}
bbb.etc源代码
@Entry
@Component
struct RouterTest022 {
build() {
Column() {
Text("我是内页")
.fontSize(30)
.fontWeight(FontWeight.Bold)
}
}
}
示例2:**从当前页面跳转到另一个页面,同时,销毁当前页面
function Jumpfun(): void {
router.replaceUrl({
url: ‘pages/bbb’
}, router.RouterMode.Standard, (err) => {
if (err) {
console.error(错误代码: ${err.code},信息: ${err.message}
);
return;
}
console.info(‘成功’);
});
}
如果需要在跳转时传递一些数据给目标页,则可以在调用Router模块的方法时,添加一个params属性,并指定一个对象作为参数
传递参数
class DataModelInfo {
age: number;
}
class DataModel {
id: number;
info: DataModelInfo;
}
function onJumpClick(): void {
let paramsInfo: DataModel = { id: 123, info: { age: 20 } };
router.pushUrl({
url: ‘pages/Detail’, // 目标url
params: paramsInfo // 添加params属性,传递自定义参数
}, (err) => {。。。})
}
接受参数
在Detail页面,可加到页面生命周期中:
onPageShow() {
const params = router.getParams(); // 获取传递过来的参数对象
const id = params[‘id’]; // 获取id属性的值
const age = params[‘info’].age; // 获取age属性的值
}
当用户在一个页面完成操作后,通常需要返回到上一个页面或者指定页面,这就需要用到页面返回功能
1、返回到上一个页面
router.back();
上一个页面必须存在于页面栈中才能够返回,否则该方法将无效。
2、返回到指定页面。
router.back({ url: ‘pages/Home’});
3、返回到指定页面,并传递自定义参数信息。
router.back({ url: ‘pages/Home’, params: { info: ‘你好’ }});
参数调用:
onPageShow() {
const params = router.getParams(); // 获取传递过来的参数对象
const info = params[‘info’]; // 获取info属性的值
}
系统默认询问框
Router模块提供的两个方法:[router.showAlertBeforeBackPage()和[router.back()]来实现这个功能
import router from '@ohos.router';
@Entry
@Component
struct RouterTest022 {
build() {
Column() {
Text("我是内页")
.fontSize(30)
.fontWeight(FontWeight.Bold)
.onClick(()=>{
try {
router.showAlertBeforeBackPage({
message: '您确定要返回吗?' // 设置询问框的内容
});
} catch (err) {
console.error(`错误 ${err.code}, message is ${err.message}`);
}
// 调用router.back()方法,返回上一个页面
router.back();
})
}
}
}
router.showAlertBeforeBackPage()方法接收一个对象作为参数,该对象包含以下属性:
**message:**string类型,表示询问框的内容。
如果调用成功,则会在目标界面开启页面返回询问框;如果调用失败,则会抛出异常,并通过err.code和err.message获取错误码和错误信息。
当用户点击“返回”按钮时,会弹出确认对话框,询问用户是否确认返回。选择“取消”将停留在当前页目标页;选择“确认”将触发router.back()方法,并根据参数决定如何执行跳转。
自定义询问框
自定义询问框的方式,可以使用弹窗或者[自定义弹窗]实现,提高应用的用户体验度。
调用弹窗的[promptAction.showDialog()]方法
import promptAction from ‘@ohos.promptAction’
参考代码:
import router from '@ohos.router';
import promptAction from '@ohos.promptAction'
@Entry
@Component
struct RouterTest022 {
build() {
Column() {
Text("我是内页")
.fontSize(30)
.fontWeight(FontWeight.Bold)
.onClick(()=>{
// 弹出自定义的询问框
promptAction.showDialog({
message: '您确定要返回吗?',
buttons: [
{
text: '取消吧',
color: '#00FF00'
},
{
text: '确认吧',
color: '#FF0000'
}
]
}).then((result) => {
if (result.index === 0) {
console.info('用户点击了“取消”按钮');
} else if (result.index === 1) {
console.info('用户点击了“确认”按钮');
// 调用router.back()方法,返回上一个页面
router.back();
}
}).catch((err) => {
console.error(`错误: ${err.code}, message is ${err.message}`);
})
})
}
}
}