【鴻蒙HarmonyOS】深入理解router與Navigation

5. 路由

1.頁面路由(router模式)

1.概述

頁面路由指的是在應用程序中實現不同頁面之間的跳轉,以及數據傳遞。

我們先明確自定義組件和頁面的關系:

  • 自定義組件:@Component 裝飾的UI單元,
  • 頁面:即應用的UI頁面。可以由一個或者多個自定義組件組成。
    • @Entry裝飾的自定義組件為頁面的入口組件,即頁面的根節點,一個頁面有且僅能有一個@Entry

通過 Router 模塊就可以實現這個功能. import { router } from '@kit.ArkUI'

步驟:

  1. 創建頁面 -> 頁面與組件不同的地方是有且只有一個入口組件( @Entry修飾),并且在src/main/resources/base/profile/main_pages.json有配置好了頁面路徑
    1. 口訣:一入口,一配置

  1. router控制頁面跳轉

  1. 帶參數跳轉并獲取

2.pushUrl 與 replaceUrl

先來看看 pushUrl的情況

  1. 默認打開首頁 → 首頁入棧
  2. pushUrl 去詳情頁 → 詳情頁入棧
  3. back 返回上一頁 → 詳情頁出棧
  4. 此時頁面棧中應該只有一個頁面

整一個過程中,都可以 router.getLength 進行查看

再來看看replaceUrl的情況

  1. 默認打開首頁 → 首頁入棧
  2. replaceUrl 去詳情頁 → 詳情頁替換首頁,首頁銷毀
  3. back 無法返回 → 沒有上一頁

跳轉到登錄頁面時可以使用 replaceUrl,因為無需在頁面棧中保存其他頁面的頁面棧信息了。

頁面棧相關 api

  // 獲取頁面棧長度router.getLength()// 獲取頁面狀態let page = router.getState();console.log('頁面棧數量:' + page.index);console.log('跳轉的路由:' + page.name);console.log('路由路徑:' + page.path);// 清空頁面棧// router.clear()
3.路由模式

路由提供了兩種不同的跳轉模式:

  1. standard(標準實例模式)
  2. Single(單實例模式)

