鸿蒙UI系统组件12——页面间跳转(router)

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下面名片,关注公众号。

1、概述

实际的APP开发中,几乎都会遇到有多个页面跳转的情况,例如,登录 -> 首页 -> 个人中心。在鸿蒙开发中,页面间的跳转被称作为“页面路由”。

HarmonyOS提供了Router模块,通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。

本文将从页面跳转、页面返回和页面返回前增加一个询问框几个方面介绍Router模块提供的功能。

2、页面跳转

页面跳转是开发过程中的一个重要组成部分。在使用应用程序时,通常需要在不同的页面之间跳转,有时还需要将数据从一个页面传递到另一个页面。下面是一个页面跳转的简单示例(动图):

图片

Router模块提供了两种跳转模式,分别是router.pushUrl()和router.replaceUrl()。这两种模式决定了目标页是否会替换当前页。

  • router.pushUrl():目标页不会替换当前页,而是压入页面栈。这样可以保留当前页的状态,并且可以通过返回键或者调用router.back()方法返回到当前页。

  • router.replaceUrl():目标页会替换当前页,并销毁当前页。这样可以释放当前页的资源,并且无法返回到当前页。

需要注意的是:页面栈的最大容量为32个页面。如果超过这个限制,可以调用router.clear()方法清空历史页面栈,释放内存空间。

另外,Router模块提供了两种实例模式,分别是Standard和Single。这两种模式决定了目标url是否会对应多个实例。

  • Standard:标准实例模式,也是默认情况下的实例模式。每次调用该方法都会新建一个目标页,并压入栈顶。

  • Single:单实例模式。即如果目标页的url在页面栈中已经存在同url页面,则离栈顶最近的同url页面会被移动到栈顶,并重新加载;如果目标页的url在页面栈中不存在同url页面,则按照标准模式跳转。

好了,具体router怎么用呢?

step1: 在使用页面路由Router相关功能之前,需要在代码中先导入Router模块。

import router from '@ohos.router';

step2: 不同的业务场景,讨论如下。

  • 场景一:有一个主页(Home)和一个详情页(Detail),希望从主页点击一个商品,跳转到详情页。同时,需要保留主页在页面栈中,以便返回时恢复状态。这种场景下,可以使用pushUrl()方法,并且使用Standard实例模式(或者省略)。

// 在Home页面中function onJumpClick(): void {  router.pushUrl({    url: 'pages/Detail' // 目标url  }, router.RouterMode.Standard, (err) => {    if (err) {      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);      return;    }    console.info('Invoke pushUrl succeeded.');  });}
  • 场景二:有一个登录页(Login)和一个个人中心页(Profile),希望从登录页成功登录后,跳转到个人中心页。同时,销毁登录页,在返回时直接退出应用。这种场景下,可以使用replaceUrl()方法,并且使用Standard实例模式(或者省略)。

// 在Login页面中function onJumpClick(): void {  router.replaceUrl({    url: 'pages/Profile' // 目标url  }, router.RouterMode.Standard, (err) => {    if (err) {      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);      return;    }    console.info('Invoke replaceUrl succeeded.');  })}
  • 场景三:有一个设置页(Setting)和一个主题切换页(Theme),希望从设置页点击主题选项,跳转到主题切换页。同时,需要保证每次只有一个主题切换页存在于页面栈中,在返回时直接回到设置页。这种场景下,可以使用pushUrl()方法,并且使用Single实例模式。

// 在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.');  });}
  • 场景四:有一个搜索结果列表页(SearchResult)和一个搜索结果详情页(SearchDetail),希望从搜索结果列表页点击某一项结果,跳转到搜索结果详情页。同时,如果该结果已经被查看过,则不需要再新建一个详情页,而是直接跳转到已经存在的详情页。这种场景下,可以使用replaceUrl()方法,并且使用Single实例模式。

// 在SearchResult页面中function onJumpClick(): void {  router.replaceUrl({    url: 'pages/SearchDetail' // 目标url  }, router.RouterMode.Single, (err) => {    if (err) {      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);      return;    }    console.info('Invoke replaceUrl succeeded.');})}

