鸿蒙4.0开发笔记之ArkTS语法基础之数据传递与共享详细讲解(十八)

文章目录

    • 一、路由数据传递(router)
      • 1、路由数据传递定义
      • 2、路由数据传递使用方法
      • 3、数据传递两个页面的效果
    • 二、页面间数据共享(EntryAbility)
      • 1、定义
      • 2、实现案例
      • 3、避坑点
    • 三、数据传递练习

一、路由数据传递(router)

1、路由数据传递定义

即使用router.pushUrl进行路由跳转,从而实现页面间的数据传递。这个方法可以实现一个页面向另一个指定页面的数据传递和共享。

2、路由数据传递使用方法

(1)例如在LifeCircle页面的Build()组件下创建一个页面跳转的按钮,实现页面跳转,

		//验证页面跳转的数据传递按钮
        Button('页面跳转')

(2)在按钮中创建点击事件,点击事件内容就是使用router.pushUrl()进行页面跳转,跳转到另外一个新建的页面“pages/LifeCircle2”中。并且跳转时携带一个对象数据,包含有id、name、age3个数据元素。

			//创建点击事件
          .onClick(()=>{
            //调用路由函数,进行页面的跳转,除了路径,同时带有一个对象,包括三个键值对元素
              router.pushUrl({
                url:"pages/LifeCircle2",
                params: {
                  id:'001',
                  name:'页面壹',
                  age:25
                }
              })
          })

(3)在另外一个页面LifeCircle2中接收数据,获取跳转对象的数据,利用键值对的键名进行取值。

let pageID = router.getParams()['id'] as string
let pageName = router.getParams()['name']
let pageAge = router.getParams()['age']

(4)最后在第二个页面LifeCircle2呈现从其他页面获取的数据。

Divider()
Text(pageID).fontSize(40).backgroundColor(Color.Yellow)
Text(pageName).fontSize(40).backgroundColor(Color.Yellow)
Text(pageAge).fontSize(40).backgroundColor(Color.Yellow)

(5)在第二个页面LifeCircle2内创建返回按钮和返回路由函数调用。

//验证页面跳转的数据传递按钮
        Button('点击返回')
          //创建点击事件
          .onClick(() => {
            //调用路由函数,进行页面的跳转,除了路径,同时带有一个对象,包括三个键值对元素
            router.back()
          })

3、数据传递两个页面的效果

LifeCircle效果:
01
LifeCircle2效果:
02

二、页面间数据共享(EntryAbility)

1、定义

这是一种全局的数据共享方法,可以在所有页面之间进行数据共享。实现方法就是在EntryAbility.ts文件中使用AppStorage.SetOrCreate()进行数据的定义,这个数据就可以在这个项目所有的页面中进行数据获取,通过AppStorage.Get()获取。

2、实现案例

(1)首先在roject/entry/src/main/ets/entryability/EntryAbility.ts文件中定义一个数据:
03
(2)然后在LifeCircle中进行数据获取:
04

3、避坑点

Previewer预览器中无法显示效果,因为在预览该页面时,EntryAbility.ts文件还没有执行,因此无法获取到页面之间共享的数据。
在这里插入图片描述
解决方法:使用本地模拟器、真机模拟器或者远程模拟器(建议),记得将默认的启动页面修改为需要调试的页面。如何修改请参考文章:HarmonyOS 修改App的默认加载的界面(ArkTS版本)本次使用的华为官方的远程模拟器,这样就可以看到效果了:
在这里插入图片描述

三、数据传递练习

1、EntryAbility页面
05
2、LifeCircle页面

import router from '@ohos.router'

//在应用程序的各个页面中取出由EntryAbility定义的共享数据:使用AppStorage.Get
let name:string = AppStorage.Get('AppName')

@Entry
@Component
struct LifeCircle {
  //调用从EntryAbility中获取的数据赋值给message,并在后方用Text呈现
  @State message: string = name
  @State isAppear:boolean = true

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Divider()
        Button('显示/隐藏子组件')
          .backgroundColor(Color.Orange)
          .onClick(()=>{
            this.isAppear = !this.isAppear
          })
        if(this.isAppear){
          LifeCircle_son()
        }

        //验证页面跳转的数据传递按钮
        Button('页面跳转')
          //创建点击事件
          .onClick(()=>{
            //调用路由函数,进行页面的跳转,除了路径,同时带有一个对象,包括三个键值对元素
              router.pushUrl({
                url:"pages/LifeCircle2",
                params: {
                  id:'001',
                  name:'页面壹',
                  age:25
                }
              })
          })

      }
      .width('100%')
    }
    .height('100%')
  }

  //页面显示
  onPageShow(){
    //打印出页面显示的提醒
    console.log('LifeCircle1: Page is onPageShow')
  }
  //页面隐藏
  onPageHide(){
    //打印出页面隐藏的提醒
    console.log('LifeCircle1: Page is onPageHide')
  }
  //页面返回:手机按钮上的返回
  onBackPress(){
    //打印出页面返回的提醒
    console.log('LifeCircle1: Page is onBackPress')
  }

  //aboutToAppear和aboutToDisappear也可以放在入口组件中,后者表示程序被sha死时调用的函数
  //组件即将出现时回调该接⼝
  aboutToAppear(){
    console.log('LifeCircle1: Page is 入口aboutToAppear')
  }
  //组件析构销毁时触发的函数
  aboutToDisappear(){
    console.log('LifeCircle1: Page is 入口aboutToDisappear')
  }
}