不同模式的決定了頁面是否會創建多個實例:

  1. Standard:無論之前是否添加過,一直添加到頁面棧【默認】
    1. 場景:適用于每次跳轉都呈現全新內容或狀態的場景,避免數據展示紊亂(數據變化
  1. Single:如果之前加過頁面,會使用之前添加的頁面【需要添加參數手動修改】
    1. 場景:適用于那些需要保留頁面狀態或避免重復創建相同頁面的場景(數據不變化

路由模式語法:

總結

路由跳轉的方式有pushUrl和replaceUrl

pushUrl的跳轉要考慮兩種模式:標準模式,單例模式

  1. pushUrl({},模式為標準模式(默認的模式)) -> 頁面棧中的表現形式

  1. pushUrl({},模式為單例模式) -> 頁面棧中的表現形式

  1. replaceUrl() -> 跳轉以后的前一個頁面自動銷毀了

2.Navigation 路由

概述

組件導航(Navigation)主要用于實現頁面間以及組件內部的頁面跳轉,支持在不同組件間傳遞跳轉參數,提供靈活的跳轉棧操作,從而更便捷地實現對不同頁面的訪問和復用。本文將從組件導航(Navigation)的顯示模式、路由操作、子頁面管理、跨包跳轉以及跳轉動效等幾個方面進行詳細介紹。

Navigation是路由導航的根視圖容器,一般作為頁面(@Entry)的根容器,包括單欄(Stack)、分欄(Split)和自適應(Auto)三種顯示模式。Navigation組件適用于模塊內和跨模塊的路由切換,通過組件級路由能力實現更加自然流暢的轉場體驗,并提供多種標題欄樣式來呈現更好的標題和內容聯動效果。一次開發,多端部署場景下,Navigation組件能夠自動適配窗口顯示大小,在窗口較大的場景下自動切換分欄展示效果。

Navigation組件主要包含導航頁和子頁。導航頁由標題欄(包含菜單欄)、內容區和工具欄組成,可以通過hideNavBar屬性進行隱藏,導航頁不存在頁面棧中,與子頁,以及子頁之間可以通過路由操作進行切換。

1.是什么

Navigation是華為HarmonyOS中的一個路由導航組件,主要用于實現頁面間的跳轉和路由管理。它提供了豐富的功能和靈活的配置選項,支持模塊內和跨模塊的路由切換。Navigation組件不僅簡化了路由切換的邏輯,還提升了應用的導航效率和用戶體驗。

2. 為什么
  • 1.簡化路由管理:Navigation通過組件級的路由能力,簡化了頁面間的跳轉邏輯,使得路由管理更加直觀和便捷。
  • 2.支持模塊化開發:Navigation支持模塊內和跨模塊的路由切換,有助于實現模塊間的解耦,提升代碼的可維護性和可擴展性。
  • 3.豐富的動效支持:Navigation提供了豐富的轉場動畫和共享元素轉場能力,增強了頁面切換的視覺效果。
  • 4.生命周期管理:Navigation支持頁面生命周期的監聽和管理,開發者可以更方便地處理頁面的顯示和隱藏等狀態變化。
  • 5.動態路由:Navigation支持動態路由,允許在運行時動態加載和注冊路由,提升了路由管理的靈活性。
3.怎么用

// 1.全局聲明一個路徑棧
export const pathStack = new NavPathStack()
//路由攔截
pathStack.setInterception({willShow: (from: NavDestinationContext | "navBar", to: NavDestinationContext | "navBar",operation: NavigationOperation, animated: boolean) => {if (typeof to === "string") {AlertDialog.show({ message:JSON.stringify('回到了首頁',null,2) })return;}// 將跳轉到Page1的路由重定向到page2let target: NavDestinationContext = to as NavDestinationContext;AlertDialog.show({ message:JSON.stringify(target,null,2) })if (target.pathInfo.name === 'page1') {// target.pathStack.pop();// target.pathStack.pushPathByName('page2', null);}}
})
import { pathStack } from './utils/pathStack';@Entry
@Component
struct Demo {
param: Record<string, string> = {'name':'zs'};build() {// 2.使用頁面棧Navigation(pathStack) {Button('跳轉到page1').margin({bottom:10}).onClick(() => {// 頁面跳轉pathStack.pushPathByName('page1',null)})Button('跳轉到page2').onClick(() => {// 頁面跳轉pathStack.pushPathByName('page2',this.param)})}.title('My Page');}
}

{"routerMap": [{"name": "page1","pageSourceFile": "src/main/ets/pages/page1.ets","buildFunction": "MyPage1","data": {"description": "這是頁面1"}},{"name": "page2","pageSourceFile": "src/main/ets/pages/page2.ets","buildFunction": "MyPage2","data": {"description": "這是頁面2"}}]
}
import { pathStack } from './utils/pathStack'@Builderfunction MyPage1() {page1()}@Componentstruct page1 {build() {//3.子頁面必須要使用 NavDestination 把所有結構都包起來NavDestination() {Column() {Button('回到上一頁').onClick(() => {pathStack.pop()})}.width("100%").height("100%").justifyContent(FlexAlign.Center)}.title('page1')}}
import { pathStack } from './utils/pathStack'@Builder
function MyPage2() {page2()
}@Component
struct page2 {@State param: Record<string, string> = {};
aboutToAppear(): void {// AlertDialog.show({ message:JSON.stringify(pathStack.getParamByName('page2'),null,2) })// 獲取page2頁面的參數this.param = pathStack.getParamByName('page2').pop() as Record<string, string>;}build() {//2.子頁面必須要使用 NavDestination 把所有結構都包起來NavDestination() {Column({space:5}) {Text(`你好${this.param?.name}`)Button('回到上一頁').onClick(() => {pathStack.pop()})Button('回到首頁').onClick(() => {// 返回到根首頁(清除棧中所有頁面)pathStack.clear()})Button('去往page1').onClick(() => {// 返回到根首頁(清除棧中所有頁面)pathStack.pushPathByName('page1',null)})}.width("100%").height("100%").justifyContent(FlexAlign.Center)}}
}

?

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

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

相關文章

Apache SeaTunnel:新一代開源、高性能數據集成工具

Apache SeaTunnel 是一款開源、分布式、高性能的數據集成工具&#xff0c;可以通過配置快速搭建數據管道&#xff0c;支持實時海量數據同步。 Apache SeaTunnel 專注于數據集成和數據同步&#xff0c;主要旨在解決數據集成領域的常見問題&#xff1a; 數據源多樣性&#xff1a…

CF-Hero:自動繞過CDN找真實ip地址

CF-Hero&#xff1a;自動繞過CDN找真實ip地址 CF-Hero 是一個全面的偵察工具&#xff0c;用于發現受 Cloudflare 保護的 Web 應用程序的真實 IP 地址。它通過各種方法執行多源情報收集。目前僅支持Cloudflare的cdn服務查找真實ip&#xff0c;但從原理上來說查找方法都是通用的…

React-組件和props

1、類組件 import React from react; class ClassApp extends React.Component {constructor(props) {super(props);this.state{};}render() {return (<div><h1>這是一個類組件</h1><p>接收父組件傳過來的值&#xff1a;{this.props.name}</p>&…

談談接口和抽象類有什么區別?

接口&#xff08;interface&#xff09;和抽象類&#xff08;abstract class&#xff09;都是 Java 中常用的“抽象”工具&#xff0c;用來定義類的規范和結構&#xff0c;但它們有一些本質的區別。下面我用一個簡單明了的表格 說明來幫你理解&#xff1a; 對比點抽象類&…

使用Nacos 打造微服務配置中心

一、背景介紹 Nacos 作為服務注冊中心的使用方式&#xff0c;同時 Nacos 還可以作為服務配置中心&#xff0c;用于集中式維護各個業務微服務的配置資源。 作為服務配置中心的交互流程圖如下。 這樣設計的目的&#xff0c;有一個明顯的好處就是&#xff1a;有利于對各個微服務…

OpenCv高階(十一)——物體跟蹤

文章目錄 前言一、OpenCV 中的物體跟蹤算法1、均值漂移&#xff08;Mean Shift&#xff09;&#xff1a;2、CamShift&#xff1a;3、KCF&#xff08;Kernelized Correlation Filters&#xff09;&#xff1a;4、MIL&#xff08;Multiple Instance Learning&#xff09;&#xf…

聲音分離人聲和配樂base,vocals,drums -從頭設計數字生命第6課, demucs——仙盟創夢IDE

demucs -n htdemucs --two-stemsvocals 未來之窗.mp3 demucs -n htdemucs --shifts5 之.mp3demucs -n htdemucs --shifts5 -o wlzcoutspl 未來之窗.mp3 伴奏提取人聲分離技術具有多方面的重大意義&#xff0c;主要體現在以下幾個領域&#xff1a; 音樂創作與制作 創作便利…

使用若依二次開發商城系統-4:商品屬性

功能3&#xff1a;商品分類 功能2&#xff1a;商品品牌 功能1&#xff1a;搭建若依運行環境前言 商品屬性功能類似若依自帶的字典管理&#xff0c;分兩步&#xff0c;先設置屬性名&#xff0c;再設置對應的屬性值。 一.操作步驟 1&#xff09;數據庫表product_property和pro…

操作指南:vLLM 部署開源大語言模型(LLM)

vLLM 是一個專為高效部署大語言模型&#xff08;LLM&#xff09;設計的開源推理框架&#xff0c;其核心優勢在于顯存優化、高吞吐量及云原生支持。 vLLM 部署開源大模型的詳細步驟及優化策略&#xff1a; 一、環境準備與安裝 安裝 vLLM 基礎安裝&#xff1a;通過 pip 直接安裝…

32.768kHz晶振詳解:作用、特性及與其他晶振的區別

一、32.768kHz晶振的核心作用 實時時鐘&#xff08;RTC&#xff09;驅動&#xff1a; 提供精確的1Hz時鐘信號&#xff0c;用于計時功能&#xff08;如電子表、計算機CMOS時鐘&#xff09;。 分頻公式&#xff1a; 1Hz 32.768kHz / 2^15&#xff08;通過15級二分頻實現&#x…

第3講、大模型如何理解和表示單詞:詞嵌入向量原理詳解

1. 引言 大型語言模型&#xff08;Large Language Models&#xff0c;簡稱LLM&#xff09;如GPT-4、Claude和LLaMA等近年來取得了突破性進展&#xff0c;能夠生成流暢自然的文本、回答復雜問題、甚至編寫代碼。但這些模型究竟是如何理解人類語言的&#xff1f;它們如何表示和處…

【Java面試筆記:進階】19.Java并發包提供了哪些并發工具類?

Java 并發包(java.util.concurrent)提供了一系列強大的工具類,用于簡化多線程編程、提升并發性能并確保線程安全。 1. Java 并發包的核心內容 并發包概述:java.util.concurrent 包及其子包提供了豐富的并發工具類,用于簡化多線程編程。主要組成部分: 高級同步結構:如 C…

Matlab數字信號處理——小波閾值法去噪分析系統

&#x1f527; 系統簡介 本系統通過 MATLAB GUI 圖形界面&#xff0c;集成了 小波閾值去噪算法 的各個核心模塊&#xff0c;可以實現以下功能&#xff1a; 打開語音文件&#xff1a;支持常見音頻格式讀取&#xff1b; 模擬加噪&#xff1a;系統內置白噪聲模擬功能&#xff0…

EDI 如何與 ERP,CRM,WMS等系統集成

在數字化浪潮下&#xff0c;與制造供應鏈相關產業正加速向智能化供應鏈轉型。傳統人工處理訂單、庫存和物流的方式已難以滿足下單客戶對響應速度和數據準確性的嚴苛要求。EDI技術作為企業間數據交換的核心樞紐&#xff0c;其與ERP、CRM、WMS等業務系統的深度集成&#xff0c;成…

計算機組成原理-408考點-數的表示

常見題型&#xff1a;C語言中的有符號數和無符號數的表示。 【例】有如下C語言程序段: short si-32767&#xff1b;unsigned short usisi&#xff1b;執行上述兩條語句后&#xff0c;usi的值為___。short和unsigned short均使用16位二進制數表示。 【分析】考點&#xff1a;同…

企業級AI開發利器:Spring AI框架深度解析與實戰

企業級AI開發利器&#xff1a;Spring AI框架深度解析與實戰 一、前言&#xff1a;Java生態的AI新紀元 在人工智能技術爆發式發展的今天&#xff0c;Java開發者面臨著一個新的挑戰&#xff1a;如何將大語言模型&#xff08;LLMs&#xff09;和生成式AI&#xff08;GenAI&#…

【金倉數據庫征文】——選擇金倉,選擇勝利

目錄 第一部分&#xff1a;金倉數據庫——開創數據庫技術的新時代 1.1 金倉數據庫的技術底蘊 1.2 高可用架構與災備能力 1.3 分布式架構與彈性擴展能力 第二部分&#xff1a;金倉數據庫助力行業數字化轉型 2.1 電信行業&#xff1a;核心系統國產化替代 2.2 醫療行業&…

用C語言實現——一個中綴表達式的計算器。支持用戶輸入和動畫演示過程。

一、思路概要和知識回顧 1.思路概要 ①中綴表達式計算&#xff1a; 需要處理運算符的優先級&#xff0c;可能需要用到棧結構。 ??如何將中綴表達式轉換為后綴表達式&#xff1f;或者直接計算&#xff1f; 通常&#xff0c;中綴轉后綴&#xff08;逆波蘭式&#xff09;再…

Langchain_Agent+數據庫

本處使用Agent數據庫&#xff0c;可以直接執行SQL語句。可以多次循環查詢問題 前文通過chain去聯系數據庫并進行操作&#xff1b; 通過鏈的不斷內嵌組合&#xff0c;生成SQL在執行SQL再返回。 初始化 import os from operator import itemgetterimport bs4 from langchain.ch…

Python 爬蟲如何偽裝 Referer?從隨機生成到動態匹配

一、Referer 的作用與重要性 Referer 是 HTTP 請求頭中的一個字段&#xff0c;用于標識請求的來源頁面。它在網站的正常運行中扮演著重要角色&#xff0c;例如用于統計流量來源、防止惡意鏈接等。然而&#xff0c;對于爬蟲來說&#xff0c;Referer 也可能成為被識別為爬蟲的關…