鴻蒙HarmonyOS實戰-ArkUI元件(頁面路由)

蜀道山QAQ發表於2024-04-12

🚀一、路由導航

路由導航是指在應用程式中透過路徑導航定位到特定頁面的過程。路由導航的實現通常採用路由器(router)來進行管理,路由器根據路徑的不同值將使用者請求導向到不同的頁面。

在HarmonyOS中路由導航主要有:頁面跳轉、頁面返回和頁面返回前增加一個詢問框

🔎1.程式設計路由

🦋1.1 頁面跳轉

頁面跳轉相關作用:

image

Router模組提供了兩種跳轉模式: router.pushUrl() 和 router.replaceUrl()。router.pushUrl() 可以透過返回鍵或者呼叫router.back()方法返回到當前頁:

image

Router模組提供了兩種例項模式: Standard 和 Single:

image

☀️1.1.1 保留主頁在頁面棧中,以便返回時恢復狀態

主頁(Home)和 詳情頁(Detail)

1、主頁

import router from '@ohos.router';
// 在Home頁面中
function onJumpClick(): void {
  router.pushUrl({
    url: 'pages/ImagePage' // 目標url
  }, router.RouterMode.Standard, (err) => {
    if (err) {
      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke pushUrl succeeded.');
  });
}
@Entry
@Component
struct Index {
  build() {
    Row() {
      Button('跳轉到圖片頁面')
        .onClick(e=>{
          onJumpClick()
        })
    }.alignItems(VerticalAlign.Center).justifyContent(FlexAlign.Center).backgroundColor(0xffd306).height('100%').width('100%')
  }
}

image

2、詳情頁

import router from '@ohos.router';
@Entry //FA模式必須有這個
@Component
struct Index {
  @State imageWidth: number = 150

  build() {
    Column() {
      Row(){
        Image($r('app.media.icon'))
          .width(this.imageWidth)
      }
      .width('100%')
      .height(400)
      .justifyContent(FlexAlign.Center)

      Row(){
        Text($r('app.string.width_label'))
          .fontSize(20)
          .fontWeight(FontWeight.Bold)

        TextInput({text: this.imageWidth.toFixed(0)})
          .width(150)
          .backgroundColor('#FFF')
          .type(InputType.Number)
          .onChange( value => {
            this.imageWidth = parseInt(value)
          })
      }
      .width('100%')
      .padding({left: 14, right: 14})
      .justifyContent(FlexAlign.SpaceBetween)

      Divider()
        .width('91%')

      Row(){
        Button('縮小')
          .width(80)
          .fontSize(20)
          .onClick(() => {
            if(this.imageWidth >= 10){
              this.imageWidth -= 10
            }
          })

        Button('放大')
          .width(80)
          .fontSize(20)
          .onClick(() => {
            if(this.imageWidth < 300){
              this.imageWidth += 10
            }
          })

      }
      .width('100%')
      .margin({ top: 35, bottom: 35 })
      .justifyContent(FlexAlign.SpaceEvenly)
      Button('回到首頁')
        .width(160)
        .fontSize(20)
        .onClick(() => {
          router.back()
        })

      Slider({
        min: 100,
        max: 300,
        value: this.imageWidth,
        step: 10,
      })
        .width('100%')
        .blockColor('#36D')
        .trackThickness(5)
        .showTips(true)
        .onChange(value => {
          this.imageWidth = value
        })
    }
    .width('100%')
    .height('100%')
  }
}

image

☀️1.1.2 不保留主頁在頁面棧中,在返回時直接退出應用

登入頁(Login)和 個人中心頁(Profile)的切換適用案例

1、登入頁

function onJumpClick(): void {
  router.replaceUrl({
    url: 'pages/ImagePage' // 目標url
  }, router.RouterMode.Standard, (err) => {
    if (err) {
      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke replaceUrl succeeded.');
  })
}
☀️1.1.3 保留主頁在頁面棧中,以便返回時恢復狀態

設定頁(Setting)和一個主題切換頁

1、設定頁

// 在Setting頁面中
function onJumpClick(): void {
  router.pushUrl({
    url: 'pages/Theme' // 目標url
  }, router.RouterMode.Single, (err) => {
    if (err) {
      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke pushUrl succeeded.');
  });
}
☀️1.1.4 保留主頁在頁面棧中,以便返回時恢復狀態

搜尋結果列表頁(SearchResult)和一個搜尋結果詳情頁(SearchDetail)

1、搜尋結果列表頁

// 在SearchResult頁面中
function onJumpClick(): void {
  router.replaceUrl({
    url: 'pages/SearchDetail' // 目標url
  }, router.RouterMode.Single, (err) => {
    if (err) {
      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke replaceUrl succeeded.');})
}

🦋1.2 頁面引數

☀️1.2.1 主頁頁面引數傳遞和獲取

1、引數傳遞

class DataModelInfo {
  age: number;
}

class DataModel {
  id: number;
  info: DataModelInfo;
}

function onJumpClick(): void {
  // 在Home頁面中
  let paramsInfo: DataModel = {
    id: 123,
    info: {
      age: 20
    }
  };

  router.pushUrl({
    url: 'pages/Detail', // 目標url
    params: paramsInfo // 新增params屬性,傳遞自定義引數
  }, (err) => {
    if (err) {
      console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke pushUrl succeeded.');
  })
}

2、引數獲取

const params = router.getParams(); // 獲取傳遞過來的引數物件
const id = params['id']; // 獲取id屬性的值
const age = params['info'].age; // 獲取age屬性的值
☀️1.2.1 返回頁頁面引數傳遞和獲取

image

1、引數傳遞

router.back({
  url: 'pages/Home',
  params: {
    info: '來自Home頁'
  }
});

2、引數獲取

onPageShow() {
  const params = router.getParams(); // 獲取傳遞過來的引數物件
  const info = params['info']; // 獲取info屬性的值
}

🦋1.3 頁面返回前增加一個詢問框

image

☀️1.3.1 預設詢問框
import router from '@ohos.router';

function onJumpClick(): void {
  router.pushUrl({
    url: 'pages/ImagePage' // 目標url
  }, router.RouterMode.Standard, (err) => {
    if (err) {
      console.error(`Invoke replaceUrl failed, code is ${err.code}, message is ${err.message}`);
      return;
    }
    console.info('Invoke replaceUrl succeeded.');
  })
}
@Entry
@Component
struct Index {
  build() {
    Row() {
      Button('跳轉到圖片頁面')
        .onClick(e=>{
          onJumpClick()
        })
    }.alignItems(VerticalAlign.Center).justifyContent(FlexAlign.Center).backgroundColor(0xffd306).height('100%').width('100%')
  }
}

image

☀️1.3.2 自定義詢問框
import router from '@ohos.router';
import promptAction from '@ohos.promptAction';

function onBackClick() {
  // 彈出自定義的詢問框
  promptAction.showDialog({
    message: '您還沒有完成支付,確定要返回嗎?',
    buttons: [
      {
        text: '取消',
        color: '#FF0000'
      },
      {
        text: '確認',
        color: '#0099FF'
      }
    ]
  }).then((result) => {
    if (result.index === 0) {
      // 使用者點選了“取消”按鈕
      console.info('User canceled the operation.');
    } else if (result.index === 1) {
      // 使用者點選了“確認”按鈕
      console.info('User confirmed the operation.');
      // 呼叫router.back()方法,返回上一個頁面
      router.back();
    }
  }).catch((err) => {
    console.error(`Invoke showDialog failed, code is ${err.code}, message is ${err.message}`);
  })
}

@Entry
@Component
struct Index {
  @State imageWidth: number = 150

  build() {
    Column() {
      Row(){
        Image($r('app.media.icon'))
          .width(this.imageWidth)
      }
      .width('100%')
      .height(400)
      .justifyContent(FlexAlign.Center)

      Row(){
        Text($r('app.string.width_label'))
          .fontSize(20)
          .fontWeight(FontWeight.Bold)

        TextInput({text: this.imageWidth.toFixed(0)})
          .width(150)
          .backgroundColor('#FFF')
          .type(InputType.Number)
          .onChange( value => {
            this.imageWidth = parseInt(value)
          })
      }
      .width('100%')
      .padding({left: 14, right: 14})
      .justifyContent(FlexAlign.SpaceBetween)

      Divider()
        .width('91%')

      Row(){
        Button('縮小')
          .width(80)
          .fontSize(20)
          .onClick(() => {
            if(this.imageWidth >= 10){
              this.imageWidth -= 10
            }
          })

        Button('放大')
          .width(80)
          .fontSize(20)
          .onClick(() => {
            if(this.imageWidth < 300){
              this.imageWidth += 10
            }
          })

      }
      .width('100%')
      .margin({ top: 35, bottom: 35 })
      .justifyContent(FlexAlign.SpaceEvenly)
      Button('回到首頁')
        .width(160)
        .fontSize(20)
        .onClick(() => {
          onBackClick()
        })

      Slider({
        min: 100,
        max: 300,
        value: this.imageWidth,
        step: 10,
      })
        .width('100%')
        .blockColor('#36D')
        .trackThickness(5)
        .showTips(true)
        .onChange(value => {
          this.imageWidth = value
        })
    }
    .width('100%')
    .height('100%')
  }
}

image

🚀寫在最後

  • 如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:
  • 點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。
  • 關注小編,同時可以期待後續文章ing🚀,不定期分享原創知識。
  • 更多鴻蒙最新技術知識點,請關注作者部落格:https://t.doruo.cn/14DjR1rEY

image

相關文章