博客 / 詳情

返回

鴻蒙路由傳參實戰:跨頁面數據傳遞的藝術

在鴻蒙應用開發中,路由傳參是實現頁面間通信的核心技術。路由合理設計傳參機制對複雜應用的十分重要。在鴻蒙學習過程中,有多種路由方式可以使用,下面是有關路由傳參的經驗分享:

一、router

核心技巧:

參數類型處理:支持string | number | boolean | object類型傳遞,對象需用JSON.stringify序列化

參數安全獲取:在目標頁面的onPageShow生命週期獲取參數,避免頁面未初始化時訪問

參數校驗:使用try-catch處理非法參數格式

URL管理:通過pages.json統一管理路由路徑,避免硬編碼

核心代碼示例(用户詳情頁跳轉):


// 用户列表頁 (傳遞參數)
import router from '@ohos.router';

@Entry
@Component
struct UserListPage {
  private user = { id: 1001, name: '張三', vip: true };

  build() {
    List() {
      ListItem() {
        Text(this.user.name)
          .onClick(() => {
            // 跳轉並傳遞複雜對象
            router.pushUrl({
              url: 'pages/UserDetailPage',
              params: { 
                userData: JSON.stringify(this.user),  // 對象序列化
                source: 'homePage' 
              }
            })
          })
      }
    }
  }
}

// 用户詳情頁 (接收參數)
@Component
export struct UserDetailPage {
  @State userId: number = 0;
  @State userName: string = '';
  @State isVip: boolean = false;

  onPageShow() {
    const params = router.getParams();  // 獲取路由參數
    try {
      if (params) {
        const user = JSON.parse(params['userData'] as string);  // 反序列化
        this.userId = user.id;
        this.userName = user.name;
        this.isVip = user.vip;
        console.log(`來源頁面: ${params.source}`);
      }
    } catch (error) {
      console.error('參數解析錯誤', error);
    }
  }

  build() {
    Column() {
      Text(`ID: ${this.userId}`).fontSize(18)
      Text(`姓名: ${this.userName}`).fontColor(this.isVip ? Color.Red : Color.Black)
      // ...
    }
  }
}

避坑指南:


大數據傳遞:超過1MB數據建議使用公共狀態管理(如AppStorage)替代路由傳參

敏感信息:切勿通過URL傳遞密碼等敏感數據

頁面回傳:使用router.back()返回時可攜帶結果參數:
    router.back({ 
  url: 'pages/UserListPage',
  params: { updated: true }
})

動態路由:支持路徑參數pages/UserDetailPage/:id,通過router.getParams()['id']獲取

二、HMRouter

  HMRouter是HarmonyOS上頁面跳轉的場景解決方案,主要解決應用內原生頁面間相互跳轉的問題。本文主要以實際開發中的各項場景為例,介紹HMRouter路由框架的使用。HMRouter路由框架提供了下列功能特性:

使用自定義註解實現路由跳轉。
支持HAR/HSP。
支持路由攔截、路由生命週期。
簡化自定義動畫配置:配置全局動畫,單獨指定某個頁面的切換動畫。
支持不同的頁面類型:單例頁面、Dialog頁面。
該框架底層對Navigation相關能力進行了封裝,幫助開發者減少對Navigation相關細節內容的關注、提高開發效率,同時該框架對頁面跳轉能力進行了增強,例如其中的路由攔截、單例頁面等。
頁面跳轉:

HMRouter提供了基於自定義註解的頁面跳轉與返回功能,使用步驟如下:

頁面跳轉

1.配置頁面路由

@HMRouter({ pageUrl: 'profile/Address' })
@Entry
@Component
export struct Address {
...
}

2.頁面跳轉

onClick(()=>{
...
 HMRouterMgr.push({pageUrl:'profile/Address',animator:true})
})

頁面傳參

傳遞參數

.onClick(() => {
          HMRouterMgr.push({pageUrl:'goods/Detail',param:item})
          
          // -----
        })

接收參數

@HMRouter({pageUrl:'goods/Detail'})
@ComponentV2
export struct GoodsDetail {
  @Local item:HMPageParam=HMRouterMgr.getCurrentParam(HMParamType.all) as HMPageParam
  @Provider() goods:GoodsItemType=this.item.data as GoodsItemType
...
}

適用場景建議


簡單應用:直接使用 HMRouter 的註解+攔截器,快速實現解耦跳轉。

大型項目:採用 TheRouter,通過 動態路由表 和 服務注入(ServiceProvider)解決模塊化協同問題84。

通過合理使用 HMRouter,可減少 30%+ 的路由膠水代碼,尤其適合跨團隊協作的鴻蒙應用項目。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.