0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙OS开发实例:【页面传值跳转】

jf_46214456 来源:jf_46214456 作者:jf_46214456 2024-03-29 20:16 次阅读

介绍

本篇主要介绍如何在HarmonyOS中,在页面跳转之间如何传值

HarmonyOS 的页面指的是带有@Entry装饰器的文件,其不能独自存在,必须依赖UIAbility这样的组件容器

如下是官方关于State模型开发模式下的应用包结构示意图,Page就是带有@Entry装饰器的文件

0000000000011111111.20231123162458.56374277887047155204379708661912.png

那么在页面跳转时,在代码层面最长路径其实是有两步 1,打开UIAbility 2. 打开Page

整体交互效果

传值理论

  1. 基于LocalStorage
  2. 基于EventHub
  3. 基于router

准备

搜狗高速浏览器截图20240326151547.png

我们熟读玩文档后,开始创建一个Demo工程,选择Stage模型

代码实践

1.定制主入口页面

功能

  1. 页面曝光停留时长计算
  2. 增加进入二级页面入口
import systemDateTime from '@ohos.systemDateTime'
import router from '@ohos.router'

@Entry
@Component
struct Index {
  @State message: string = '页面跳转'

  private showDuration: number = 0

  onPageShow() {

    this.showDuration = 0
    systemDateTime.getCurrentTime(false, (error, data) = > {
      if(!error){
        this.showDuration = data
      }
    })

  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(()= >{
            systemDateTime.getCurrentTime(false, (error, data) = > {
              router.pushUrl({ url: 'pages/OpenPage', params: {
                "from": "pages/Home.ets",
                "data": {
                  "duration":(data - this.showDuration)
                }
              } })
                .then(() = > {
                  console.info('Succeeded in jumping to the second page.')
                }).catch((error) = > {
                console.log(error)
              })
            })
          })
      }
      .width('100%')
    }
    .height('100%')
  }

}

2.添加二级页面

注意

OpenPage.ets需要在main_pages.json中的注册

{
  "src": [
    "pages/Index" //主入口页面
    ,"pages/OpenPage" //二级页面
    ,"pages/Test" //三级页面
    ,"pages/LocalStorageAbilityPage" //三级页面
  ]
}

功能

  1. 展示主入口页面停留时间
  2. 添加通过UIAbility方式打开页面的入口
  3. 添加通过router.pushUrl方式打开页面的入口
/**
 * 路由 3.1/4.0 文档
 * https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/js-apis-router-0000001478061893-V3#ZH-CN_TOPIC_0000001523808578__routerpushurl9
 *
 */
import router from '@ohos.router';
import common from '@ohos.app.ability.common';


@Entry
@Component
struct OpenPageIndex{
  @State extParams: string = ''
  private expParamsO: Object
  private context = getContext(this) as common.UIAbilityContext;

  aboutToAppear(){
    this.expParamsO = router.getParams();
    this.extParams = JSON.stringify(this.expParamsO, null, 't');
  }

  build(){
    Column(){

      List(){
            ListItemGroup() {
              ListItem() {
                Text(this.extParams)
                  .width('96%')
                  .fontSize(18)
                  .fontColor(Color.Green)
                  .backgroundColor(Color.White)
              }.width('100%')
              .align(Alignment.Start)
              .backgroundColor(0xFFFFFF)
              .borderRadius('16vp')
              .padding('12vp')

            }.divider({
              strokeWidth: 1,
              startMargin: 0,
              endMargin: 0,
              color: '#ffe5e5e5'
            })

        ListItemGroup() {

          ListItem() {
            Text('启动UIAbility页面')
              .width('96%')
              .fontSize(18)
              .fontColor(Color.Black)
              .backgroundColor(Color.White)
          }.width('100%')
          .height(50)
          .align(Alignment.Start)
          .backgroundColor(0xFFFFFF)
          .padding({ left: 10 })
          .onClick(() = > {
            this.startAbilityTest('LocalStorageAbility')
          })

          ListItem() {
            Text('启动@Entry页面')
              .width('96%')
              .fontSize(18)
              .fontColor(Color.Black)
              .backgroundColor(Color.White)
          }.width('100%')
          .height(50)
          .align(Alignment.Start)
          .backgroundColor(0xFFFFFF)
          .padding({ left: 10 })
          .onClick(() = > {
            router.pushUrl({ url: 'pages/Test', params: {
              "from": "pages/OpenPage.ets"
            } })
              .then(() = > {
                console.info('Succeeded in jumping to the second page.')
              }).catch((error) = > {
              console.log(error)
            })
          })

        }.divider({
          strokeWidth: 1,
          startMargin: 0,
          endMargin: 0,
          color: '#ffe5e5e5'
        })

      }.width('100%').height('90%')
      .divider({
        strokeWidth: px2vp(20),
        startMargin: 0,
        endMargin: 0,
        color: '#ffe5e5e5'
      })

    }.width('100%').height('100%')
    .padding({ top: px2vp(111) , left: '12vp', right: '12vp'})
    .backgroundColor('#ffe5e5e5')
  }