//子组件的内容
@Component
struct LifeCircle_son{
  build(){
    Column(){
      Text('页面1子组件内容').fontSize(40).fontStyle(FontStyle.Italic)
    }
  }

  //组件即将出现时回调该接⼝
  aboutToAppear(){
    console.log('LifeCircle1: Page is 子组件aboutToAppear')
  }

  //组件析构销毁时触发的函数
  aboutToDisappear(){
    console.log('LifeCircle1: Page is 子组件aboutToDisappear')
  }
}

3、LifeCircle2页面

import router from '@ohos.router';
//获取跳转对象的数据:利用键值对的键名进行取值
//从其他页面接收的数据不知道其变量,暂时作为string接收
let pageID = router.getParams()['id'] as string
let pageName = router.getParams()['name']
let pageAge = router.getParams()['age']

@Entry
@Component
struct LifeCircle2 {
  @State message: string = 'Hello World'
  @State isAppear:boolean = true

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Divider()
        Button('显示/隐藏子组件')
          .backgroundColor(Color.Orange)
          .onClick(() => {
            this.isAppear = !this.isAppear
          })
        if (this.isAppear) {
          LifeCircle_son()
        }

        //在第二个页面使用从其他页面获取的数据
        Divider()
        Text(pageID).fontSize(40).backgroundColor(Color.Yellow)
        Text(pageName).fontSize(40).backgroundColor(Color.Yellow)
        Text(pageAge).fontSize(40).backgroundColor(Color.Yellow)

        //验证页面跳转的数据传递按钮
        Button('点击返回')
          //创建点击事件
          .onClick(() => {
            //调用路由函数,进行页面的跳转,除了路径,同时带有一个对象,包括三个键值对元素
            router.back()
          })
      }
      .width('100%')
    }
    .height('100%')
  }

  //页面显示
  onPageShow(){
    //打印出页面显示的提醒
    console.log('LifeCircle2: Page is onPageShow')
  }
  //页面隐藏
  onPageHide(){
    //打印出页面隐藏的提醒
    console.log('LifeCircle2: Page is onPageHide')
  }
  //页面返回:手机按钮上的返回
  onBackPress(){
    //打印出页面返回的提醒
    console.log('LifeCircle2: Page is onBackPress')
  }

  //aboutToAppear和aboutToDisappear也可以放在入口组件中,后者表示程序被sha死时调用的函数
  //组件即将出现时回调该接⼝
  aboutToAppear(){
    console.log('LifeCircle2: Page is 入口aboutToAppear')
  }
  //组件析构销毁时触发的函数
  aboutToDisappear(){
    console.log('LifeCircle2: Page is 入口aboutToDisappear')
  }
}

//子组件的内容
@Component
struct LifeCircle_son{
  build(){
    Column(){
      Text('页面2子组件内容').fontSize(40).fontStyle(FontStyle.Italic)
    }
  }

  //组件即将出现时回调该接⼝
  aboutToAppear(){
    console.log('LifeCircle2: Page is 子组件aboutToAppear')
  }

