【鴻蒙 HarmonyOS 4.0】路由router

一、介紹

頁面路由指在應用程序中實現不同頁面之間的跳轉和數據傳遞。HarmonyOS提供了Router模塊,通過不同的url地址,可以方便地進行頁面路由,輕松地訪問不同的頁面。

二、頁面跳轉

2.1、兩種跳轉模式:

  • router.pushUrl():目標頁不會替換當前頁,而是壓入頁面棧。這樣可以保留當前頁的狀態,并且可以通過返回鍵或者調用router.back()方法返回到當前頁。
  • router.replaceUrl():目標頁會替換當前頁,并銷毀當前頁。這樣可以釋放當前頁的資源,并且無法返回到當前頁。

2.2、兩種實例模式

  • Standard:標準實例模式,也是默認情況下的實例模式。每次調用該方法都會新建一個目標頁,并壓入棧頂。

  • Single:單實例模式。即如果目標頁的url在頁面棧中已經存在同url頁面,則離棧頂最近的同url頁面會被移動到棧頂,并重新加載;如果目標頁的url在頁面棧中不存在同url頁面,則按照標準模式跳轉。

2.3、使用步驟

2.3.1、導入Router模塊

import router from '@ohos.router';

2.3.2、利用router實現跳轉、返回等操作

2.3.2.1、不帶參數傳遞的場景

場景1:登錄頁跳轉到首頁,需要保留主頁在頁面棧中,以便返回時恢復狀態。

使用pushUrl()方法,并且使用Standard實例模式

import router from '@ohos.router'
@Entry
@Component
struct LoginPage {@State message: string = 'login'build() {Row() {Column({space:6}) {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Button('跳轉到home頁面--pushUrl').fontSize(20).onClick(() =>{router.pushUrl({url:'pages/HomePage'},router.RouterMode.Standard,(err) => {if(err){console.log('路由失敗')}})})}.width('100%')}.height('100%')}
}

場景1中,登錄跳轉到首頁時,需要保證每次首頁存在于頁面棧中,在返回時直接回到登錄頁。?需要將示例模式更換成Single,即:router.RouterMode.Single

場景2:登錄頁跳轉到首頁,銷毀登錄頁,在返回時直接退出應用。

使用replaceUrl()方法,并且使用Standard實例模式

import router from '@ohos.router'
@Entry
@Component
struct LoginPage {@State message: string = 'login'build() {Row() {Column({space:6}) {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Button('跳轉到home頁面--replaceUrl').fontSize(20).onClick(() =>{router.replaceUrl({url:'pages/HomePage'},router.RouterMode.Standard,(err) => {if(err){console.log('路由失敗')}})})}.width('100%')}.height('100%')}
}

場景2中,登錄跳轉到首頁時,如果已經存在了就不再新建首頁,直接跳轉到首頁。?需要將示例模式更換成Single,即:router.RouterMode.Single

2.3.2.2、帶參數傳遞的場景

如果需要在跳轉時傳遞一些數據給目標頁,則可以在調用Router模塊的方法時,添加一個params屬性,并指定一個對象作為參數。例如:

        Button('跳轉到home頁面--pushUrl').fontSize(20).onClick(() =>{router.pushUrl({url:'pages/HomePage',params:{id:1}},router.RouterMode.Standard,(err) => {if(err){console.log('路由失敗')}})})

在目標頁中,可以通過調用Router模塊的getParams()方法來獲取傳遞過來的參數。例如:

const params = router.getParams(); // 獲取傳遞過來的參數對象
const id = params['id']; // 獲取id屬性的值

三、頁面返回

3.1、三種返回方式

3.1.1、返回到上一個頁面。

router.back();

3.1.2、返回到指定頁面

router.back({url: 'pages/Info'
});

這種方式可以返回到指定頁面,需要指定目標頁的路徑。目標頁必須存在于頁面棧中才能夠返回。