  async startAbilityTest(name: string) {
    try {
      let want = {
        deviceId: '', // deviceId为空表示本设备
        bundleName: 'com.harvey.testharmony',
        abilityName: name,
        parameters:{
            from: 'OpenPage.ets',
            data: {
              hello: 'word',
              who: 'please'
            }
        }
      };
      let context = getContext(this) as common.UIAbilityContext;
      await context.startAbility(want);
      console.info(`explicit start ability succeed`);
    } catch (error) {
      console.info(`explicit start ability failed with ${error.code}`);
    }

  }

}

3. 添加三级页面

注意

先要添加注册一个新的容器,这里命名为:LocalStorageAbility.ets 容器需要在module.json5中声明

{
    "name": "LocalStorageAbility",
    "srcEntry": "./ets/entryability/LocalStorageAbility.ets",
    "description": "$string:EntryAbility_desc",
    "icon": "$media:icon",
    "label": "$string:EntryAbility_label",
    "startWindowIcon": "$media:icon",
    "startWindowBackground": "$color:start_window_background"
  }
import window from '@ohos.window';
import UIAbility from '@ohos.app.ability.UIAbility';


let para:Record< string,string > = { 'PropA': JSON.stringify({ 'from': 'LocalStorageAbility'}) };
let localStorage: LocalStorage = new LocalStorage(para);

export default class LocalStorageAbility extends UIAbility {

  storage: LocalStorage = localStorage

  onCreate(want, launchParam) {

  }

  onWindowStageCreate(windowStage: window.WindowStage) {
    super.onWindowStageCreate(windowStage)

    windowStage.loadContent('pages/LocalStorageAbilityPage', this.storage, (err, data) = > {
      if (err.code) {
               return;
      }

      setTimeout(()= >{
        let eventhub = this.context.eventHub;
        console.log(para['PropA'])
        eventhub.emit('parameters', para['PropA']);
      }, 0)

    });
  }

}

Test.ets和LocalStorageAbilityPage.ets需要在main_pages.json中的注册

{
  "src": [
    "pages/Index" //主入口页面
    ,"pages/OpenPage" //二级页面
    ,"pages/Test" //三级页面
    ,"pages/LocalStorageAbilityPage" //三级页面
  ]
}

功能

  1. 展示基于LocalStorage,EventHub,router 三种传值方式的数据
    LocalStorageAbilityPage.ets 文件
  • 展示LocalStorage,EventHub方式的数据
    import router from '@ohos.router';
    import common from '@ohos.app.ability.common';
    
    // 通过GetShared接口获取stage共享的LocalStorage实例
    let storage = LocalStorage.GetShared()
    
    @Entry(storage)
    @Component
    struct LocalStorageAbilityPageIndex {
      @State message: string = ''
      // can access LocalStorage instance using
      // @LocalStorageLink/Prop decorated variables
      @LocalStorageLink('PropA') extLocalStorageParms: string = '';
    
      context = getContext(this) as common.UIAbilityContext;
    
      aboutToAppear(){
        this.eventHubFunc()
      }
    
      build() {
        Row() {
          Column({space: 50}) {
    
            Column({space: 10}){
              Text('LocalStorage传值内容')
              Text(JSON.stringify(JSON.parse(this.extLocalStorageParms), null, 't'))
                .fontSize(18)
                .fontColor(Color.Green)
                .backgroundColor(Color.White)
                .width('100%')
                .padding('12vp')
                .borderRadius('16vp')
            }
    
            Column({space: 10}){
              Text('eventHub传值内容')
              Text(this.message)
                .fontSize(18)
                .fontColor(Color.Green)
                .backgroundColor(Color.White)
                .width('100%')
                .padding('12vp')
                .borderRadius('16vp')
            }
    
          }.width('100%').height('100%')
          .padding({ top: px2vp(111) , left: '12vp', right: '12vp'})
          .backgroundColor('#ffe5e5e5')
        }
        .height('100%')
    
      }
    
      eventHubFunc() {
        this.context.eventHub.on('parameters', (...data) = > {
            this.message = JSON.stringify(JSON.parse(data[0]), null, 't')
        });
      }
    
    }
    

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    55

    文章

    1639

    浏览量

    42123
  • HarmonyOS
    +关注

    关注

    79

    文章

    1854

    浏览量

    29267
  • 鸿蒙OS
    +关注

    关注

    0

    文章

    148

    浏览量

    4280
