0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙OS開發(fā)實(shí)例:【頁面?zhèn)髦堤D(zhuǎn)】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-29 20:16 ? 次閱讀

介紹

本篇主要介紹如何在HarmonyOS中,在頁面跳轉(zhuǎn)之間如何傳值

HarmonyOS 的頁面指的是帶有@Entry裝飾器的文件,其不能獨(dú)自存在,必須依賴UIAbility這樣的組件容器

如下是官方關(guān)于State模型開發(fā)模式下的應(yīng)用包結(jié)構(gòu)示意圖,Page就是帶有@Entry裝飾器的文件

0000000000011111111.20231123162458.56374277887047155204379708661912.png

那么在頁面跳轉(zhuǎn)時(shí),在代碼層面最長路徑其實(shí)是有兩步 1,打開UIAbility 2. 打開Page

整體交互效果

傳值理論

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

準(zhǔn)備

搜狗高速瀏覽器截圖20240326151547.png

我們熟讀玩文檔后,開始創(chuàng)建一個(gè)Demo工程,選擇Stage模型

代碼實(shí)踐

1.定制主入口頁面

功能

  1. 頁面曝光停留時(shí)長計(jì)算
  2. 增加進(jìn)入二級頁面入口
import systemDateTime from '@ohos.systemDateTime'
import router from '@ohos.router'

@Entry
@Component
struct Index {
  @State message: string = '頁面跳轉(zhuǎn)'

  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. 展示主入口頁面停留時(shí)間
  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為空表示本設(shè)備
        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. 添加三級頁面

注意

先要添加注冊一個(gè)新的容器,這里命名為: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 三種傳值方式的數(shù)據(jù)
    LocalStorageAbilityPage.ets 文件
  • 展示LocalStorage,EventHub方式的數(shù)據(jù)
    import router from '@ohos.router';
    import common from '@ohos.app.ability.common';
    
