鴻蒙HarmonyOS-Navagation基本用法

Navagation基本用法

Navigation組件是路由導航的根視圖容器,一般作為Page頁面的根容器使用,其內部默認包含了標題欄,內容欄和公工具欄,其中內容區默認首頁顯示導航內容(Navigation的子組件)或非首頁顯示(NavDestination的子組件),首頁和非首頁通過路由進行切換

  • 使用Navigation跳轉的組件不需要再使用Entry來修飾,普通組件即可
  • Navigation是一個導航組件,API9和API11的使用官方推薦方式各不相同

1. Navagation API9的用法-(Navigation-NavRouter-(其他組件+NavDestination的用法))

1. 1導航組件層次關系

組件作用層級規則
Navigation管理所有導航頁面的根容器必須包含多個 NavRouter
NavRouter定義一個跳轉入口必須配對 NavDestination
NavDestination目標頁面內容

**1. **2 按鈕覆蓋問題

  • 代碼現象跳轉B 覆蓋 跳轉A
  • 根本原因
    NavRouter 內部放置多個直接同級組件時,僅最后一個組件會被渲染。
  • ArkUI規則
    一個 NavRouter 只能關聯 一個觸發元素 (如Button),如需多個跳轉需使用多個 NavRouter

1.3 代碼案例

@Entry
@Component
struct TestNavgationAPI9 {build() {Navigation() {// --------------------- 第一跳轉入口 ---------------------NavRouter() { // ? 觸發元素Button('跳轉A')Button('跳轉B') //放置的第二個界面會覆蓋第一個//要跳轉的界面NavDestination() { // ? 目標頁面AImage($r('app.media.Coverpeople')).width(50).aspectRatio(1)// --------------------- 第二跳轉入口 ---------------------NavRouter() { // ? 觸發元素//第一個組件就是跳轉的// --------------------- 第二跳轉入口 ---------------------Text('我跳轉啦') // ? 目標頁面BNavDestination() {Text('第三個界面') // ? 目標頁面C}}}}}.height('100%').width('100%')}
}

1.4 效果展示

img

2.Navagation 10的用法

2.1 路由棧自主管理

  • NavPathStack

    核心方法:

    pushPath()    // 壓入新頁面(保留前頁)
    replacePath() // 替換當前頁面(銷毀前頁) 
    pop()         // 回到上一頁
    

2.2 頁面加載控制

