Navigation
Navigation組件一般作為Page頁面的根容器,通過屬性設置來展示頁面的標題欄、工具欄、導航欄等。
說明:
開發前請熟悉鴻蒙開發指導文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md
]
該組件從API Version 8開始支持。后續版本如有新增內容,則采用上角標單獨標記該內容的起始版本。
子組件
可以包含子組件。從API Version 9開始,推薦與[NavRouter]組件搭配使用。
接口
Navigation
Navigation()
Navigation10+
Navigation(pathInfos: NavPathStack)
綁定路由棧到Navigation組件。
參數:
參數名 | 參數類型 | 必填 | 參數描述 |
---|---|---|---|
pathInfos | [NavPathStack] | 否 | 路由棧信息。 |
屬性
除支持[通用屬性]外,還支持以下屬性:
名稱 | 參數類型 | 描述 |
---|---|---|
title | [ResourceStr]10+ | [CustomBuilder]8+ |
menus | Array<[NavigationMenuItem]> | [CustomBuilder]8+ |
titleMode | [NavigationTitleMode] | 頁面標題欄顯示模式。 默認值:NavigationTitleMode.Free |
toolbarConfiguration10+ | Array<[ToolbarItem]10+> | [CustomBuilder]8+ |
hideToolBar | boolean | 隱藏工具欄。 默認值:false true: 隱藏工具欄。 false: 顯示工具欄。 |
hideTitleBar | boolean | 隱藏標題欄。 默認值:false true: 隱藏標題欄。 false: 顯示標題欄。 |
hideBackButton | boolean | 隱藏返回鍵。 默認值:false true: 隱藏返回鍵。 false: 顯示返回鍵。 不支持隱藏NavDestination組件標題欄中的返回圖標。**說明:**返回鍵僅針對titleMode為NavigationTitleMode.Mini時才生效。 |
navBarWidth9+ | [Length] | 導航欄寬度。 默認值:240 單位:vp**說明:**僅在Navigation組件分欄時生效。 |
navBarPosition9+ | [NavBarPosition] | 導航欄位置。 默認值:NavBarPosition.Start**說明:**僅在Navigation組件分欄時生效。 |
mode9+ | [NavigationMode] | 導航欄的顯示模式。 默認值:NavigationMode.Auto 自適應:基于組件寬度自適應單欄和雙欄。**說明:**支持Stack、Split與Auto模式。 |
backButtonIcon9+ | string | [PixelMap] |
hideNavBar9+ | boolean | 是否顯示導航欄。 默認值:false |
navDestination10+ | builder: (name: string, param: unknown) => void | 創建NavDestination組件。**說明:**使用builder函數,基于name和param構造NavDestination組件。builder中允許在NavDestination組件外包含一層自定義組件, 但自定義組件不允許設置屬性和事件,否則僅顯示空白。 |
navBarWidthRange10+ | [[Dimension], [Dimension]] | 導航欄最小和最大寬度(雙欄模式下生效)。 默認值:最小默認值 240,最大默認值為組件寬度的40% ,且不大于 432。 單位:vp 規則: 開發者設置優先級 > 默認值 最小值優先級 > 最大值 navBar 優先級 > content優先級 開發者設置多個值沖突,以全局數值優先,局部最小值跟隨容器大小。 |
minContentWidth10+ | [Dimension] | 導航欄內容區最小寬度(雙欄模式下生效)。 默認值:360 單位:vp 規則: 開發者設置優先級 > 默認值 最小值優先級 > 最大值 navBar優先級 > content優先級 開發者設置多個值沖突,以全局數值優先,局部最小值跟隨容器大小。 Auto模式斷點計算:默認600vp,minNavBarWidth(240vp) + minContentWidth (360vp) |
事件
名稱 | 功能描述 |
---|---|
onTitleModeChange(callback: (titleMode: NavigationTitleMode) => void) | 當titleMode為NavigationTitleMode.Free時,隨著可滾動組件的滑動標題欄模式發生變化時觸發此回調。 |
onNavBarStateChange(callback: (isVisible: boolean) => void) | 導航欄顯示狀態切換時觸發該回調。返回值isVisible為true時表示顯示,為false時表示隱藏。 |
NavPathStack10+
Navigation路由棧。
pushPath10+
pushPath(info: NavPathInfo): void
將info指定的NavDestination頁面信息入棧。
參數:
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
info | [NavPathInfo] | 是 | NavDestination頁面的信息。 |
pushPathByName10+
pushPathByName(name: string, param: unknown): void
將name指定的NavDestination頁面信息入棧,傳遞的數據為param。
參數:
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
param | unknown | 是 | NavDestination頁面詳細參數。 |
pop10+
pop(): NavPathInfo | undefined
彈出路由棧棧頂元素。
返回值:
類型 | 說明 |
---|---|
NavPathInfo | 返回棧頂NavDestination頁面的信息。 |
undefined | 當路由棧為空時返回undefined。 |
popToName10+
popToName(name: string): number
回退路由棧到第一個名為name的NavDestination頁面。
參數:
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
返回值:
類型 | 說明 |
---|---|
number | 如果棧中存在名為name的NavDestination頁面,則返回第一個名為name的NavDestination頁面的索引,否則返回-1。 |
popToIndex10+
popToIndex(index: number): void
回退路由棧到index指定的NavDestination頁面。
參數:
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
index | number | 是 | NavDestination頁面的位置索引。 |
moveToTop10+
moveToTop(name: string): number
將第一個名為name的NavDestination頁面移到棧頂。
參數:
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
返回值:
類型 | 說明 |
---|---|
number | 如果棧中存在名為name的NavDestination頁面,則返回第一個名為name的NavDestination頁面的當前索引,否則返回-1。 |
moveIndexToTop10+
moveIndexToTop(index: number): void
將index指定的NavDestination頁面移到棧頂。
參數:
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
index | number | 是 | NavDestination頁面的位置索引。 |
clear10+
clear(): void
清除棧中所有頁面。
getAllPathName10+
getAllPathName(): Array
獲取棧中所有NavDestination頁面的名稱。
返回值:
類型 | 說明 |
---|---|
Array | 返回棧中所有NavDestination頁面的名稱。 |
getParamByIndex10+
getParamByIndex(index: number): unknown | undefined
獲取index指定的NavDestination頁面的參數信息。
參數:
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
index | number | 是 | NavDestination頁面的位置索引。 |
返回值:
類型 | 說明 |
---|---|
unknown | 返回對應NavDestination頁面的參數信息。 |
undefined | 傳入index無效時返回undefined。 |
getParamByName10+
getParamByName(name: string): Array
獲取全部名為name的NavDestination頁面的參數信息。
參數:
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
返回值:
類型 | 說明 |
---|---|
Array | 返回全部名為name的NavDestination頁面的參數信息。 |
getIndexByName10+
getIndexByName(name: string): Array
獲取全部名為name的NavDestination頁面的位置索引。
參數:
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
返回值:
類型 | 說明 |
---|---|
Array | 返回全部名為name的NavDestination頁面的位置索引。 |
size10+
size(): number
獲取棧大小。
返回值:
類型 | 說明 |
---|---|
number | 返回棧大小。 |
NavPathInfo10+
路由頁面信息。
constructor
constructor(name: string, param: unknown)
參數:
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
param | unknown | 否 | NavDestination頁面詳細參數。 |
NavigationMenuItem類型說明
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
value | string | 是 | API Version 9: 顯示菜單欄單個選項的文本。 API Version 10: 不顯示菜單欄單個選項的文本。 |
icon | string | 否 | 菜單欄單個選項的圖標資源路徑。 |
action | () => void | 否 | 當前選項被選中的事件回調。 |
object類型說明
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
value | string | 是 | 工具欄單個選項的顯示文本。 |
icon | string | 否 | 工具欄單個選項的圖標資源路徑。 |
action | () => void | 否 | 當前選項被選中的事件回調。 |
ToolbarItem10+類型說明
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
value | ResourceStr | 是 | 工具欄單個選項的顯示文本。 |
icon | ResourceStr | 否 | 工具欄單個選項的圖標資源路徑。 |
action | () => void | 否 | 當前選項被選中的事件回調。 |
status | [ToolbarItemStatus] | 否 | 工具欄單個選項的狀態。 默認值:ToolbarItemStatus.NORMAL |
activeIcon | ResourceStr | 否 | 工具欄單個選項處于ACTIVE態時的圖標資源路徑。 |
ToolbarItemStatus10+枚舉說明
名稱 | 描述 |
---|---|
NORMAL | 設置工具欄單個選項為NORMAL態,該選項顯示默認樣式,可以觸發Hover,Press,Focus事件并顯示對應的多態樣式。 |
DISABLED | 設置工具欄單個選項為DISABLED態, 該選項顯示DISABLED態樣式,并且不可交互。 |
ACTIVE | 設置工具欄單個選項為ACTIVE態, 該選項通過點擊事件可以將icon圖標更新為activeIcon對應的圖片資源。 |
NavigationTitleMode枚舉說明
名稱 | 描述 |
---|---|
Free | 當內容為可滾動組件時,標題隨著內容向上滾動而縮小(子標題的大小不變、淡出)。向下滾動內容到頂時則恢復原樣。**說明:**標題隨著內容滾動大小聯動的動效在title設置為ResourceStr和NavigationCommonTitle時生效,設置成其余自定義節點類型時字體樣式無法變化,下拉時只影響標題欄偏移。 |
Mini | 固定為小標題模式。 |
Full | 固定為大標題模式。 |
NavigationCommonTitle類型說明
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
main | string | 是 | 設置主標題。 |
sub | string | 是 | 設置副標題。 |
NavigationCustomTitle類型說明
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
builder | [CustomBuilder] | 是 | 設置標題欄內容。 |
height | [TitleHeight] | [Length] | 是 |
NavBarPosition枚舉說明
名稱 | 描述 |
---|---|
Start | 雙欄顯示時,主列在主軸方向首部。 |
End | 雙欄顯示時,主列在主軸方向尾部。 |
NavigationMode枚舉說明
名稱 | 描述 |
---|---|
Stack | 導航欄與內容區獨立顯示,相當于兩個頁面。 |
Split | 導航欄與內容區分兩欄顯示。 以下navBarWidthRange的值用[minNavBarWidth,maxNavBarWidth]表示 1.當navBarWidth屬性的值,在navBarWidthRange屬性的值范圍以外時,navBarWidth按如下規則顯示: navBarWidth < minNavBarWidth時,navBarWidth修正為minNavBarWidth; navBarWidth > maxNavBarWidth,且組件寬度 - minContentWidth - 分割線寬度(1vp)大于maxNavBarWidth時,navBarWidth修正為maxNavBarWidth; navBarWidth > maxNavBarWidth,且組件寬度 - minContentWidth - 分割線寬度(1vp)小于minNavBarWidth時,navBarWidth修正為minNavBarWidth; navBarWidth > maxNavBarWidth,且組件寬度 - minContentWidth - 分割線寬度(1vp)在navBarWidthRange范圍內,navBarWidth修正為組件寬度 - 分割線寬度(1vp) - minContentWidth。 2.當navBarWidth屬性的值,在navBarWidthRange屬性的值范圍以內時,navBarWidth按如下規則顯示: minNavBarWidth + minContentWidth + 分割線寬度(1vp) >= 組件寬度時,navBarWidth修正為minNavBarWidth; minNavBarWidth + minContentWidth + 分割線寬度(1vp) < 組件寬度,且navBarWidth + minContentWidth + 分割線寬度(1vp) >= 組件寬度時,navBarWidth修正為組件寬度 - 分割線寬度(1vp) - minContentWidth; minNavBarWidth + minContentWidth + 分割線寬度(1vp) < 組件寬度,且navBarWidth + minContentWidth + 分割線寬度(1vp) < 組件寬度時,navBarWidth為設置的值。 3.縮小組件尺寸時,先縮小內容區的尺寸至minContentWidth,然后再縮小導航欄的尺寸至minNavBarWidth。若繼續縮小,先縮小內容區,內容區消失后再縮小導航欄。 4.設置導航欄為固定尺寸時,若持續縮小組件尺寸,導航欄最后壓縮顯示。 5.若只設置了navBarWidth屬性,則導航欄寬度為navBarWidth,且分割線不可拖動。 |
Auto | API version 9之前:窗口寬度>=520vp時,采用Split模式顯示;窗口寬度<520vp時,采用Stack模式顯示。 API version 10及以上:窗口寬度>=600vp時,采用Split模式顯示;窗口寬度<600vp時,采用Stack模式顯示,600vp等于minNavBarWidth(240vp) + minContentWidth (360vp)。 |
TitleHeight枚舉說明
名稱 | 描述 |
---|---|
MainOnly | 只有主標題時標題欄的推薦高度(56vp)。 |
MainWithSub | 同時有主標題和副標題時標題欄的推薦高度(82vp)。HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿 |
說明:
目前可滾動組件只支持List。
示例
示例1
// xxx.ets
class A {
text: string = ''
num: number = 0
}
@Entry
@Component
struct NavigationExample {
private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
@State currentIndex: number = 0
@Builder NavigationTitle() {
Column() {
Text('Title')
.fontColor('#182431')
.fontSize(30)
.lineHeight(41)
.fontWeight(700)
Text('subtitle')
.fontColor('#182431')
.fontSize(14)
.lineHeight(19)
.opacity(0.4)
.margin({ top: 2, bottom: 20 })
}.alignItems(HorizontalAlign.Start)
}
@Builder NavigationMenus() {
Row() {
Image('common/ic_public_add.svg')
.width(24)
.height(24)
Image('common/ic_public_add.svg')
.width(24)
.height(24)
.margin({ left: 24 })
Image('common/ic_public_more.svg')
.width(24)
.height(24)
.margin({ left: 24 })
}
}
build() {
Column() {
Navigation() {
TextInput({ placeholder: 'search...' })
.width('90%')
.height(40)
.backgroundColor('#FFFFFF')
.margin({ top: 8 })
List({ space: 12, initialIndex: 0 }) {
ForEach(this.arr, (item: number) = > {
ListItem() {
Text('' + item)
.width('90%')
.height(72)
.backgroundColor('#FFFFFF')
.borderRadius(24)
.fontSize(16)
.fontWeight(500)
.textAlign(TextAlign.Center)
}.editable(true)
}, (item: number) = > item.toString())
}
.height(324)
.width('100%')
.margin({ top: 12, left: '10%' })
}
.title(this.NavigationTitle)
.menus(this.NavigationMenus)
.titleMode(NavigationTitleMode.Full)
.toolbarConfiguration([
{
value: $r("app.string.navigation_toolbar_add"),
icon: $r("app.media.ic_public_highlightsed")
},
{
value: $r("app.string.navigation_toolbar_app"),
icon: $r("app.media.ic_public_highlights")
},
{
value: $r("app.string.navigation_toolbar_collect"),
icon: $r("app.media.ic_public_highlights")
}
])
.hideTitleBar(false)
.hideToolBar(false)
.onTitleModeChange((titleModel: NavigationTitleMode) = > {
console.info('titleMode' + titleModel)
})
}.width('100%').height('100%').backgroundColor('#F1F3F5')
}
}
示例2
// Index.ets
import { pageOneTmp } from './pageOne'
import { pageTwoTmp } from './pageTwo'
import { pages } from './pageTwo'
@Entry
@Component
struct NavigationExample {
@Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack()
@Builder
PageMap(name: string) {
if (name === 'pageOne') {
pageOneTmp()
} else if (name === 'pageTwo') {
pageTwoTmp({ names: name, values: this.pageInfos } as pages)
}
}
build() {
Navigation(this.pageInfos) {
Column() {
Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() = > {
this.pageInfos.pushPath({ name: 'pageOne' }) //將name指定的NavDestination頁面信息入棧
})
}
}.title('NavIndex').navDestination(this.PageMap)
}
}
// pageOne.ets
class tmpClass{
count:number=10
}
@Component
export struct pageOneTmp {
@Consume('pageInfos') pageInfos: NavPathStack;
build() {
NavDestination() {
Column() {
Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() = > {
let tmp = new tmpClass()
this.pageInfos.pushPathByName('pageTwo', tmp) //將name指定的NavDestination頁面信息入棧,傳遞的數據為param
})
Button('popToname', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() = > {
this.pageInfos.popToName('pageTwo') //回退路由棧到第一個名為name的NavDestination頁面
console.log('popToName' + JSON.stringify(this.pageInfos), '返回值' + JSON.stringify(this.pageInfos.popToName('pageTwo')))
})
Button('popToIndex', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() = > {
this.pageInfos.popToIndex(1) // 回退路由棧到index指定的NavDestination頁面
console.log('popToIndex' + JSON.stringify(this.pageInfos))
})
Button('moveToTop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() = > {
this.pageInfos.moveToTop('pageTwo') // 將第一個名為name的NavDestination頁面移到棧頂
console.log('moveToTop' + JSON.stringify(this.pageInfos), '返回值' + JSON.stringify(this.pageInfos.moveToTop('pageTwo')))
})
Button('moveIndexToTop', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() = > {
this.pageInfos.moveIndexToTop(1) // 將index指定的NavDestination頁面移到棧頂
console.log('moveIndexToTop' + JSON.stringify(this.pageInfos))
})
Button('clear', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() = > {
this.pageInfos.clear() //清除棧中所有頁面
})
Button('get', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() = > {
console.log('-------------------')
console.log('獲取棧中所有NavDestination頁面的名稱', JSON.stringify(this.pageInfos.getAllPathName()))
console.log('獲取index指定的NavDestination頁面的參數信息', JSON.stringify(this.pageInfos.getParamByIndex(1)))
console.log('獲取全部名為name的NavDestination頁面的參數信息', JSON.stringify(this.pageInfos.getParamByName('pageTwo')))
console.log('獲取全部名為name的NavDestination頁面的位置索引', JSON.stringify(this.pageInfos.getIndexByName('pageOne')))
console.log('獲取棧大小', JSON.stringify(this.pageInfos.size()))
})
}.width('100%').height('100%')
}.title('pageOne')
.onBackPressed(() = > {
this.pageInfos.pop() // 彈出路由棧棧頂元素
console.log('pop' + '返回值' + JSON.stringify(this.pageInfos.pop()))
return true
})
}
}
// pageTwo.ets
export class pages {
names: string = ""
values: NavPathStack | null = null
}
@Builder
export function pageTwoTmp(info: pages) {
NavDestination() {
Column() {
Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() = > {
(info.values as NavPathStack).pushPathByName('pageOne', null)
})
}.width('100%').height('100%')
}.title('pageTwo')
.onBackPressed(() = > {
(info.values as NavPathStack).pop()
return true
})
}
審核編輯 黃宇
-
組件
+關注
關注
1文章
505瀏覽量
17806 -
鴻蒙
+關注
關注
57文章
2321瀏覽量
42749
發布評論請先 登錄
相關推薦
評論