  //组件析构销毁时触发的函数
  aboutToDisappear(){
    console.log('LifeCircle2: Page is 子组件aboutToDisappear')
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/229166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

梳理一下嵌入式和单片机之间的关系

一定有很多人都听说过嵌入式和单片机,但在刚开始接触时,不知道大家有没有听说过嵌入式就是单片机这样的说法,其实嵌入式和单片机还是有区别的。单片机与嵌入式到底有什么关系? 下面我们就来说说嵌入式和单片机之间的联系和区别吧…

信息可视化在数字孪生中的应用:打造直观决策支持系统

在当今的数字化时代,数字孪生和信息可视化已成为推动各行业发展的重要力量。数字孪生为物理世界提供了一个虚拟的副本,而信息可视化则将复杂的数据以易于理解的方式呈现出来。两者之间的关系密切,相辅相成,为决策者提供了更全面、…

如何解决el-table中动态添加固定列时出现的行错位

问题描述 在使用el-table组件时,我们有时需要根据用户的操作动态地添加或删除一些固定列,例如操作列或选择列。但是,当我们使用v-if指令来控制固定列的显示或隐藏时,可能会出现表格的行错位的问题,即固定列和非固定列…

定时器TIM HAL库+cubeMX(上)

定时器时钟源APB1 36MHz 一.基本定时器 1.基本框图 2.溢出时间计算 3.配置定时器步骤 TIM_HandleTypeDef g_timx_handle;/* 定时器中断初始化函数 */ void btim_timx_int_init(uint16_t arr, uint16_t psc) {g_timx_handle.Instance TIM6;g_timx_handle.Init.Prescaler p…

3D Web轻量引擎HOOPS Communicator如何实现对大模型的渲染支持?

除了读取轻松外,HOOPS Communicator对超大模型的支持效果也非常好,它可以支持30GB的包含70万个零件和3.5亿个三角面的Catia装配模型! 那么它是如何来实现对大模型的支持呢? 我们将从以下几个方面与大家分享:最低帧率…

校验maven安装是否安装成功失败

错误分析: 如图,核心文件存没有存放在maven文件夹里,而是存放在他下面的一个文件夹中 解决办法: 将文件剪切到“apache-maven-3.9.6-bin”文件夹中 验证: 问题解决!

MySQL 教程 2.1

MySQL 插入数据 MySQL 表中使用 INSERT INTO 语句来插入数据。 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT INTO table_name (colu…

在Pytorch中使用Tensorboard可视化训练过程

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 本节课我们来讲一下如何在pytouch当中去使用我们的tensorboard 对我们的训练过程进行一个可视化 左边有一个visualizing models data and training with tensorboard 主要是这么一个教程 那么这里…

SPECPOWER2008

一、前言# 1、软件说明# 官网:SERT套件用户指南2.0.5SPECpower介绍SPEC基准及工具SPECpower_ssj2008测试结果SPECpower_ssj2008-Design_ccs - SPEC# SPEC(the Standard Performance Evaluation Corporation)是一个由计算机硬件厂商、软件公…

fatal error: sql.h: No such file or directory的解决办法

Ubuntu环境下运行命令 sudo apt install unixodbc-dev 来源:https://github.com/mkleehammer/pyodbc/issues/441

【面试】测试/测开(ING)

63. APP端特有的测试 参考:APP专项测试、APP应用测试 crash和anr的区别 1)网络测试 2)中断测试 3)安装、卸载测试 4)兼容测试 5)性能测试(耗电量、流量、内存、服务器端) 6&#xf…

十、数据读/写流程

1、数据写入流程: (1)基础流程 ~客户端发送请求 ~NameNode做判断,是否具有权限,空间是否充足 ~返回地址,告诉客户端一个datanode, ~向指定的datanode发送数据包, 副本的复制和备…

Liunx系统使用超详细(五)~命令符号

目录 一、逻辑符号 1.1&& 1.2|| 二、连接符号 2.1| 2.2> 2.3>> 2.4< 三、分隔符号 3.1 &#xff1b; 在Linux中&#xff0c;逻辑符号和连接符号常用于构建命令行中的逻辑操作和管道操作。下面对这两种符号进行总结描述。 一、逻辑符号 1.1&…

管理类联考——数学——真题篇——按题型分类——充分性判断题——秒杀

题型结构 问题求解&#xff1a;通过计算求解&#xff0c;从五个选项中选出一个正确答案。条件充分性判断&#xff1a;问所给的条件&#xff08;1&#xff09;&#xff08;2&#xff09;能否推出题设的结论&#xff0c;共有五个选项&#xff0c;从中选出正确的一个。&#xff0…

Qt练习题

1.使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否…

ubuntu18.04配置cuda+cudnn+anconda+pytorch-gpu+pycharm

一、显卡驱动安装 执行nvidia-smi查看安装情况 二、cuda安装 cuda官网下载cuda_11.6.2_510.47.03_linux.run&#xff0c;安装执行 sudo sh cuda_11.6.2_510.47.03_linux.run提升安装项&#xff0c;驱动不用安装&#xff0c;即第一项&#xff08;Driver&#xff09;&#xff…

int(1) 和 int(10) 的区别

int(1) 和 int(10) 的区别 最近遇到个问题&#xff0c;有个表的要加个user_id字段&#xff0c;user_id字段可能很大&#xff0c;于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单&#xff0c;于是说&#xff1a;这int(1)怕是不够用吧&#xff0c;接…

springboot智慧导诊系统源码:根据患者症状匹配挂号科室

一、系统概述 医院智慧导诊系统是在医疗中使用的引导患者自助就诊挂号&#xff0c;在就诊的过程中有许多患者不知道需要挂什么号&#xff0c;要看什么病&#xff0c;通过智慧导诊系统&#xff0c;可输入自身疾病的症状表现&#xff0c;或选择身体部位&#xff0c;在经由智慧导诊…

【EtherCAT详解】基于Wireshark的EtherCAT帧结构解析

写在前面 EtherCAT的报文比较繁琐,且一些参考书籍错误较多,且晦涩难懂,对于初学者,很难快速的入门。本文适用于有一定基础的研究者,如对报文有一些研究、对canopen协议有一定了解、并且对TwinCAT有了解的研究者。当然,对于初学者来说,也是很好的引导,少走很多弯路。本…

云上巴蜀丨云轴科技ZStack成功实践精选(川渝)

巴蜀——古政权必争之地 不仅拥有优越的战略位置 而且拥有丰富的自然资源&#xff0c;悠久的历史文化 如今的川渝经济、人口发展迅速 2023年前三季度&#xff0c;四川与重庆GDP增速均超过国家平均线&#xff0c;为6.5%为5.6% 川渝经济发展带动数字化发展浪潮 云轴科技ZSt…
最新文章