HarmonyOS4.0系列——07、自定义组件的生命周期、路由以及路由传参

news/2024/7/21 11:24:21 标签: 鸿蒙, typescript, 前端, harmonyos

自定义组件的生命周期

允许在生命周期函数中使用 Promise 和异步回调函数,比如网络资源获取,定时器设置等;

页面生命周期

即被@Entry 装饰的组件生命周期,提供以下生命周期接口:

onPageShow

页面加载时触发,页面每次显示时触发一次,包括路由过程、应用进入前台等场景。

onPageHide

从第一个页面跳转第二个页面后,第一个页面会最为后台,触发onPageHide生命周期

页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
下面是代码尝试

LifeCycle页面

import router from '@ohos.router'
@Entry
@Component
struct LifeCycle {
  @State message: string = '第一页'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(25)
        Divider()
        Button('Next').onClick(() => {
          router.pushUrl({url:'pages/LifeCycle2'})
        })
          .fontSize(25)
      }
      .width('100%')
    }
    .height('100%')
  }
  onPageShow() {
    console.log('第一页:——onPageShow')
  }

  onPageHide() {
    console.log('第一页:——onPageHide')
  }

  onBackPress() {
    console.log('第一页:——onBackPress')
  }
}

LifeCycle2页面

import router from '@ohos.router'

@Entry
@Component
struct LifeCycle2 {
  @State message: string = '第二页'

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(25)
        Divider()
        Button('Back').onClick((event: ClickEvent) => {
          router.back()
        })
          .fontSize(25)

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

  onPageShow() {
    console.log('第二页:——onPageShow')
  }

  onPageHide() {
    console.log('第二页:——onPageHide')
  }

  onBackPress() {
    console.log('第二页:——onBackPress')
  }
}

效果的话大家可以从 DevEco Studio 左下角第四个日志中查看具体效果。

onBackPress

监听物理返回键,也就是手机上的回退,并不是路由连接router.back()的返回.
请添加图片描述

组件生命周期

一般用@Component 装饰的自定义组件的生命周期,提供以下生命周期接口:

aboutToAppear

在 build 构建之前渲染此生命周期。
详解:aboutToAppear 函数在创建自定义组件的新实例后,在执行其 build()函数之前执行。允许在 aboutToAppear 函数中改变状态变量,更改将在后续执行 build()函数中生效。

aboutToDisappear

组件销毁时触发,例如删除,移出等操作。
详解:aboutToDisappear 函数在自定义组件析构销毁之前执行。不允许在 aboutToDisappear 函数中改变状态变量,特别是@Link 变量的修改可能会导致应用程序行为不稳定。

例:

import router from '@ohos.router'

@Entry
@Component
struct LifeCycle {
  @State message: string = '第一页'
  @State status: boolean = true

  build() {
    Row() {
      Column({ space: 20 }) {
        Text(this.message)
          .fontSize(25)
        Divider()
        Button('Next').onClick(() => {
          router.pushUrl({ url: 'pages/LifeCycle2' })
        })
          .fontSize(25)
        Divider()
        if (this.status) {
          LifeCycle_son()
        }
        Button('上段文字显示/隐藏').onClick(() => {
          this.status = !this.status
        }).fontSize(25)
      }
      .width('100%')
    }
    .height('100%')
  }

  onPageShow() {
    console.log('第一页:——onPageShow')
  }

  onPageHide() {
    console.log('第一页:——onPageHide')
  }

  onBackPress() {
    console.log('第一页:——onBackPress')
  }
}

@Component
struct LifeCycle_son {
  build() {
    Column() {
      Text('我是第一页的一个子组件')
        .fontSize(30)
    }
  }
  // aboutToAppear函数在创建自定义组件的新实例后,在执行其build()函数之前执行。
  aboutToAppear() {
    console.log('我是第一页的一个子组件:aboutToAppear')
  }

  // aboutToDisappear函数在自定义组件析构销毁之前执行。
  aboutToDisappear() {
    console.log('我是第一页的一个子组件:aboutToDisappear')
  }
}

请添加图片描述

点击两次上段文字显示/隐藏按钮
依次出现上述的生命周期为:
请添加图片描述

可以看到,如果将组件删除的话就可以触发aboutTodisappear生命周期
再次点击显示时触发aboutToAppear生命周期。当然默认的话会先触发aboutToAppear,因为他默认组件LifeCycle_son是先存在的。

页面路由

路由跳转

router.pushUrl({ url: "路径" });

路由传参

router.pushUrl({
  url: "/pages/LifeCycle2",
  params: {
    id: 1,
    username: "Southern Wind",
    age: 18,
  },
});

接受参数username,在LifeCycle2页面router.getParams()

let username = router.getParams()['username'] as string

效果:
请添加图片描述

应用之间传参

公共数据共享创建参数

// 应用程序数据共享
AppStorage.Set('message','我要玩原神')
AppStorage.SetOrCreate('message2','Southern Wind')

其他页面获取此数据

let name:string = AppStorage.Get('message2')

注意:此Api需要用真机进行调试,模拟器没有效果的!!


http://www.niftyadmin.cn/n/5336156.html

相关文章

嵌入式-Stm32-江科大基于标准库的GPIO的八种模式

文章目录 一:GPIO输入输出原理二:GPIO基本结构三:GPIO位结构四:GPIO的八种模式道友:相信别人,更要一百倍地相信自己。 (推荐先看文章:《 嵌入式-32单片机-GPIO推挽输出和开漏输出》…

怎样做门窗投标标书

门窗投标标书是门窗企业参与工程项目招标的重要文件,它不仅反映了企业的技术实力、产品质量和服务水平,更是企业能否中标的关键因素。因此,如何制作一份优秀的门窗投标标书,成为了企业关注的重点。 一、了解招标要求 在制作门窗…

Webpack5入门到原理11:处理 js 资源

有人可能会问,js 资源 Webpack 不能已经处理了吗,为什么我们还要处理呢? 原因是 Webpack 对 js 处理是有限的,只能编译 js 中 ES 模块化语法,不能编译其他语法,导致 js 不能在 IE 等浏览器运行&#xff0c…

MyBatis 使用报错: Can‘t generate mapping method with primitive return type

文章目录 前言问题原因解决方案个人简介 前言 今天在新项目中使用 MyBatis 报如下错误:Cant generate mapping method with primitive return type 问题原因 发现是 Mapper 注解引入错误,错误引入 org.mapstruct.Mapper, 实际应该引入 org.apache.ibat…

oracle11g的闪回技术-闪回表-时间戳

--数据库闪回表 --1创建表(登录模式system) CREATE table dept2 as select * from dept;--此语句如果加上where条件可用于工作中数据的临时备份 select * from dept2;--查询新建表信息 --进入sql>set time on 通过时间点闪回 记录弹出的时间点&#…

Message queue 消息队列--RabbitMQ 【基础入门】

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门…

【设计模式】建造者模式就是游戏模式吗?

什么是建造者模式? 传说女娲是用泥巴捏出人来的,当时捏出的小泥人虽然每个都是两条腿、两只手、一个脑袋的样子,但是具体到每个部位,却有有所不同:有的小泥人手长一点,有的手短一点;有的脑袋圆…

力扣第236题——二叉树的最近公共祖先 (C语言题解)

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以…