# Developing a Simple Universal Header Navigation Bar in HarmonyOS Next
In daily page development, most pages require a header to display navigation controls and page information. Repeating this code for every page is inefficient and leads to inconsistent implementations. This guide demonstrates how to create a reusable header component.
## Step 1: Create the NavBar Component
Create a new ArkTS file with a `@Component` decorated custom component:
``` import Utils from "../../../common/utils/Utils";
@Component export struct NavBar { // Component implementation will go here } ```
## Step 2: Implement Component Properties and UI
Add properties and build the header UI:
``` import Utils from "../../../common/utils/Utils";
@Component export struct NavBar { @Prop title: string = ''; // Header title text @Prop backImg: string = ''; // Custom back button icon path @Prop bgColor: string = '#FFFFFF';// Header background color @Prop customBack?: () => void; // Custom back button handler @Prop mode: string = 'center'; // Title alignment: 'center' or 'left'
build() { Row() { // Back button section Row() { Image(this.backImg || Utils.getImgPath('home/adult_page_back_black.png')) .width(Utils.getVp(48)) .height(Utils.getVp(48)) .objectFit(ImageFit.Cover) } .onClick(() => { // Use custom handler if provided, else default back navigation this.customBack ? this.customBack() : router.back(); }) // Title section Row() { Text(this.title) .fontColor('#191B27') .fontSize(Utils.getVp(33)) .fontWeight(FontWeight.Bold) .textAlign(this.mode === 'center' ? TextAlign.Center : TextAlign.Start) .width('100%') } .margin({ left: this.mode === 'center' ? 0 : Utils.getVp(20) }) .flexShrink(1) // Allow shrinking to fit content .height('100%') } .width('100%') .padding({ left: Utils.getVp(32), right: Utils.getVp(32) }) .height(Utils.getVp(88)) .backgroundColor(this.bgColor) }} ```
## Step 3: Using the Component in Parent Views
### Center-aligned Title Example:
``` import { NavBar } from './component/NavBar';
@Entry @Component struct ParentPage { build() { Column() { NavBar({ title: 'Page Title', mode: 'center' }) // Page content here } .width('100%') .height('100%') } } ```
### Left-aligned Title Example:
``` import { NavBar } from './component/NavBar';
@Entry @Component struct ParentPage { build() { Column() { NavBar({ title: 'Page Title', mode: 'left' }) // Page content here } .width('100%') .height('100%') } } ```
## Customization Options
1. *Custom Icons*: Pass `backImg` property with image path
``` NavBar({ title: 'Settings', backImg: Utils.getImgPath('icons/custom_back.png') }) ```2. *Custom Background*: Change header color
``` NavBar({ title: 'Profile', bgColor: '#F5F5F5' }) ```3. *Custom Back Action*: Override default navigation
``` NavBar({ title: 'Checkout', customBack: () => { /* Custom logic */ } }) ```## Key Features
- *Responsive Design*: Adapts to different screen sizes using `Utils.getVp()` - *Flexible Layout*: Title alignment options (center/left) - *Customizable*: Supports custom icons, colors, and behaviors - *Consistent UI*: Ensures uniform header appearance across application - *Easy Integration*: Simple props-based configuration
This implementation provides a reusable, customizable header component that eliminates code duplication and ensures consistent navigation experiences throughout your HarmonyOS Next application.
.png)


![Educating the Next Generation of Open Source Project Contributors [video]](https://www.youtube.com/img/desktop/supported_browsers/chrome.png)