  • navDestination(builder)
    通過 Builder 函數動態渲染路由目標:
  • 函數動態渲染路由目標:
.navDestination(this.navDesBuilder) // 動態路由映射
@Builder
navDesBuilder(name: string) {if (name === "pageTwo") {NavgationChild02() // 根據 name 組裝對應頁面}
}

2.3 跨組件通信

  • @Provide@Consume 裝飾器

    // 父級定義提供值
    @Provide navPathStack: NavPathStack = new NavPathStack()
    // 子組件自動獲取
    @Consume navPathStack: NavPathStack
    

    無需顯式傳遞,自動向下注入。

2.4 實現步驟

1. 自己管理頁面棧 創建一個頁面棧 (用@Provide修飾,方便跨組件使用)
 @ProvidenavPathStack: NavPathStack = new NavPathStack()
2.將創建的頁面棧實例傳遞給主界面
  • ps:這一步還是蠻關鍵的,很多頁面不展示就是這個原因
    Navigation(this.navPathStack) {Text('這是第一頁-首頁')Button('去下一頁').onClick(() => {this.navPathStack.pushPath({name: 'pageOne'})})}.height('100%').width('100%')
3.通過 Builder 函數動態渲染路由目標
1. 先創建一個自定義Builder
  @BuildermyNavPathStackBuilder(name: string) {//根據傳入的名字區渲染對應的頁面if (name === 'pageOne') {Children01()} else if (name === 'pageTwo') {Children02()} else if (name === 'pageThree') {Children03()}}
2. 傳入Builder
 .navDestination(this.navDesBuilder)
  • 不需要加括號,這里有個底層原因

    1. ArkUI 的 navDestination 機制
    • 設計邏輯:框架需要在導航時動態調用構建函數生成頁面。若傳遞this.navDesBuilder()則:
      • 代碼執行時立即運行該函數(而非按需調用)
      • 返回結果可能為 void 或非組件類型,導致渲染異常
    1. @Builder 函數的特性
    • 延遲執行@Builder 定義的 UI 編譯時會轉為獨立閉包代碼塊

    • 調用時機:由 導航框架 在需要時(如pushPath)根據name參數觸發構建

      this.navPathStack.pushPath({ name: 'pageTwo' });
      // ?? 此時 ArkUI 內部通過 `.navDestination` 關聯的 Builder 按需執行
      
3.跳轉的實現
  1. 通過點擊事件調用當前navPathStack實例pushPath方法
  2. 傳入你要跳轉頁面的名字,進行跳轉
 Button('去下一頁').onClick(() => {this.navPathStack.pushPath({name: 'pageOne'})})
4.子界面的定義
@Component
struct Children01 {//接收主界面傳遞過來的頁面棧@Consume navPathStack: NavPathStackbuild() {NavDestination() {Column({ space: 5 }) {Text('這是我從主頁跳轉的第一個界面').fontSize(24).fontWeight(500)Button('跳轉到第二個頁面去').onClick(() => {this.navPathStack.pushPath({name: 'pageTwo'})})}}}
}
@Component
struct Children02 {@ConsumenavPathStack: NavPathStackbuild() {NavDestination() {Column({ space: 5 }) {Text('這是我從主頁跳轉的第二個界面').fontSize(24).fontWeight(500)Button('跳轉到第三個頁面去').onClick(() => {this.navPathStack.pushPath({name: 'pageThree'})})}}}
}@Component
struct Children03 {@ConsumenavPathStack: NavPathStackbuild() {NavDestination() {Column() {Text('這是我從主頁跳轉的第三個界面').fontSize(24).fontWeight(500)}}}
}
5.效果展示

img

3.NavagationAPI10使用的補充內容

3.1 常見的API

配置組合代碼示例效果描述
默認狀態Navigation() .title('主標題')標題欄顯示 “主標題”,采用 Free 模式
精簡模式+隱藏標題Navigation() .titleMode(NavigationTitleMode.Mini) .hideTitleBar(true)標題欄完全不可見
子頁面獨立配置NavDestination() .title('子頁標題') .hideTitleBar(true)

3.2 傳參獲取參數的實現

1.定義數據結構
interface hobby {name: string,hobby: string
}
2.即將跳轉頁面傳入參數
   NavDestination() {Column({ space: 5 }) {Text('這是我從主頁跳轉的第二個界面').fontSize(24).fontWeight(500)Button('跳轉到第三個頁面去').onClick(() => {this.navPathStack.pushPath({name: 'pageThree',param: { name: '貓貓球', hobby: '喜歡玩毛線球' } as hobby})})}}
3.跳轉的頁面接收數據
@Component
struct Children03 {@Statehobby: hobby[] = [] as hobby[]@ConsumenavPathStack: NavPathStackaboutToAppear(): void {this.hobby = this.navPathStack.getParamByName('pageThree') as hobby[]promptAction.showToast({message: JSON.stringify(this.hobby)})}build() {NavDestination() {Column() {Text('這是我從主頁跳轉的第三個界面')Text('這是我獲取的數據')Text(this.hobby[0].name)Text(this.hobby[0].hobby).fontWeight(500)}}}
}
4.效果展示

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897259.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897259.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897259.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初階數據結構(C語言實現)——4.1棧

目錄 1.棧1.1棧的概念及結構1.2 棧的實現1.1.0 棧的初始化1.1.1 銷毀1.1.2 入棧1.1.3 出棧1.1.4 獲取棧中有效元素個數1.1.5 檢測棧是否為空,如果為空返回非零結果,如果不為空返回01.1.6 獲取棧頂元素1.1.7 驗證 附錄 棧的C語言實現源碼.h文件.c文件test…

計算光學成像與光學計算概論

計算光學成像所涉及研究的內容非常廣泛,雖然計算光學成像的研究內容是發散的,但目的都是一致的:如何讓相機記錄到客觀實物更豐富的信息,延伸并擴展人眼的視覺感知。總的來說,計算光學成像現階段已經取得了很多令人振奮…

什么樣的物聯網框架適合開展共享自助KTV唱歌項目?

現在物聯網的廣泛應用,也讓更多用戶們看到了它的實力,也使得共享經濟遍地開花。其中共享自助唱歌設備也備受歡迎,那么適合開展共享自助KTV唱歌項目的物聯網框架都應具備哪些特點呢? 智能化與自動化管理 物聯網技術在共享KTV中的應…

機器視覺選型中,不同焦距的鏡頭成像視野有什么不同?

不同焦距的鏡頭成像視野的差異主要體現在視角范圍和透視效果上。焦距越長,視角越窄,能捕捉的景物范圍越小;焦距越短,視角越廣,覆蓋的景物范圍越大。以下是具體分析: 焦距與視角的關系 焦距(Foc…

Linux16-數據庫、HTML

數據庫: 數據存儲: 變量、數組、鏈表-------------》內存 :程序運行結束、掉電數據丟失 文件 : 外存:程序運行結束、掉電數據不丟失 數據庫: …

開源訂貨系統哪個好 三大訂貨系統源碼推薦

在數字化轉型加速的今天,企業對訂貨系統的需求日益增長。一款優質的訂貨系統源碼不僅能提升供應鏈效率,還能通過二次開發滿足個性化業務需求。這里結合 “標準化、易擴展” 兩大核心要求,為您精選三款主流訂貨系統源碼,助您快速搭…

行為模式---迭代器模式

概念 迭代器模式是設計模式的行為模式,它的主要設計思想是提供一個可以操作聚合對象(容器或者復雜數據類型)表示(迭代器類)。通過迭代器類去訪問操作聚合對象可以隱藏內部表示,也可以使客戶端可以統一處理…

Maven的學習以及安裝配置 2024/3/1 idea

1. Maven的安裝 1.1 首先查看編程工具合適的Maven版本 我使用的是2024/3/1 版本的idea,接下來我會用這個版本的idea進行演示。idea沒有漢化的也可以參考我的步驟。 1、打開idea的設置,搜索Maven,進入Maven設置。 我們可以看到,…

基于 Docker 的跨平臺鏡像構建與增量更新實戰指南

引言:破解容器化兩大核心問題 在實際開發中,我們常常面臨兩個棘手問題: 跨平臺兼容性:如何在Windows平臺開發的鏡像,無縫運行在 ARM64 服務器?更新效率低下:每次代碼調整都要重新安裝全部依賴…

支付通道開通對接一般需要多少錢

不少老板都想開通AIP線上接口,但是不知道這個成本到底是多少? 其實目前第三方支付公司對外提供了標準的線上接入技術方案,一般以API、SDK等形式。因此,商戶在完成簽約審核后,可以順利拿到技術的密鑰,正常調用第三方支…

什么是 spring 的循環依賴?

什么是 spring 的循環依賴? 首先,認識一下什么是循環依賴,舉個例子:A 對象被 Spring 管理,并且引入的 B 對象,同樣的 B 對象也被 Spring 管理,并且也引入的 A 對象。這種相互被引用的情況&#…

thrift軟件、.thrif文件和thrift協議是什么關系,有什么用

Thrift軟件、.thrift文件和Thrift協議是Apache Thrift框架的三個核心組成部分,它們協同實現跨語言服務的高效開發與通信。以下是三者關系及作用的詳細解析: 一、核心組件關系 1. Thrift軟件(框架) ? 定位:Apache Th…

STM32旋轉編碼器驅動詳解:方向判斷、卡死處理與代碼分析 | 零基礎入門STM32第四十八步

主題內容教學目的/擴展視頻旋轉編碼器電路原理,跳線設置,結構分析。驅動程序與調用。熟悉電路和驅動程序。 師從洋桃電子,杜洋老師 📑文章目錄 一、旋轉編碼器原理與驅動結構1.1 旋轉編碼器工作原理1.2 驅動程序結構 二、方向判斷…

elementplus的cascader級聯選擇器在懶加載且多選時的一些問題分析

1. 背景 在之前做的一個項目中使用到了element的級聯選擇器,并且是需要懶加載、多選、父子不關聯等等,在選的時候當然沒問題,但是回顯的時候就會回顯不出來,相信大部分伙伴都遇到過這個問題。我在以前出過一篇文章寫過關于級聯選…

【Python運維】用Python自動化AWS資源管理:利用boto3實現高效管理S3桶和EC2實例

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著云計算的普及,AWS(Amazon Web Services)已經成為許多企業和開發者首選的云平臺。為了提高工作效率,自動化管理AWS資源成為了一個熱…

淘寶關鍵字搜索接口爬蟲測試實戰指南

在電商數據分析和市場研究中,通過關鍵字搜索獲取淘寶商品信息是一項重要任務。淘寶開放平臺提供了 item_search 接口,允許開發者通過關鍵字搜索商品,并獲取商品列表及相關信息。本文將詳細介紹如何設計并測試一個基于該接口的爬蟲程序&#x…

【Linux實踐系列】:用c語言實現一個shell外殼程序

🔥本文專欄:Linux Linux實踐項目 🌸博主主頁:努力努力再努力wz 那么今天我們就要進入Linux的實踐環節,那么我們之前學習了進程控制相關的幾個知識點,比如進程的終止以及進程的等待和進程的替換,…

?算法OJ?N-皇后問題 II【回溯剪枝】(C++實現)N-Queens II

?算法OJ?N-皇后問題【回溯剪枝】(C實現)N-Queens 問題描述 The n-queens puzzle is the problem of placing n n n queens on an n n n \times n nn chessboard such that no two queens attack each other. Given an integer n, return the num…

03.06 QT

一、使用QSlider設計一個進度條&#xff0c;并讓其通過線程自己動起來 程序代碼&#xff1a; <1> Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QThread> #include "mythread.h"QT_BEGIN_NAMESPACE namespace Ui {…

Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事項

以下是修改后的完整文檔&#xff0c;包含在多個多線程環境中使用 retain() 和 release() 方法的示例&#xff0c;且確保在 finally 塊中調用 release()&#xff1a; 在 Spring WebFlux 中&#xff0c;WebSocketMessage 主要用于表示 WebSocket 的消息載體&#xff0c;其中 getP…