3.1.3、返回到指定頁面,并傳遞自定義參數信息。

router.back({url: 'pages/Info',params: {id:1}
});

這種方式不僅可以返回到指定頁面,還可以在返回的同時傳遞自定義參數信息。這些參數信息可以在目標頁中通過調用router.getParams()方法進行獲取和解析。

在目標頁中,在需要獲取參數的位置調用router.getParams()方法即可,例如在onPageShow()生命周期回調中:

onPageShow() {const params = router.getParams(); // 獲取傳遞過來的參數對象const id = params['id']; // 獲取id屬性的值
}

四、頁面返回前增加一個詢問框

在開發應用時,為了避免用戶誤操作或者丟失數據,有時候需要在用戶從一個頁面返回到另一個頁面之前,彈出一個詢問框,讓用戶確認是否要執行這個操作。

4.1、系統默認詢問框

如果想要在目標界面開啟頁面返回詢問框,需要在調用router.back()方法之前,通過調用router.showAlertBeforeBackPage()方法設置返回詢問框的信息。

例如,在Home頁面中定義一個返回按鈕的點擊事件處理函數,點擊按鈕時彈出詢問框,點擊確定按鈕再返回到登錄頁

import router from '@ohos.router'
@Entry
@Component
struct HomePage {@State message: string = 'Home'@State params:any = router.getParams()build() {Row() {Column({space:6}) {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Text('接收login傳遞的id:' + this.params.id).fontSize(30).fontWeight(FontWeight.Bold)Button('返回到login頁面').fontSize(20).onClick(() => {router.showAlertBeforeBackPage({message:'確定返回到login頁面嗎?'})router.back()})}.width('100%')}.height('100%')}
}

其中,router.showAlertBeforeBackPage()方法接收一個對象作為參數,該對象包含以下屬性:

  • message:string類型,表示詢問框的內容。

    當用戶點擊“返回”按鈕時,會彈出確認對話框,詢問用戶是否確認返回。選擇“取消”將停留在當前頁目標頁;選擇“確認”將觸發router.back()方法,并根據參數決定如何執行跳轉。

4.2、自定義詢問框

點擊按鈕時,調用彈窗的promptAction.showDialog()方法:

import router from '@ohos.router'
import promptAction from '@ohos.promptAction'
@Entry
@Component
struct HomePage {@State message: string = 'Home'@State params:any = router.getParams()build() {Row() {Column({space:6}) {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold)Text('接收login傳遞的id:' + this.params.id).fontSize(30).fontWeight(FontWeight.Bold)Button('返回到login頁面').fontSize(20).onClick(() => {promptAction.showDialog({message:'確定返回到login頁面嗎?',buttons: [{text: '取消',color: '#FF0000'},{text: '確認',color: '#0099FF'}]}).then((result)=>{if(result.index === 0){// 用戶點擊了“取消”按鈕console.log('點擊了取消按鈕')}else if(result.index === 1){// 用戶點擊了“確認”按鈕console.log('用戶點擊了“確認”按鈕')// 調用router.back()方法,返回上一個頁面router.back();}}).catch(err => {console.error(`Invoke showDialog failed, code is ${err.code}, message is ${err.message}`);})})}.width('100%')}.height('100%')}
}

當用戶點擊“返回”按鈕時,會彈出自定義的詢問框,詢問用戶是否確認返回。選擇“取消”將停留在當前頁目標頁;選擇“確認”將觸發router.back()方法,并根據參數決定如何執行跳轉。

最后:👏👏😊😊😊👍👍?

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

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

相關文章

vue2與vue3中父子組件傳參的區別

本次主要針對vue中父子組件傳參所進行講解 一、vue2和vue3父傳子區別 1.vue2的父傳子 1).在父組件子標簽中自定義一個屬性 <sonPage :子組件接收到的類名"傳輸的數據">子組件</sonPage> 2).在子組件中peops屬性中拿到自定屬性 props: {子組件接收的…

Stable Diffusion算法、結構全流程概述

Stable Diffusion能力強、功能多、插件廣&#xff0c;本文擬概述SD的全流程&#xff0c;方便梳理算法各結構的關系 1、stable diffusion訓練用ddpm, 采樣用ddim DDPM的推理采樣步長和訓練時的步長一樣&#xff0c;導致采樣步數過多&#xff0c;推理時間長。DDIM指出&#xff…

安卓游戲開發之音頻技術優劣分析

一、引言 在安卓游戲開發中&#xff0c;音頻處理技術扮演著至關重要的角色&#xff0c;它不僅能夠增強游戲的沉浸感和玩家體驗&#xff0c;還能通過聲音效果傳達關鍵的游戲信息。以下將對幾種常見的安卓游戲音頻處理技術進行優劣分析&#xff0c;并結合應用場景來闡述其特點。 …

docker鏡像打包和解壓

背景 工作記錄 打包鏡像 docker save -o 壓縮包名稱.tar 鏡像名稱:鏡像版本 例如 docker save -o app-web.tar app-web:2.0解壓鏡像 這里解壓上面打包的app-web的壓縮包 docker load<壓縮包名稱.tar docker load<app-web.tar這樣解壓下來的實際就是app-web:2.0這個鏡…

微服務-微服務API網關Spring-clould-gateway實戰

1. 需求背景 在微服務架構中&#xff0c;通常一個系統會被拆分為多個微服務&#xff0c;面對這么多微服務客戶端應該如何去調用呢&#xff1f; 如果根據每個微服務的地址發起調用&#xff0c;存在如下問題&#xff1a; 1.客戶端多次請求不同的微服務&#xff0c;會增加客戶端…

Qt 事件

1. 事件 事件是對各種應用程序需要知道的由應用程序內部或者外部產生的事情或者動作的通稱。在Qt中使用一個對象來表示一個事件&#xff0c;它繼承自QEvent類。 2. 事件和信號 事件與信號并不相同&#xff0c;比如我們使用鼠標點擊了一下界面上的按鈕&#xff0c;那么就會產生…

node 之 初步認識

思考&#xff1a;為什么JavaScript可以在瀏覽器中被執行 代執行的js代碼——JavaScript解析引擎 不同的瀏覽器使用不同的JavaScript解析引擎 Chrome 瀏覽器 》 V8 Firefox瀏覽器 》OdinMonkey(奧丁猴&#xff09; Safri瀏覽器 》JSCore IE瀏覽器 》Chakra(查克拉&#xff09; e…

XML的寫法

下面我將以如下代碼來解釋下XML的寫法 <?xml version"1.0" encoding"UTF-8" ?> <Steam><steam id"1"><zhanghao>admin</zhanghao><mima>123</mima><num>120</num></steam><st…

金航標電子位于廣西柳州鹿寨縣天線生產基地于大年正月初九開工了

金航標電子位于廣西柳州鹿寨縣天線生產基地于大年正月初九開工了&#xff01;&#xff01;&#xff01;金航標kinghelm&#xff08;www.kinghelm.com.cn&#xff09;總部位于中國深圳市&#xff0c;兼顧技術、成本、管理、效率和可持續發展。東莞塘廈實驗室全電波暗室、網絡分析…

關于路徑字串標準化的代碼

上文說到&#xff0c;得到執行的正確路徑。有時這個路徑并不規范&#xff0c;所以要進行一番標準化。具體工作&#xff1a; //替換為//./替換為/../的處理 近來專門研究了一下&#xff0c;寫了個代碼。其實也不難&#xff0c;主要是處理../時麻煩。 char* format_to_exe_path…

運維SRE-06 階段性復習軟件管理體系

那些年運維必會操作-第一彈 操作 文件&#xff1a;增刪改查 增&#xff1a;touch,vim,>,>>,cp刪除&#xff1a;rm修改&#xff1a;內容&#xff1a;vi/vim,>,>> 文件名&#xff1a;mv查看&#xff1a;內容&#xff1a;cat/vim/less/more/head/tail/sed/awk/…

Day03-課后練習-參考答案(流程控制_分支結構)(判斷年、月、日是否合法,判斷打魚還是曬網,判斷星座)

文章目錄 鞏固題1、從鍵盤輸入一個整數&#xff0c;判斷它是否是5的倍數2、從鍵盤輸入一個字符&#xff0c;判斷字符類型3、計算折扣后金額4、輸出月份對應的英語單詞5、計算今天是星期幾 簡答題拔高題&#xff08;自愿&#xff09;6、判斷年、月、日是否合法7、判斷打魚還是曬…

【C++】STL容器之string(迭代器,范圍for)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;個人主頁 &#xff1a;阿然成長日記 …

ubuntu內核卸載重裝

目錄 問題1.問題復現2.可以正常啟動的方式 保存快照卸載有問題的內核重裝最新內核參考資料 問題 1.問題復現 ubuntu開機出現如下畫面,啟動不能正常啟動 2.可以正常啟動的方式 使用其他內核可以正常工作 保存快照 在解決之前保存快照,防止破壞時恢復 卸載有問題的內核…

微信小程序開發:通過wx.login()獲取用戶唯一標識openid和unionid

下面代碼展示了 openid 的獲取過程。 想獲取 unionid 需要滿足條件&#xff1a;小程序已綁定到微信開放平臺賬號下&#xff0c;不然只會返回 openid。 【相關文檔】 微信小程序開發&#xff1a;appid 和 secret 的獲取方法 wx.login({success (res) {if (res.code) {// 發起網…

無心劍小詩《斜杠青年贊歌》

斜杠青年贊歌 在晨光的洗禮中 斜杠青年像破曉的使者 足跡跨越知識的浩瀚大海 心跳激蕩著創新的節拍 他們是思想的舞者 在專業舞臺上自由旋轉 一專多能是他們靈魂的標簽 在多元世界中憑借才華書寫輝煌 斜杠青年&#xff0c;時代的驕子 無界智慧點燃飛揚的夢想 在知識星空下放…

運行jar時提示缺少依賴的類

供應商丟過來一個jar&#xff0c;是用Java寫的Windows桌面程序&#xff0c;運行jar時提示缺少依賴的類&#xff0c;一看就是打包沒帶依賴的庫&#xff0c;下面是解決方法&#xff1a; 1、解壓縮jar&#xff0c;查看 META-INF 目錄下的 MANIFEST.MF&#xff0c;看看都引用了哪些…

D4140——低功耗兩線漏電保護器控制電路。 內置二極管整流橋;觸發電流可調; 延遲時間可調;滿足 UL943 標準要 求。

D4140是一種用于交流插座電器漏電斷路器的低功耗控制器。這些設備可以檢測到接地的危險電流路徑&#xff0c;例如設備掉進水中。在發生有害或致命的電擊之前&#xff0c;斷路器會斷開線路。 D4140內置有整流橋&#xff0c;齊納管穩壓器&#xff0c;運算放大器&#xff0c;電流…

【docker入門】1-

文章目錄 參考&#xff1a; Docker – 容器虛擬化平臺。 參考&#xff1a; docker入門&#xff0c;這一篇就夠了。【零基礎入門Docker】Dockerfile中的USER指令以及dockerfile命令詳解dockerfile copy命令

算法刷題——求質數個數

文章目錄 題目描述解法思路結果 查漏補缺更新日期參考來源 題目描述 簡而言之就是&#xff0c;找一個.txt文件中質數的個數。 傳送門 解法 # 讀取文本數據 with open(primes.txt, r, encodingutf-8) as f:data f.read().split()# 將數據分為兩組&#xff0c;一組大于10^8&a…