收藏 人收藏

    评论

    相关推荐

    鸿蒙应用开发踩坑记之路由跳转

    帮我催催官方吧。这两天Mac OS发布了最新的版本,鸿蒙开发工具也发布了mac版本,这两件事稍许冲淡了我在鸿蒙应用开发中遇到的不快。今天就
    发表于 11-18 16:54

    鸿蒙应用开发踩坑记之路由跳转

    本来打算先搞地图方面的开发,但是遇到一些,已经在官方论坛发帖求助了:关于JS UI开发的一些问题大家如果对鸿蒙应用开发有兴趣,也去帮我催催官方吧。这两天Mac
    发表于 11-21 18:21

    TV屏之间跳转以及回练习

    蛟龙腾飞研修日志,库存内容分享交流。TV屏之间跳转以及回练习。
    发表于 12-03 11:49

    鸿蒙OS应用开发实践(三)

    简单的鸿蒙交互程序:从一个页面跳转到另一个页面。(一)创建工程先创建一个新的TV的empty java工程:点finish后,发现这次从创建到项目环境加载完成,用了很短的时间,这是因为
    发表于 12-03 21:54

    鸿蒙OS应用开发实践(三)

    简单的鸿蒙交互程序:从一个页面跳转到另一个页面。 (一)创建工程先创建一个新的TV的empty java工程:点finish后,发现这次从创建到项目环境加载完成,用了很短的时间,这是
    发表于 12-04 08:54

    TV屏之间跳转以及回练习

    蛟龙腾飞研修日志,库存内容分享交流。TV屏之间跳转以及回练习。
    发表于 12-08 15:24

    跳转鸿蒙-在HarmonyOS手机应用实现图片文字布局与页面跳转

    一、亮点说明应用页面的图片和文字布局与实现页面跳转,是一个应用开发的最基本的组成部分。特别是刚开始进入鸿蒙应用服务
    发表于 02-08 14:55

    #HarmonyOS征文#—页面之间的跳转

    个按钮。第二步:写第二个界面第三步:书写跳转关系鸿蒙UI中,提供了两种编写布局的方式:在XML中声明UI布局在代码中创建布局这两种方式创建出的布局没有本质差别,但是XML方式较为方便简单,以后开发
    发表于 07-20 14:44

    【木棉花】学习笔记--页面跳转

    前言大家好,我又回来啦。这一星期的学习时间又到了。那我们在前几个星期讲的都是harmonyOS里的分布式能力,可能学起来会相对较难一点,那我们这一星期就找了个简单一点的来学,那这就是页面间的跳转
    发表于 09-15 14:43

    鸿蒙应用开发入门资料合集

    系统中的HiLog日志工具的具体使用方法。5、鸿蒙应用开发入门资料五:页面跳转认识IntentIntent是对象之间传递信息的载体。例如,当一个Ability需要启动另一个Abili
    发表于 03-22 11:23

    鸿蒙 OS 应用开发初体验

    的操作系统平台和开发框架。HarmonyOS 的目标是实现跨设备的无缝协同和高性能。 DevEco Studio 对标 Android Studio,开发鸿蒙 OS 应用的 IDE。
    发表于 11-02 19:38

    鸿蒙OS2.0手机开发者Beta版登场

    12 月 16 日,华为宣布正式推出鸿蒙 OS 的手机开发者 Beta 版,并正式面向个人/企业开发者公测鸿蒙 2.0,
    的头像 发表于 12-16 14:39 1919次阅读

    鸿蒙OS千呼万唤始出来

    从2019年在华为开发者大会上公布鸿蒙OS开始,围绕着鸿蒙OS的话题始终没有停止过,而华为也坚持不懈地为
    的头像 发表于 06-01 15:56 2337次阅读

    鸿蒙os怎么升级

    6月2日,华为正式发布了鸿蒙armonyOS 2系统,那么鸿蒙os如何升级?现将鸿蒙os升级方式告知如下。
    的头像 发表于 06-08 16:26 2489次阅读

    鸿蒙OS开发实例:【工具类封装-页面路由】

    import common from '@ohos.app.ability.common'; import router from '@ohos.router'封装app内的页面之间跳转、app与app之间的
    的头像 发表于 03-28 16:16 298次阅读
    <b class='flag-5'>鸿蒙</b><b class='flag-5'>OS</b><b class='flag-5'>开发</b><b class='flag-5'>实例</b>:【工具类封装-<b class='flag-5'>页面</b>路由】