Navigation的进阶知识与拦截器配置

news2025/3/10 5:39:57

Navigation的进阶知识与拦截器配置

  • 写的不是很详细,后续有时间会补充,建议参考官方文档食用

1.如何配置路由信息

1.1 创建工程结构

src/main/ets
├── pages
│   └── navigation
│       ├── views
│       │   ├── Mine.ets      // 个人中心页
│       │   ├── Login.ets     // 登录页
│       │   └── ErrorPage.ets // 错误页
│       └── NavagationIndex.ets // 导航入口
├── routerMap.json5           // 路由配置文件

1.2 核心路由配置解析(routerMap.json5)

{
  "routerMap": [
    {
      "name": "mine",       // 路由唯一标识符
      "buildFunction": "MineBuilder",   
      "pageSourceFile": "src/main/.../Mine.ets" 
    },
    // ...其他路由项
  ]
}

关键字段含义

关键字段说明
name路由标识符,用于编程式导航
buildFunction页面构建器函数名(关联组件注册)
pageSourceFile源代码文件位置(动态加载基础)

1.3 案例演示

1.创建首页面
@Entry
@Component
struct TextPage {
  @Provide
  navPathStack:NavPathStack = new NavPathStack()
  build() {
  Navigation(this.navPathStack){
    Text('这是首页')
      Button('跳到下一页去')
      .onClick(()=>{
        this.navPathStack.pushPath({name:'nextOne'})
      })
  }
  }
}
2.创建子页面(跳转页面)
@Builder
function PageOne() {
  TextPage_()
}

@Component
struct TextPage_ {
  @Consume
  navPathStack: NavPathStack

  build() {
    NavDestination() {
      Text('这是我从首页面跳过来的第一个页面')
      Image($r('app.media.Cover'))
        .width(100)
        .aspectRatio(1)
      Button('跳到第三个页面去')
        .onClick(() => {
          this.navPathStack.pushPath({ name: 'pageTwo' })
        })
    }
  }
}

@Builder
function PageTwo() {
  TextPage2_()
}

@Component
struct TextPage2_ {
  build() {
    NavDestination() {
      Text('这是我从首页面跳过来的第二个页面')
      Image($r('app.media.Cover2'))
        .width(100)
        .aspectRatio(1)
    }

  }
}

3.配置json.map映射路径
   {
      "name": "nextOne",
      "buildFunction": "PageOne",
      "pageSourceFile": "src/main/ets/pages/TextPage_.ets"
    },
    {
      "name": "pageTwo",
      "buildFunction": "PageTwo",
      "pageSourceFile": "src/main/ets/pages/TextPage_.ets"
    }
4.效果展示

img

2.导航入口组件实现(NavagationIndex.ets)

1.组件结构

@Entry
@Component
struct NavagationIndex {
  @Provide navPathStack: NavPathStack = new NavPathStack()
  
  build() {
    Navigation(this.navPathStack) {
      // 初始页面内容
      Button('跳转至-我的').onClick(() => {
        this.navPathStack.pushPath({name: 'mine'})
      })
    }
    .mode(NavigationMode.Auto) // 跨设备适配
  }
}

2.导航模式说明

模式适用场景
NavigationMode.Stack单页面栈模式(移动端)
NavigationMode.Split分栏模式(平板/PC)
NavigationMode.Auto自动适配设备

3.拦截器配置

1.拦截器注册时机
.onAppear(() => {
  this.registerInterceptors()
})
2. 拦截逻辑流程图解

image-20250309205538032

3. 关键拦截逻辑代码

const token = AppStorage.get('token')! as string || '';
if (t.pathInfo?.name === 'mine' && token === '') {
  // 拦截动作分解
  t.pathStack.pop();          // 移除无效跳转
  t.pathStack.pushPath({      // 重定向到登录页
    name: "login"
  });
}
4.错误处理机制
if (!t.pathInfo && f.pathInfo.name !== 'error') {
  f.pathStack.pushPath({name: 'error'}) // 注入错误页
  return;
}
5.代码示例
import { promptAction } from '@kit.ArkUI'