    // 通過GetShared接口獲取stage共享的LocalStorage實(shí)例
    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傳值內(nèi)容')
              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傳值內(nèi)容')
              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')
        });
      }
    
    }
    

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    57

    文章

    2302

    瀏覽量

    42689
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1966

    瀏覽量

    29962
  • 鴻蒙OS
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    4359
收藏 人收藏

    評論

    相關(guān)推薦

    HarmonyOS開發(fā)案例:【UIAbility內(nèi)和UIAbility間頁面跳轉(zhuǎn)

    基于Stage模型下的UIAbility開發(fā),實(shí)現(xiàn)UIAbility內(nèi)和UIAbility間頁面跳轉(zhuǎn)
    的頭像 發(fā)表于 05-09 15:06 ?1366次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【UIAbility內(nèi)和UIAbility間<b class='flag-5'>頁面</b>的<b class='flag-5'>跳轉(zhuǎn)</b>】

    鴻蒙OS開發(fā):典型頁面場景【一次開發(fā),多端部署】(資源使用)

    頁面開發(fā)過程中,經(jīng)常需要用到顏色、字體、間距、圖片等資源,在不同的設(shè)備或配置中,這些資源的可能不同。
    的頭像 發(fā)表于 05-28 09:44 ?888次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b>:典型<b class='flag-5'>頁面</b>場景【一次<b class='flag-5'>開發(fā)</b>,多端部署】(資源使用)

    鴻蒙OS應(yīng)用開發(fā)實(shí)踐(三)

    簡單的鴻蒙交互程序:從一個(gè)頁面跳轉(zhuǎn)到另一個(gè)頁面。(一)創(chuàng)建工程先創(chuàng)建一個(gè)新的TV的empty java工程:點(diǎn)finish后,發(fā)現(xiàn)這次從創(chuàng)建到項(xiàng)目環(huán)境加載完成,用了很短的時(shí)間,這是因?yàn)?/div>
    發(fā)表于 12-03 21:54

    鴻蒙OS應(yīng)用開發(fā)實(shí)踐(三)

    簡單的鴻蒙交互程序:從一個(gè)頁面跳轉(zhuǎn)到另一個(gè)頁面。 (一)創(chuàng)建工程先創(chuàng)建一個(gè)新的TV的empty java工程:點(diǎn)finish后,發(fā)現(xiàn)這次從創(chuàng)建到項(xiàng)目環(huán)境加載完成,用了很短的時(shí)間,這是
    發(fā)表于 12-04 08:54

    跳轉(zhuǎn)鴻蒙-在HarmonyOS手機(jī)應(yīng)用實(shí)現(xiàn)圖片文字布局與頁面跳轉(zhuǎn)

    一、亮點(diǎn)說明應(yīng)用頁面的圖片和文字布局與實(shí)現(xiàn)頁面跳轉(zhuǎn),是一個(gè)應(yīng)用開發(fā)的最基本的組成部分。特別是剛開始進(jìn)入鴻蒙應(yīng)用服務(wù)
    發(fā)表于 02-08 14:55

    #HarmonyOS征文#—頁面之間的跳轉(zhuǎn)

    個(gè)按鈕。第二步:寫第二個(gè)界面第三步:書寫跳轉(zhuǎn)關(guān)系鴻蒙UI中,提供了兩種編寫布局的方式:在XML中聲明UI布局在代碼中創(chuàng)建布局這兩種方式創(chuàng)建出的布局沒有本質(zhì)差別,但是XML方式較為方便簡單,以后開發(fā)
    發(fā)表于 07-20 14:44

    鴻蒙應(yīng)用開發(fā)入門資料合集

    系統(tǒng)中的HiLog日志工具的具體使用方法。5、鴻蒙應(yīng)用開發(fā)入門資料五:頁面跳轉(zhuǎn)認(rèn)識IntentIntent是對象之間傳遞信息的載體。例如,當(dāng)一個(gè)Ability需要啟動另一個(gè)Abili
    發(fā)表于 03-22 11:23

    鴻蒙 OS 應(yīng)用開發(fā)初體驗(yàn)

    的操作系統(tǒng)平臺和開發(fā)框架。HarmonyOS 的目標(biāo)是實(shí)現(xiàn)跨設(shè)備的無縫協(xié)同和高性能。 DevEco Studio 對標(biāo) Android Studio,開發(fā)鴻蒙 OS 應(yīng)用的 IDE。
    發(fā)表于 11-02 19:38

    JavaScript讓HTML靜態(tài)頁面的方法

    JavaScript讓HTML靜態(tài)頁面的方法有四種:1、JavaScript通過URL。2、JavaScript通過Cookie
    發(fā)表于 01-09 15:24 ?5876次閱讀
    JavaScript讓HTML靜態(tài)<b class='flag-5'>頁面</b><b class='flag-5'>傳</b><b class='flag-5'>值</b>的方法

    頁面之間如何進(jìn)行詳細(xì)方法

    本文檔的主要內(nèi)容詳細(xì)介紹的是頁面之間如何進(jìn)行詳細(xì)方法。
    發(fā)表于 10-23 17:20 ?5次下載
    <b class='flag-5'>頁面</b>之間如何進(jìn)行<b class='flag-5'>傳</b><b class='flag-5'>值</b>詳細(xì)方法

    鴻蒙OS開發(fā)實(shí)例:【工具類封裝-頁面路由】

    import common from '@ohos.app.ability.common'; import router from '@ohos.router'封裝app內(nèi)的頁面之間跳轉(zhuǎn)、app與app之間的
    的頭像 發(fā)表于 03-28 16:16 ?831次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>OS</b><b class='flag-5'>開發(fā)</b><b class='flag-5'>實(shí)例</b>:【工具類封裝-<b class='flag-5'>頁面</b>路由】

    HarmonyOS開發(fā)案例:【Ability內(nèi)頁面間的跳轉(zhuǎn)

    基于Stage模型下的Ability開發(fā),實(shí)現(xiàn)Ability內(nèi)頁面間的跳轉(zhuǎn)和數(shù)據(jù)傳遞。
    的頭像 發(fā)表于 05-09 10:39 ?516次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【Ability內(nèi)<b class='flag-5'>頁面</b>間的<b class='flag-5'>跳轉(zhuǎn)</b>】

    鴻蒙Ability Kit(程序框架服務(wù))【UIAbility內(nèi)和UIAbility間頁面跳轉(zhuǎn)

    基于Stage模型下的UIAbility開發(fā),實(shí)現(xiàn)UIAbility內(nèi)和UIAbility間頁面跳轉(zhuǎn)。
    的頭像 發(fā)表于 06-03 14:13 ?617次閱讀
    <b class='flag-5'>鴻蒙</b>Ability Kit(程序框架服務(wù))【UIAbility內(nèi)和UIAbility間<b class='flag-5'>頁面</b>的<b class='flag-5'>跳轉(zhuǎn)</b>】

    鴻蒙Ability Kit(程序框架服務(wù))【Ability內(nèi)頁面間的跳轉(zhuǎn)

    基于Stage模型下的Ability開發(fā),實(shí)現(xiàn)Ability內(nèi)頁面間的跳轉(zhuǎn)和數(shù)據(jù)傳遞。
    的頭像 發(fā)表于 06-03 20:43 ?257次閱讀
    <b class='flag-5'>鴻蒙</b>Ability Kit(程序框架服務(wù))【Ability內(nèi)<b class='flag-5'>頁面</b>間的<b class='flag-5'>跳轉(zhuǎn)</b>】

    鴻蒙開發(fā):【頁面棧及任務(wù)鏈】

    單個(gè)UIAbility組件可以實(shí)現(xiàn)多個(gè)頁面,并在多個(gè)頁面之間跳轉(zhuǎn),這種UIAbility組件內(nèi)部的頁面跳轉(zhuǎn)關(guān)系稱為“
    的頭像 發(fā)表于 06-14 10:10 ?329次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>頁面</b>棧及任務(wù)鏈】