十五、【鸿蒙 NEXT】Navigation与router与Tabs组件

前言:

从Navigation组件定义来看,该组件给我们提供了两个能力,一个是路由能力,能跳转到其他子页面。另一个是给我们提供了一个页面模板,比如顶部菜单选择,底部有工具栏,页面展示如下。路由导航方面,鸿蒙又提供了一个单独的组件router组件,也能跳转页面。另外鸿蒙还提供了一个Tabs组件,底部也有工具栏,那么如果作为首页,需要通过切换工具栏,来切换不同页面该如何选择呢。

                            

      Navigation组件                                                              Tabs组件

一、路由能力我们选择 Navigation还是router

按照官方推荐,最好使用 Navigation,主要有几个优点,一个是 Navigation组件能自动适应屏幕大小,当屏幕大时,页面会自动双页展示,左边展示首页,右边展示子页面。而安卓中还需要自己适配代码,比如说上面图中,我点击首页的"Page1",会跳转到一个子页面,如果是宽屏场景,该子页面就会展示在右侧。另外一个优点就是 Navigation更加灵活的进行栈的操作,提供了一系列的栈的操作接口,比如增删改查页面,拦截路由等等,满足用户更多的场景需求。并且router后续也不会再继续演进,只会保留当前能力。

二、作为首页我们使用 Navigation还是Tabs

我们首页通常下方会有导航,从 Navigation和Tabs组件的定义来看,者两个组件都有类似的展示形式,那我们该如何选择呢。我们对比下两种页面切换的效果,首先我们点击 Navigation组件的工具栏切换页面,它其实是做了一个页面跳转,子页面会入路由栈,跳转后,底部工具栏就被子页面覆盖了。而Tabs组件它是在同一个页面做了内容切换,本质还是同一个页面,切换后底部工具栏在。一般我们都选择Tabs组件来实现首页的导航。

                                                             Navigation工具栏跳转  

 

                                                           Tabs组件导航

                                                       

   

  

### 鸿蒙 OS NavigationRouter 的区别及用法对比 #### 一、架构差异 在鸿蒙操作系统中,`Router`和`Navigation`均用于页面间的导航操作,但两者基于不同的架构设计。对于`Router`而言,其构建于较为传统的路由机制之上,在页面切换过程中主要依赖URL路径映射来决定目标页面及其参数配置[^1]。 而`Navigation`则采用了更为现代化的设计理念,它不仅支持基本的页面跳转功能,还集成了更多高级特性,如返回栈管理、全局事件监听等,使得开发者能够更加灵活地控制应用内的导航流程。 #### 二、数据传递方式 当涉及到页面间的数据传输时,`Router`通常采用查询字符串或POST请求体的形式携带少量简单类型的变量;相比之下,`Navigation`提供了更丰富的API接口,允许直接以对象形式传递复杂结构化的数据,并且可以通过回调函数轻松获取上一页传来的信息[^2]。 ```javascript // 使用Router进行简单的数据传递示例 this.$router.push({ path: '/targetPage', query: { id: '123' } }); // 使用Navigation传递复杂数据结构的例子 await this.$navigation.navigateTo({ uri: "pages/targetPage", params: { user: { name: "Alice", age: 25 }, callback: (result) => console.log(result) } }); ``` #### 三、自定义转场效果 关于页面过渡动画方面,`Router`可通过调用内置的方法`pageTransition()`来自定义页面转换过程中的视觉表现形式[^3]。然而,`Navigation`在这方面展现出了更大的优势——除了提供类似的钩子函数外,还可以利用声明式的编程风格定义复杂的场景变换逻辑,甚至集成第三方动画库实现炫酷的效果。 ```typescript // Router 自定义转场动画 this.$router.pageTransition('slide-left'); // Navigation 声明式设置转场属性 <template> <div :transition="customAnimation"> <!-- 页面内容 --> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; const customAnimation = ref({ enterClass: 'animate__animated animate__fadeIn', leaveClass: 'animate__animated animate__fadeOut' }) </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值