@Entry
@Component
struct NavagationIndex {
  @Provide
  navPathStack: NavPathStack = new NavPathStack()

  registerInterceptors() {
    this.navPathStack.setInterception({
      //f从哪来,t到哪去
      willShow: (f, t) => {
        if (typeof t === 'string'||typeof f ==='string') {
          return
        }
        //f可能是首页跳过来的
        //必须加个逻辑与
        // if(!t.pathInfo && f.pathInfo.name !='error'){
        //   f.pathStack.pushPath({name:'error'})
        //   return
        //   //返回不好返回
        // }

        if (t.pathInfo.name === 'mine') {
          promptAction.showToast({
            message: '拦截到我要去mine'
          })
          //拦截你 不让你跳
          // t.pathStack.pop()
          const token = AppStorage.get('token')! as string || ''
          //拦截!!!
          if (token === '') {
            t.pathStack.pop()
            //去登录
            t.pathStack.pushPath({
              name: "login"
            })
          }
          return
        }

      },
      //t 跳转之后的拦截
      didShow: () => {

      }
    })
  }
  build() {
    Navigation(this.navPathStack) {
      //还没有进行跳转,但是已经有展示的内容了
      Text('这是我的首页')
      Button('跳转至-我的')
        .onClick(() => {
          this.navPathStack.pushPath({
            name: 'mine'
          })
        })
    }
    .onAppear(() => {
      this.registerInterceptors()
    })
    .height('100%')
    .width('100%')
    //跨设备
    .mode(NavigationMode.Auto)
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java数据结构第二十一期:解构排序算法的艺术与科学(三)

专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、常见排序算法的实现 1.1. 归并排序 二、排序算法复杂度及稳定性分析 一、常见排序算法的实现 1.1. 归并排序 归并排序是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法的一个⾮常典型的…

go切片定义和初始化

1.简介 切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制。切片的使用和数组类似,遍历切片、访问切片的元素和切片的长度都一样。。切片的长度是可以变化的,因此切片是一个可以动态变化的数…

【NLP 39、激活函数 ⑤ Swish激活函数】

我的孤独原本是座荒岛,直到你称成潮汐,原来爱是让个体失序的永恒运动 ——25.2.25 Swish激活函数是一种近年来在深度学习中广泛应用的激活函数,由Google Brain团队在2017年提出。其核心设计结合了Sigmoid门控机制和线性输入的乘积&#xff0c…

南开提出1Prompt1Story,无需训练,可通过单个连接提示实现一致的文本到图像生成。

(1Prompt1Story)是一种无训练的文本到图像生成方法,通过整合多个提示为一个长句子,并结合奇异值重加权(SVR)和身份保持交叉注意力(IPCA)技术,解决了生成图像中身份不一致…

STM32驱动OLED屏幕全解析:从原理到温度显示实战(上) | 零基础入门STM32第五十三步

主题内容教学目的/扩展视频OLED显示屏重点课程电路原理,手册分析,驱动程序。初始化,清屏,ASCII字库,显示分区。调用显示函数。做带有加入图形和汉字显示的RTC时钟界面。讲字库的设计原理。 师从洋桃电子,杜…

MySQL语法总结

本篇博客说明: !!!.注意此系列都用的是MySQL语句,和SQLServer,PostgreSQL有些细节上的差别!!! 1.每个操作都是先展示出语法格式 2.然后是具体例子 3.本篇注脚与文本顺讯息…

从预测到控制:电力RK3568边缘计算机在电网调度中的全面应用

在智能电网的快速发展中,电力Ubuntu工控机(简称“电力工控机”)作为核心设备,扮演着不可或缺的角色。特别是在智能电网调度场景中,电力工控机的高效、稳定和智能化特性,为电网的稳定运行和高效管理提供了强…

day-106 统计放置房子的方式数

思路 动态规划:因为中间有街道隔开,所以只需计算一边街道的排列方式,最后计算平方即可 解题过程 动态转换方程:f[i]f[i-1]f[i-2] Code class Solution {int num 1000000007;public int countHousePlacements(int n) {int arr[…

PostgreSQL安装和mcp PostgreSQL

文章目录 一. 安装之后修改权限并登录1. 确保当前用户具有sudo权限2. 修改/etc/postgresql/<版本号>/main/pg_hba.conf配置文件为trust&#xff0c;可以免密登录3. 进行免密登录4. 添加root用户和修改postgres用户密码1. postgres用户密码2. 添加root用户3. 为root用户设…

LPZero: Language Model Zero-cost Proxy Search from Zero(未更新完预览版本)

LPZero代码 摘要 神经架构搜索 (NAS) 有助于自动执行有效的神经网络搜索&#xff0c;同时需要大量的计算资源&#xff0c;尤其是对于语言模型。零样本 NAS 利用零成本 (ZC) 代理来估计模型性能&#xff0c;从而显着降低计算需求。然而&#xff0c;现有的 ZC 代理严重依赖于深…

字典树运用

字典树运用 字典树LC208 创建字典树0-1字典树 字典树 字典树又叫 前缀树&#xff0c; 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补全和拼写检查。 LC208 创建字典树 这是一个字符串字典树…

RReadWriteLock读写锁应用场景

背景 操作涉及一批数据&#xff0c;如订单&#xff0c;可能存在多个场景下操作&#xff0c;先使用读锁&#xff0c;从redis缓存中获取操作中数据 比如 关闭账单&#xff0c; 发起调账&#xff0c; 线下结算&#xff0c; 合并支付 先判断当前操作的数据&#xff0c;是否在…

0087.springboot325基于Java的企业OA管理系统的设计与实现+论文

一、系统说明 基于springbootvue的企业OA管理系统,系统功能齐全, 代码简洁易懂&#xff0c;适合小白学编程。 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数…

Spring Boot 3 整合 MinIO 实现分布式文件存储

引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心&#xff0c;而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…

Redis|集群 Cluster

文章目录 是什么能干嘛集群算法-分片-槽位slotredis集群的槽位slotredis集群的分片分片槽位的优势slot槽位映射——业界的3种解决方案小厂&#xff1a;哈希取余分区中厂&#xff1a;一致性哈希算法分区大厂&#xff1a;哈希槽分区 面试题&#xff1a;为什么 Redis 集群的最大槽…

【定制开发】碰一碰发视频系统定制开发,支持OEM

在短视频营销爆发的2025年&#xff0c;"碰一碰发视频"技术已成为实体商家引流标配。某连锁餐饮品牌通过定制化开发&#xff0c;单月视频发布量突破10万条&#xff0c;获客成本降低80%&#xff01;本文将深入解析该系统的技术架构与开发要点&#xff0c;助你快速搭建高…

Linux上位机开发(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 传统的上位机开发&#xff0c;一般都是默认pc软件开发。既然是pc软件&#xff0c;一般来说都是基于windows平台开发。开放的框架&#xff0c;无非是…

算法005——有效三角形个数

力扣——有效三角形个数点击链接跳转 判断三条边是否能组成三角形&#xff0c;大家第一时间想到的就是两边之和大于第三边 但是运用这个方法&#xff0c;我们需要判断三次&#xff0c;有一个更简单的方法&#xff0c;只需要判断一次 因为 C 已经是三边之中最大的了&#xff…

【STM32】江科大STM32学习笔记汇总(已完结)

00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 打赏04. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【ST…

【Python编程】高性能Python Web服务部署架构解析

一、FastAPI 与 Uvicorn/Gunicorn 的协同 1. 开发环境&#xff1a;Uvicorn 直接驱动 作用&#xff1a;Uvicorn 作为 ASGI 服务器&#xff0c;原生支持 FastAPI 的异步特性&#xff0c;提供热重载&#xff08;--reload&#xff09;和高效异步请求处理。 启动命令&#xff1a; u…