软件教程 2025年08月6日
0 收藏 0 点赞 391 浏览 6136 个字
摘要 :

文章目录 介绍 整体交互效果 传值理论 准备 代码实践 1.定制主入口页面 2.添加二级页面 3. 添加三级页面 本文主要讲解关于HarmonyOS如何实现页面跳转传值相关内容,让……




  • 介绍
  • 整体交互效果
  • 传值理论
  • 准备
  • 代码实践
  • 1.定制主入口页面
  • 2.添加二级页面
  • 3. 添加三级页面

本文主要讲解关于HarmonyOS如何实现页面跳转传值相关内容,让我们来一起学习下吧!

介绍

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

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

如下是官方关于State模型开发模式下的应用包结构示意图,Page就是带有@Entry装饰器的文件HarmonyOS如何实现页面跳转传值

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

整体交互效果

HarmonyOS如何实现页面跳转传值

传值理论

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

准备

请参照官方指导,创建一个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\')
    });
  }

}

以上就是关于HarmonyOS如何实现页面跳转传值相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客(www.panziye.com),学习愉快哦!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/6583.html

管理员

相关推荐
2025-08-06

文章目录 一、Promise基础回顾 二、Promise 与 axios 结合使用场景及方法 (一)直接返回 axios …

269
2025-08-06

文章目录 一、模块初始化时的内部机制 二、常见导出写法的差异分析 (一)写法一:module.exports…

107
2025-08-06

文章目录 一、ResizeObserver详解 (一)ResizeObserver是什么 (二)ResizeObserver的基本用法 …

683
2025-08-06

文章目录 一、前期准备工作 (一)下载相关文件 (二)安装必要工具 二、处理扣子空间生成的文件…

338
2025-08-06

文章目录 一、官方文档 二、自动解包的数据类型 ref对象:无需.value即可访问 reactive对象:保持…

371
2025-08-06

文章目录 一、Hooks的工作原理 二、在if语句中使用Hook会出什么岔子? 三、React官方的Hook使用规…

843
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号