以上讨论的场景都是直接跳转的场景,页面之间没有数据传递。

如果页面间需要在跳转时传递数据页目标页,则可以在调用Router模块的方法时,添加param属性,并指定一个对象为参数,例如:

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属性的值

3、页面的返回

当用户在一个页面完成操作后,通常需要返回到上一个页面或者指定页面,这就需要用到页面返回功能。在返回的过程中,可能需要将数据传递给目标页,这就需要用到数据传递功能。

图片

与页面的跳转类似,第一步,在使用页面路由Router相关功能之前,需要在代码中先导入Router模块。

import router from '@ohos.router';

第二步分场景讨论:

  • 场景一:直接返回到上一个页面,那实现代码则可以是:

router.back();

这种方式会返回到上一个页面,即上一个页面在页面栈中的位置。但是,上一个页面必须存在于页面栈中才能够返回,否则该方法将无效。

  • 场景二:返回到指定的页面

router.back({  url: 'pages/Home'});

这种方式可以返回到指定页面,需要指定目标页的路径。目标页必须存在于页面栈中才能够返回。

  • 场景三:返回到指定页面,并传递自定义参数信息。

router.back({  url: 'pages/Home',  params: {    info: '来自Home页'  }});

这种方式不仅可以返回到指定页面,还可以在返回的同时传递自定义参数信息。这些参数信息可以在目标页中通过调用router.getParams()方法进行获取和解析。

如果返回时传递了自定义参数到返回的页面,那返回的目标也怎么获取传递过来的参数呢?

在目标页中,在需要获取参数的位置调用router.getParams()方法即可,例如在onPageShow()生命周期回调中:

onPageShow() {  const params = router.getParams(); // 获取传递过来的参数对象  const info = params['info']; // 获取info属性的值}

需要注意:

当使用router.back()方法返回到指定页面时,原栈顶页面(包括)到指定页面(不包括)之间的所有页面栈都将从栈中弹出并销毁。

另外,如果使用router.back()方法返回到原来的页面,原页面不会被重复创建,因此使用@State声明的变量不会重复声明,也不会触发页面的aboutToAppear()生命周期回调。如果需要在原页面中使用返回页面传递的自定义参数,可以在需要的位置进行参数解析。例如,在onPageShow()生命周期回调中进行参数解析。

4、页面返回前增加确认对话框

在开发应用时,为了避免用户误操作或者丢失数据,有时候需要在用户从一个页面返回到另一个页面之前,弹出一个询问框,让用户确认是否要执行这个操作。

接下来将从系统默认询问框和自定义询问框两个方面来介绍如何实现页面返回前增加一个询问框的功能。

4.1、系统的默认询问框

为了实现这个功能,可以使用页面路由Router模块提供的两个方法:router.showAlertBeforeBackPage()和router.back()来实现这个功能。具体怎么做呢?

按照惯例,在使用页面路由Router相关功能之前,需要在代码中先导入Router模块。

import router from '@ohos.router';

实现默认询问框,代码如下:​​​​​​​

// 定义一个返回按钮的点击事件处理函数function onBackClick(): void {  // 调用router.showAlertBeforeBackPage()方法,设置返回询问框的信息  try {    router.showAlertBeforeBackPage({      message: '您还没有完成支付,确定要返回吗?' // 设置询问框的内容    });  } catch (err) {    console.error(`Invoke showAlertBeforeBackPage failed, code is ${err.code}, message is ${err.message}`);  }  // 调用router.back()方法,返回上一个页面  router.back();}

其中,router.showAlertBeforeBackPage()方法接收一个对象作为参数,该对象包含以下属性:

  • message:string类型,表示询问框的内容。

    如果调用成功,则会在目标界面开启页面返回询问框;如果调用失败,则会抛出异常,并通过err.code和err.message获取错误码和错误信息。

    当用户点击“返回”按钮时,会弹出确认对话框,询问用户是否确认返回。选择“取消”将停留在当前页目标页;选择“确认”将触发router.back()方法,并根据参数决定如何执行跳转。

4.2、自定义询问框

自定义询问框的方式,可以使用弹窗或者自定义弹窗实现。这样可以让应用界面与系统默认询问框有所区别,提高应用的用户体验度。本文以弹窗为例,介绍如何实现自定义询问框。

按照惯例,在使用页面路由Router相关功能之前,需要在代码中先导入Router模块。

import router from '@ohos.router';

在事件回调中,调用弹窗的promptAction.showDialog()方法:​​​​​​​

import router from '@ohos.router';import promptAction from '@ohos.promptAction';@Entry@Componentstruct SecondPage {  @State message: string = 'Hello World'  onBackPress() {    // 弹出自定义的询问框    promptAction.showDialog({      message: '您还没有完成支付,确定要返回吗?',      buttons: [        {          text: '取消',          color: '#FF0000'        },        {          text: '确认',          color: '#0099FF'        }      ]    }).then((result) => {      if (result.index === 0) {        // 用户点击了“取消”按钮        console.info('User canceled the operation.');      } else if (result.index === 1) {        // 用户点击了“确认”按钮        console.info('User confirmed the operation.');        // 调用router.back()方法,返回上一个页面        router.back();      }    }).catch((err) => {      console.error(`Invoke showDialog failed, code is ${err.code}, message is ${err.message}`);    })    return true;  }  build() {    Row() {      Column() {        Text(this.message)          .fontSize(50)          .fontWeight(FontWeight.Bold)      }      .width('100%')    }    .height('100%')  }}

当用户点击“返回”按钮时,会弹出自定义的询问框,询问用户是否确认返回。选择“取消”将停留在当前页目标页;选择“确认”将触发router.back()方法,并根据参数决定如何执行跳转。

示意效果如下:

图片

5、Q&A

  • 可能有朋友会问,路由跳转里面的url是怎么填呢?

这个url是我们创建page的时候配置的,在下图示意这个路径可以看到url。

图片

  • 怎么创建一个page呢?

如图所示,在项目的pages目录右键 -> new 可以看到page选项,创建好后,profile/main_pages.json中会自动配置上url。

图片

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中进行页面跳转可以使用Vue Router来实现。以下是一个简单的步骤: 1. 首先,在你的Vue项目中安装Vue Router。你可以通过运行以下命令来安装: ``` npm install vue-router ``` 2. 在你的项目中创建一个router.js文件(或者你可以选择其他的文件名),并在该文件中引入Vue和Vue Router: ```javascript import Vue from 'vue'; import VueRouter from 'vue-router'; Vue.use(VueRouter); ``` 3. 在router.js文件中定义路由规则。你可以使用`VueRouter`实例的`routes`属性来定义路由规则,每个路由规则都包含一个路径和一个组件。例如: ```javascript import Home from './components/Home.vue'; import About from './components/About.vue'; const routes = [ { path: '/', component: Home }, { path: '/about', component: About } ]; ``` 4. 创建一个`VueRouter`实例,并将路由规则传递给它: ```javascript const router = new VueRouter({ routes }); ``` 5. 在你的Vue实例中使用该路由。假设你的Vue实例是在main.js文件中创建的,你需要在该文件中导入router.js,并将其传递给Vue实例: ```javascript import Vue from 'vue'; import App from './App.vue'; import router from './router'; new Vue({ router, render: h => h(App) }).$mount('#app'); ``` 6. 在你的组件中使用`<router-link>`标签来创建链接,以便进行页面跳转。例如,在你的App.vue组件中,你可以添加以下代码: ```html <template> <div> <router-link to="/">Home</router-link> <router-link to="/about">About</router-link> <router-view></router-view> </div> </template> ``` 这样,当用户点击"Home"链接时,页面跳转到Home组件,当用户点击"About"链接时,页面跳转到About组件。 这是一个简单的示例,你可以根据你的具体需求进行修改和扩展。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值