Navigation
Navigation組件一般作為Page頁面的根容器,通過屬性設(shè)置來展示頁面的標(biāo)題欄、工具欄、導(dǎo)航欄等。
說明:
開發(fā)前請(qǐng)熟悉鴻蒙開發(fā)指導(dǎo)文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md
]
該組件從API Version 8開始支持。后續(xù)版本如有新增內(nèi)容,則采用上角標(biāo)單獨(dú)標(biāo)記該內(nèi)容的起始版本。
子組件
可以包含子組件。從API Version 9開始,推薦與[NavRouter]組件搭配使用。
接口
Navigation
Navigation()
Navigation10+
Navigation(pathInfos: NavPathStack)
綁定路由棧到Navigation組件。
參數(shù)名 | 參數(shù)類型 | 必填 | 參數(shù)描述 |
---|---|---|---|
pathInfos | [NavPathStack] | 否 | 路由棧信息。 |
屬性
除支持[通用屬性]外,還支持以下屬性:
名稱 | 參數(shù)類型 | 描述 |
---|---|---|
title | [ResourceStr]10+ | [CustomBuilder]8+ |
menus | Array<[NavigationMenuItem]> | [CustomBuilder]8+ |
titleMode | [NavigationTitleMode] | 頁面標(biāo)題欄顯示模式。 默認(rèn)值:NavigationTitleMode.Free |
toolbarConfiguration10+ | Array<[ToolbarItem]10+> | [CustomBuilder]8+ |
hideToolBar | boolean | 隱藏工具欄。 默認(rèn)值:false true: 隱藏工具欄。 false: 顯示工具欄。 |
hideTitleBar | boolean | 隱藏標(biāo)題欄。 默認(rèn)值:false true: 隱藏標(biāo)題欄。 false: 顯示標(biāo)題欄。 |
hideBackButton | boolean | 隱藏返回鍵。 默認(rèn)值:false true: 隱藏返回鍵。 false: 顯示返回鍵。 不支持隱藏NavDestination組件標(biāo)題欄中的返回圖標(biāo)。**說明:**返回鍵僅針對(duì)titleMode為NavigationTitleMode.Mini時(shí)才生效。 |
navBarWidth9+ | [Length] | 導(dǎo)航欄寬度。 默認(rèn)值:240 單位:vp**說明:**僅在Navigation組件分欄時(shí)生效。 |
navBarPosition9+ | [NavBarPosition] | 導(dǎo)航欄位置。 默認(rèn)值:NavBarPosition.Start**說明:**僅在Navigation組件分欄時(shí)生效。 |
mode9+ | [NavigationMode] | 導(dǎo)航欄的顯示模式。 默認(rèn)值:NavigationMode.Auto 自適應(yīng):基于組件寬度自適應(yīng)單欄和雙欄。**說明:**支持Stack、Split與Auto模式。 |
backButtonIcon9+ | string | [PixelMap] |
hideNavBar9+ | boolean | 是否顯示導(dǎo)航欄。 默認(rèn)值:false |
navDestination10+ | builder: (name: string, param: unknown) => void | 創(chuàng)建NavDestination組件。**說明:**使用builder函數(shù),基于name和param構(gòu)造NavDestination組件。builder中允許在NavDestination組件外包含一層自定義組件, 但自定義組件不允許設(shè)置屬性和事件,否則僅顯示空白。 |
navBarWidthRange10+ | [[Dimension], [Dimension]] | 導(dǎo)航欄最小和最大寬度(雙欄模式下生效)。 默認(rèn)值:最小默認(rèn)值 240,最大默認(rèn)值為組件寬度的40% ,且不大于 432。 單位:vp 規(guī)則: 開發(fā)者設(shè)置優(yōu)先級(jí) > 默認(rèn)值 最小值優(yōu)先級(jí) > 最大值 navBar 優(yōu)先級(jí) > content優(yōu)先級(jí) 開發(fā)者設(shè)置多個(gè)值沖突,以全局?jǐn)?shù)值優(yōu)先,局部最小值跟隨容器大小。 |
minContentWidth10+ | [Dimension] | 導(dǎo)航欄內(nèi)容區(qū)最小寬度(雙欄模式下生效)。 默認(rèn)值:360 單位:vp 規(guī)則: 開發(fā)者設(shè)置優(yōu)先級(jí) > 默認(rèn)值 最小值優(yōu)先級(jí) > 最大值 navBar優(yōu)先級(jí) > content優(yōu)先級(jí) 開發(fā)者設(shè)置多個(gè)值沖突,以全局?jǐn)?shù)值優(yōu)先,局部最小值跟隨容器大小。 Auto模式斷點(diǎn)計(jì)算:默認(rèn)600vp,minNavBarWidth(240vp) + minContentWidth (360vp) |
事件
名稱 | 功能描述 |
---|---|
onTitleModeChange(callback: (titleMode: NavigationTitleMode) => void) | 當(dāng)titleMode為NavigationTitleMode.Free時(shí),隨著可滾動(dòng)組件的滑動(dòng)標(biāo)題欄模式發(fā)生變化時(shí)觸發(fā)此回調(diào)。 |
onNavBarStateChange(callback: (isVisible: boolean) => void) | 導(dǎo)航欄顯示狀態(tài)切換時(shí)觸發(fā)該回調(diào)。返回值isVisible為true時(shí)表示顯示,為false時(shí)表示隱藏。 |
NavPathStack10+
Navigation路由棧。
pushPath10+
pushPath(info: NavPathInfo): void
將info指定的NavDestination頁面信息入棧。
參數(shù):
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
info | [NavPathInfo] | 是 | NavDestination頁面的信息。 |
pushPathByName10+
pushPathByName(name: string, param: unknown): void
將name指定的NavDestination頁面信息入棧,傳遞的數(shù)據(jù)為param。
參數(shù):
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
param | unknown | 是 | NavDestination頁面詳細(xì)參數(shù)。 |
pop10+
pop(): NavPathInfo | undefined
彈出路由棧棧頂元素。
返回值:
類型 | 說明 |
---|---|
NavPathInfo | 返回棧頂NavDestination頁面的信息。 |
undefined | 當(dāng)路由棧為空時(shí)返回undefined。 |
popToName10+
popToName(name: string): number
回退路由棧到第一個(gè)名為name的NavDestination頁面。
參數(shù):
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
返回值:
類型 | 說明 |
---|---|
number | 如果棧中存在名為name的NavDestination頁面,則返回第一個(gè)名為name的NavDestination頁面的索引,否則返回-1。 |
popToIndex10+
popToIndex(index: number): void
回退路由棧到index指定的NavDestination頁面。
參數(shù):
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
index | number | 是 | NavDestination頁面的位置索引。 |
moveToTop10+
moveToTop(name: string): number
將第一個(gè)名為name的NavDestination頁面移到棧頂。
參數(shù):
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
返回值:
類型 | 說明 |
---|---|
number | 如果棧中存在名為name的NavDestination頁面,則返回第一個(gè)名為name的NavDestination頁面的當(dāng)前索引,否則返回-1。 |
moveIndexToTop10+
moveIndexToTop(index: number): void
將index指定的NavDestination頁面移到棧頂。
參數(shù):
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
index | number | 是 | NavDestination頁面的位置索引。 |
clear10+
clear(): void
清除棧中所有頁面。
getAllPathName10+
getAllPathName(): Array
獲取棧中所有NavDestination頁面的名稱。
返回值:
類型 | 說明 |
---|---|
Array | 返回棧中所有NavDestination頁面的名稱。 |
getParamByIndex10+
getParamByIndex(index: number): unknown | undefined
獲取index指定的NavDestination頁面的參數(shù)信息。
參數(shù):
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
index | number | 是 | NavDestination頁面的位置索引。 |
返回值:
類型 | 說明 |
---|---|
unknown | 返回對(duì)應(yīng)NavDestination頁面的參數(shù)信息。 |
undefined | 傳入index無效時(shí)返回undefined。 |
getParamByName10+
getParamByName(name: string): Array
獲取全部名為name的NavDestination頁面的參數(shù)信息。
參數(shù):
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
返回值:
類型 | 說明 |
---|---|
Array | 返回全部名為name的NavDestination頁面的參數(shù)信息。 |
getIndexByName10+
getIndexByName(name: string): Array
獲取全部名為name的NavDestination頁面的位置索引。
參數(shù):
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
返回值:
類型 | 說明 |
---|---|
Array | 返回全部名為name的NavDestination頁面的位置索引。 |
size10+
size(): number
獲取棧大小。
返回值:
類型 | 說明 |
---|---|
number | 返回棧大小。 |
NavPathInfo10+
路由頁面信息。
constructor
constructor(name: string, param: unknown)
參數(shù):
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
name | string | 是 | NavDestination頁面名稱。 |
param | unknown | 否 | NavDestination頁面詳細(xì)參數(shù)。 |
NavigationMenuItem類型說明
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
value | string | 是 | API Version 9: 顯示菜單欄單個(gè)選項(xiàng)的文本。 API Version 10: 不顯示菜單欄單個(gè)選項(xiàng)的文本。 |
icon | string | 否 | 菜單欄單個(gè)選項(xiàng)的圖標(biāo)資源路徑。 |
action | () => void | 否 | 當(dāng)前選項(xiàng)被選中的事件回調(diào)。 |
object類型說明
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
value | string | 是 | 工具欄單個(gè)選項(xiàng)的顯示文本。 |
icon | string | 否 | 工具欄單個(gè)選項(xiàng)的圖標(biāo)資源路徑。 |
action | () => void | 否 | 當(dāng)前選項(xiàng)被選中的事件回調(diào)。 |
ToolbarItem10+類型說明
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
value | ResourceStr | 是 | 工具欄單個(gè)選項(xiàng)的顯示文本。 |
icon | ResourceStr | 否 | 工具欄單個(gè)選項(xiàng)的圖標(biāo)資源路徑。 |
action | () => void | 否 | 當(dāng)前選項(xiàng)被選中的事件回調(diào)。 |
status | [ToolbarItemStatus] | 否 | 工具欄單個(gè)選項(xiàng)的狀態(tài)。 默認(rèn)值:ToolbarItemStatus.NORMAL |
activeIcon | ResourceStr | 否 | 工具欄單個(gè)選項(xiàng)處于ACTIVE態(tài)時(shí)的圖標(biāo)資源路徑。 |
ToolbarItemStatus10+枚舉說明
名稱 | 描述 |
---|---|
NORMAL | 設(shè)置工具欄單個(gè)選項(xiàng)為NORMAL態(tài),該選項(xiàng)顯示默認(rèn)樣式,可以觸發(fā)Hover,Press,F(xiàn)ocus事件并顯示對(duì)應(yīng)的多態(tài)樣式。 |
DISABLED | 設(shè)置工具欄單個(gè)選項(xiàng)為DISABLED態(tài), 該選項(xiàng)顯示DISABLED態(tài)樣式,并且不可交互。 |
ACTIVE | 設(shè)置工具欄單個(gè)選項(xiàng)為ACTIVE態(tài), 該選項(xiàng)通過點(diǎn)擊事件可以將icon圖標(biāo)更新為activeIcon對(duì)應(yīng)的圖片資源。 |
NavigationTitleMode枚舉說明
名稱 | 描述 |
---|---|
Free | 當(dāng)內(nèi)容為可滾動(dòng)組件時(shí),標(biāo)題隨著內(nèi)容向上滾動(dòng)而縮小(子標(biāo)題的大小不變、淡出)。向下滾動(dòng)內(nèi)容到頂時(shí)則恢復(fù)原樣。**說明:**標(biāo)題隨著內(nèi)容滾動(dòng)大小聯(lián)動(dòng)的動(dòng)效在title設(shè)置為ResourceStr和NavigationCommonTitle時(shí)生效,設(shè)置成其余自定義節(jié)點(diǎn)類型時(shí)字體樣式無法變化,下拉時(shí)只影響標(biāo)題欄偏移。 |
Mini | 固定為小標(biāo)題模式。 |
Full | 固定為大標(biāo)題模式。 |
NavigationCommonTitle類型說明
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
main | string | 是 | 設(shè)置主標(biāo)題。 |
sub | string | 是 | 設(shè)置副標(biāo)題。 |
NavigationCustomTitle類型說明
名稱 | 類型 | 必填 | 描述 |
---|---|---|---|
builder | [CustomBuilder] | 是 | 設(shè)置標(biāo)題欄內(nèi)容。 |
height | [TitleHeight] | [Length] | 是 |
NavBarPosition枚舉說明
名稱 | 描述 |
---|---|
Start | 雙欄顯示時(shí),主列在主軸方向首部。 |
End | 雙欄顯示時(shí),主列在主軸方向尾部。 |
NavigationMode枚舉說明
名稱 | 描述 |
---|---|
Stack | 導(dǎo)航欄與內(nèi)容區(qū)獨(dú)立顯示,相當(dāng)于兩個(gè)頁面。 |
Split | 導(dǎo)航欄與內(nèi)容區(qū)分兩欄顯示。 以下navBarWidthRange的值用[minNavBarWidth,maxNavBarWidth]表示 1.當(dāng)navBarWidth屬性的值,在navBarWidthRange屬性的值范圍以外時(shí),navBarWidth按如下規(guī)則顯示: navBarWidth < minNavBarWidth時(shí),navBarWidth修正為minNavBarWidth; navBarWidth > maxNavBarWidth,且組件寬度 - minContentWidth - 分割線寬度(1vp)大于maxNavBarWidth時(shí),navBarWidth修正為maxNavBarWidth; navBarWidth > maxNavBarWidth,且組件寬度 - minContentWidth - 分割線寬度(1vp)小于minNavBarWidth時(shí),navBarWidth修正為minNavBarWidth; navBarWidth > maxNavBarWidth,且組件寬度 - minContentWidth - 分割線寬度(1vp)在navBarWidthRange范圍內(nèi),navBarWidth修正為組件寬度 - 分割線寬度(1vp) - minContentWidth。 2.當(dāng)navBarWidth屬性的值,在navBarWidthRange屬性的值范圍以內(nèi)時(shí),navBarWidth按如下規(guī)則顯示: minNavBarWidth + minContentWidth + 分割線寬度(1vp) >= 組件寬度時(shí),navBarWidth修正為minNavBarWidth; minNavBarWidth + minContentWidth + 分割線寬度(1vp) < 組件寬度,且navBarWidth + minContentWidth + 分割線寬度(1vp) >= 組件寬度時(shí),navBarWidth修正為組件寬度 - 分割線寬度(1vp) - minContentWidth; minNavBarWidth + minContentWidth + 分割線寬度(1vp) < 組件寬度,且navBarWidth + minContentWidth + 分割線寬度(1vp) < 組件寬度時(shí),navBarWidth為設(shè)置的值。 3.縮小組件尺寸時(shí),先縮小內(nèi)容區(qū)的尺寸至minContentWidth,然后再縮小導(dǎo)航欄的尺寸至minNavBarWidth。若繼續(xù)縮小,先縮小內(nèi)容區(qū),內(nèi)容區(qū)消失后再縮小導(dǎo)航欄。 4.設(shè)置導(dǎo)航欄為固定尺寸時(shí),若持續(xù)縮小組件尺寸,導(dǎo)航欄最后壓縮顯示。 5.若只設(shè)置了navBarWidth屬性,則導(dǎo)航欄寬度為navBarWidth,且分割線不可拖動(dòng)。 |
Auto | API version 9之前:窗口寬度>=520vp時(shí),采用Split模式顯示;窗口寬度<520vp時(shí),采用Stack模式顯示。 API version 10及以上:窗口寬度>=600vp時(shí),采用Split模式顯示;窗口寬度<600vp時(shí),采用Stack模式顯示,600vp等于minNavBarWidth(240vp) + minContentWidth (360vp)。 |
TitleHeight枚舉說明
名稱 | 描述 |
---|---|
MainOnly | 只有主標(biāo)題時(shí)標(biāo)題欄的推薦高度(56vp)。 |
MainWithSub | 同時(shí)有主標(biāo)題和副標(biāo)題時(shí)標(biāo)題欄的推薦高度(82vp)。HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿 |
說明:
目前可滾動(dòng)組件只支持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頁面信息入棧,傳遞的數(shù)據(jù)為param
})
Button('popToname', { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() = > {
this.pageInfos.popToName('pageTwo') //回退路由棧到第一個(gè)名為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') // 將第一個(gè)名為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頁面的參數(shù)信息', JSON.stringify(this.pageInfos.getParamByIndex(1)))
console.log('獲取全部名為name的NavDestination頁面的參數(shù)信息', 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
})
}
審核編輯 黃宇
-
組件
+關(guān)注
關(guān)注
1文章
512瀏覽量
17816 -
鴻蒙
+關(guān)注
關(guān)注
57文章
2345瀏覽量
42822
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論