HarmonyOS NEXT 应用开发实战(六、组件导航Navigation使用详解)

在鸿蒙应用开发中,Navigation 组件是实现界面间导航的重要工具。本文将介绍如何使用 Navigation 组件实现页面跳转及参数传递,确保你能轻松构建具有良好用户体验的应用。

当前HarmonyOS支持两套路由机制(Navigation和Router),Navigation作为后续长期演进及推荐的路由选择方案,其与Router比较有不少优势。建议后续直接使用Navigation作为内部的路由方案。

Navigation介绍

Navigation组件通常作为页面的根容器,支持单页面、分栏和自适应三种显示模式。开发者可以使用Navigation组件提供的属性来设置页面的标题栏、工具栏、导航栏等。

Navigation和Router能力对标

Router路由的页面是一个@Entry修饰的Component,每一个页面都需要在main_page.json中声明。而基于Navigation的路由页面分为导航页和子页,导航页又叫Navbar,是Navigation包含的子组件,子页是NavDestination包含的子组件。

业务场景NavigationRouter
一多能力支持,Auto模式自适应单栏跟双栏显示不支持
跳转指定页面pushPath & pushDestinationpushUrl & pushNameRoute
跳转HSP中页面支持支持
跳转HAR中页面支持支持
跳转传参支持支持
获取指定页面参数支持不支持
传参类型传参为对象形式传参为对象形式,对象中暂不支持方法变量
跳转结果回调支持支持
跳转单例页面不支持支持
页面返回支持支持
页面返回传参支持支持
返回指定路由支持支持
页面返回弹窗支持,通过路由拦截实现showAlertBeforeBackPage
路由替换replacePath & replacePathByNamereplaceUrl & replaceNameRoute
路由栈清理clearclear
清理指定路由removeByIndexes & removeByName不支持
转场动画支持支持
自定义转场动画支持支持,动画类型受限
屏蔽转场动画支持全局和单次支持 设置pageTransition方法duration为0
geometryTransition共享元素动画支持(NavDestination之间共享)不支持
页面生命周期监听UIObserver.on('navDestinationUpdate')UIObserver.on('routerPageUpdate')
获取页面栈对象支持不支持
路由拦截支持通过setInercption做路由拦截不支持
路由栈信息查询支持getState() & getLength()
路由栈move操作moveToTop & moveIndexToTop不支持
沉浸式页面支持不支持,需通过window配置
设置页面标题栏(titlebar)和工具栏(toolbar)支持不支持
模态嵌套路由支持不支持

Navigation简单示例

主页面(首页面)示例:

 
@Entry
@Component
struct NavigationExample {build() {Column() {Navigation() {// 中间主区域}.title("主标题") // 页面标题.mode(NavigationMode.Auto) // 显示模式:Auto(自适应)、Stack(单页显示)、Split(分栏显示)、Full(强调型标题栏)、Mini(普通型标题栏).menus([// 顶部菜单栏]).toolBar({items: [// 底部工具栏]})}.height('100%').width('100%').backgroundColor('#F1F3F5')}
}
// index.ets
@Entry
@Component
struct Index {pathStack: NavPathStack = new NavPathStack()build() {Navigation(this.pathStack) {Column() {Button('Push PageOne', { stateEffect: true, type: ButtonType.Capsule }).width('80%').height(40).margin(20).onClick(() => {this.pathStack.pushPathByName('pageOne', null)})}.width('100%').height('100%')}.title("Navigation")}
}

 子页示例:

// PageOne.ets@Builder
export function PageOneBuilder() {PageOne()
}@Component
export struct PageOne {pathStack: NavPathStack = new NavPathStack()build() {NavDestination() {Column() {Button('回到首页', { stateEffect: true, type: ButtonType.Capsule }).width('80%').height(40).margin(20).onClick(() => {this.pathStack.clear()})}.width('100%').height('100%')}.title('PageOne').onReady((context: NavDestinationContext) => {this.pathStack = context.pathStack})}
}

注意:每个子页也需要配置到系统配置文件route_map.json中(参考 系统路由配置 ):

// 工程配置文件module.json5中配置 {"routerMap": "$profile:route_map"}
// route_map.json
{"routerMap": [{"name": "pageOne","pageSourceFile": "src/main/ets/pages/PageOne.ets","buildFunction": "PageOneBuilder","data": {"description": "this is pageOne"}}]
}

NavRouter介绍

NavRouter是Navigation组件中的特殊子组件,通常用于与Navigation组件配合使用,它默认提供了点击响应处理,不需要开发者自定义点击事件逻辑。NavRouter组件只有两个子组件,其中第二个子组件必须是NavDestination。而NavDestination则是Navigation组件中的特殊子组件,用于显示内容页的内容。当开发者点击NavRouter组件时,会跳转到对应的NavDestination内容区。

  Navigation() {TextInput({ placeholder: '请输入...' }).width('90%').height(40).backgroundColor('#ffffff')List({ space: 12 }) {ForEach(this.arr, item => {ListItem() {NavRouter() {Text("NavRouter" + item).width('100%').height(72).backgroundColor(Color.White).borderRadius(36).fontSize(16).fontWeight(500).textAlign(TextAlign.Center)NavDestination() {Text(`NavDestinationContent${item}`)}.title(`NavDestinationTitle${item}`)}}})}}.title('主标题').mode(NavigationMode.Stack)//导航模式.titleMode(NavigationTitleMode.Mini)//标题模式.menus([  //设置菜单{ value: "", icon: './../../../resources/base/media/icon.png', action: () => {} },{ value: "", icon: './../../../resources/base/media/icon.png', action: () => {} }]).toolBar({ items: [  //设置工具栏{ value: 'func', icon: './../../../resources/base/media/icon.png', action: () => {} },{ value: 'func', icon: './../../../resources/base/media/icon.png', action: () => {} }] })

在鸿蒙开发中,NavRouter 和直接使用 this.pageStack.pushDestinationByName 来实现页面跳转的确可以达到相似的效果,但它们在设计理念和使用场景上有一些区别。以下是这两者之间的一些关键点和它们各自的用途:

1. NavRouter 的用途

  • 封装与简化NavRouter 是一个封装了导航逻辑的组件,专注于处理页面间的跳转和路由管理。它提供了一个更简洁的接口以实现页面跳转,可以让开发者更容易进行组件化开发,从而提高代码的可读性和可维护性。

  • 动态路由:在 NavRouter 中,可以方便地将导航逻辑和目标页面的内容结合在一起。通过 NavRouter,不必手动管理目标页面的具体情况,可以直接利用组件的声明式来定义导航内容。

2. this.pageStack.pushDestinationByName

  • 底层控制:使用 this.pageStack.pushDestinationByName 更接近底层的 API,适合需要更细粒度控制的情况。它通常适用于需要直接处理路由堆栈的场合。

  • 灵活性:虽然提供了更多的灵活性,但相应的也要求开发者自行管理跳转的状态、参数传递等,代码可能相对繁琐,尤其是在处理复杂的导航场景时。

3. 何时使用 NavRouter

  • 如果你的应用需要在多个组件之间频繁进行导航,并且希望维护清晰的结构和可读性,使用 NavRouter 是一个不错的选择。

  • 对于简单的情况,如果你的跳转逻辑不复杂,且需要直接控制页面堆栈的行为,使用 this.pageStack.pushDestinationByName 也完全可以。

总结而言,虽然两者都可以实现页面跳转,但 NavRouter 提供了更高层次的抽象,更适合构建组件化的、可维护的导航结构,而 this.pageStack.pushDestinationByName 更适合需要底层控制的场景。选择使用哪一种方式,主要依赖于具体的开发需求和代码结构设计。简言之,NavRouter 有点儿类似于折叠效果,所有内容已经拿到了,不需要再跳转到其他页面去请求,只需展开显示即可。则使用NavRouter 可以完成在一个页面里实现想要的效果。

Navigation使用步骤

一、基本使用

将Navigation 组件作为基础页面的根容器,它能够管理整个页面的布局和导航。定义NavPathStack 实例,后面需要用它实现路由跳转和传参。Navigation通过页面栈对象 NavPathStack 提供的方法来操作页面,需要创建一个栈对象并传入Navigation中。

以下是一个基本的 Navigation 组件结构示例:

import { getZhiHuNews } from '../../common/api/zhihu';
import { BaseResponse,ErrorResp } from '../../common/bean/ApiTypes';
import { Log } from '../../utils/logutil'@Component
export default struct ZhiHu{@State message: string = 'Hello World';private arr: number[] = [1, 2, 3];//重要,定义NavPathStack 实例,后面需要用它实现路由跳转和传参pageStack: NavPathStack = new NavPathStack()// 组件生命周期aboutToAppear() {Log.info('ZhiHu aboutToAppear');getZhiHuNews("20241017").then((res) => {Log.debug(res.data.message)Log.debug("request","res.data.code:%{public}d",res.data.code)}).catch((err:BaseResponse<ErrorResp>) => {Log.debug("request","err.data.code:%d",err.data.code)Log.debug("request",err.data.message)});let list: number[] = []for (let i = 1; i <= 10; i++) {list.push(i);}}// 组件生命周期aboutToDisappear() {Log.info('ZhiHu aboutToDisappear');}build() {Navigation(this.pageStack){Row() {Column({ space: 0 }) {// 标题栏Text("日报").size({ width: '100%', height: 50 }).backgroundColor("#28bff1").fontColor("#ffffff").textAlign(TextAlign.Center).fontSize("18fp")// 内容项Swiper(this.swiperController) {LazyForEach(this.data, (item: string) => {Stack({ alignContent: Alignment.Center }) {Text(item.toString()).width('100%').height(160).backgroundColor(0xAFEEEE).textAlign(TextAlign.Center).fontSize(30).zIndex(1).onClick(() => {//this.pageStack.pushPathByName("PageOne", item)this.pageStack.pushDestinationByName("PageOne", { id:"9773231" }).catch((e:Error)=>{// 跳转失败,会返回错误码及错误信息console.log(`catch exception: ${JSON.stringify(e)}`)}).then(()=>{// 跳转成功});})// 显示轮播图标题Text("特立独行的猫哥").padding(5).margin({ top:60 }).width('100%').height(50).textAlign(TextAlign.Center).maxLines(2).textOverflow({overflow:TextOverflow.Clip}).fontSize(20).fontColor(Color.White).opacity(100) // 设置标题的透明度 不透明度设为100%,表示完全不透明.backgroundColor('#808080AA') // 背景颜色设为透明.zIndex(2)}}, (item: string) => item)}.cachedCount(2).index(1).autoPlay(true).interval(4000).loop(true).indicatorInteractive(true).duration(1000).itemSpace(0).curve(Curve.Linear).onChange((index: number) => {console.info(index.toString())}).onGestureSwipe((index: number, extraInfo: SwiperAnimationEvent) => {console.info("index: " + index)console.info("current offset: " + extraInfo.currentOffset)}).height(160) // 设置高度List({ space: 12 }) {ForEach(this.arr, (item:string) => {ListItem() {NavRouter() {Text("NavRouter" + item).width("100%").height(72).backgroundColor('#FFFFFF').borderRadius(24).fontSize(16).fontWeight(500).textAlign(TextAlign.Center)NavDestination() {Text("NavDestinationContent" + item)}.title("NavDestinationTitle" + item)}}}, (item:string) => item)}}.size({ width: '100%', height: '100%' })}}.mode(NavigationMode.Stack).width('100%').height('100%')}
}

注意:主页面使用  Navigation 组件作为根容器。而待跳转的子页面(目标页面),则是使用NavDestination作为根容器。

二、配置系统路由表

在进行页面跳转之前,需要在目录src/main/resources/base/profile中,创建文件route_map.json,手动注册跳转的页面。内容示例:

{"routerMap": [{"name": "PageOne","pageSourceFile": "src/main/ets/pages/zhihu/detail/Detail.ets","buildFunction": "DetailPageBuilder","data": {"description": "this is Page Detail"}}]
}

上面这个配置其实是系统路由表,从API version 12版本开始,Navigation支持系统跨模块的路由表方案,整体设计是将路由表方案下沉到系统中管理,即在需要路由的各个业务模块(HSP/HAR)中独立配置router_map.json文件,在触发路由跳转时,应用只需要通过NavPactStack进行路由跳转,此时系统会自动完成路由模块的动态加载、组件构建,并完成路由跳转功能,从而实现了开发层面的模块解耦。 

在这个示例中,name 定义了路由名称,pageSourceFile 指向页面的具体实现文件,buildFunction 则指定了构建函数。开发者需确保这些字段的正确性和一致性,以便系统能正确识别和加载目标页面。

路由表的基本概念

在新的设计中,每个业务模块(HSP / HAR)都可以独立配置 router_map.json 文件。当应用触发路由跳转时,使用 NavPathStack 内置的接口,系统将自动处理模块的动态加载和组件构建,从而实现路由跳转功能。

鸿蒙的系统路由表方案为应用开发提供了更加灵活和高效的路由管理方式。通过将路由表下沉到模块层,系统支持模块的独立配置和动态加载,不仅实现了开发层面的模块解耦,也大大简化了开发流程。对于正在进行鸿蒙应用开发来说,掌握这一机制将显著提升开发效率和应用性能。

配置路由表注意事项
  1. 注册正确:确保 name 和 buildFunction 与要跳转的页面一致。
  2. 参数获取:在目标页面中,开发者可以使用 this.pageStack.getParamByName 方法获取传递的参数。
路由模块解耦的优势
  • 独立性:每个业务模块可独立管理自己的路由信息,减少各模块间的相互依赖,提高开发效率。
  • 动态加载:通过系统自动处理模块的加载和组件构建,提升了应用的性能和响应速度。
  • 代码可维护性:在日后的维护中,开发者只需关注自身模块的路由配置和实现,对于系统的整体架构影响较小。
路由跳转的实现

使用 NavPathStack 进行路由跳转时,只需调用相应的方法并传递参数,系统会自动执行动态装载和跳转。例如:

this.pageStack.pushDestinationByName("DetailPage", { id: "9773231" }).catch((error) => {console.error(`路由跳转失败: ${JSON.stringify(error)}`);}).then(() => {console.log("路由跳转成功");});

在上述代码中,调用 pushDestinationByName 方法完成页面跳转,同时也可以传递必要的参数。其他一些操作还有:

@Entry
@Component
struct Index {pathStack: NavPathStack = new NavPathStack()build() {// 设置NavPathStack并传入NavigationNavigation(this.pathStack) {...}.width('100%').height('100%')}.title("Navigation")
}// push page
this.pathStack.pushPath({ name: 'pageOne' })// pop page
this.pathStack.pop()
this.pathStack.popToIndex(1)
this.pathStack.popToName('pageOne')// replace page
this.pathStack.replacePath({ name: 'pageOne' })// clear all page
this.pathStack.clear()// 获取页面栈大小
let size = this.pathStack.size()// 删除栈中name为PageOne的所有页面
this.pathStack.removeByName("pageOne")// 删除指定索引的页面
this.pathStack.removeByIndexes([1,3,5])// 获取栈中所有页面name集合
this.pathStack.getAllPathName()// 获取索引为1的页面参数
this.pathStack.getParamByIndex(1)// 获取PageOne页面的参数
this.pathStack.getParamByName("pageOne")// 获取PageOne页面的索引集合
this.pathStack.getIndexByName("pageOne")
...

目标页面的实现

下面是目标页面 DetailPage 的一个简单示例:

import { Log } from '../../../utils/logutil';@Builder
export function DetailPageBuilder() {DetailPage()
}@Component
export default struct DetailPage {@State message: string = 'Hello World';pageStack: NavPathStack = new NavPathStack();private pathInfo: NavPathInfo | null = null;// 组件生命周期aboutToAppear() {Log.info('Detail aboutToAppear');}// 组件生命周期aboutToDisappear() {Log.info('Detail aboutToDisappear');}build() {NavDestination() {Column({ space: 0 }) {Text("内容").width('100%').height('100%').textAlign(TextAlign.Center).fontSize("25fp")}}.title("日报详情").width('100%').height('100%').onReady(ctx => {this.pageStack = ctx.pathStack;const params = this.pageStack.getParamByName("PageOne");Log.info('接收到的参数:', params);});}
}

组件生命周期与传递参数获取

在 DetailPage 的 onReady 方法中,开发者可以获取到传递的参数。这里使用 this.pageStack.getParamByName("PageOne") 获取指定页面的参数。这样可以灵活应对数据的传递和使用。

在导航页面中传递参数

使用 this.pageStack.pushDestinationByName 方法跳转到目标页面,并传递参数。例如:

this.pageStack.pushDestinationByName("TargetPage", { id: "12345", name: "示例数据" }).catch((error) => {console.error(`路由跳转失败: ${JSON.stringify(error)}`);});
import { Log } from '../../../utils/logutil';@Builder
export function TargetPageBuilder() {TargetPage();
}@Component
export default struct TargetPage {@State message: string = 'Hello from Target Page';pageStack: NavPathStack = new NavPathStack();private pathInfo: NavPathInfo | null = null;// 组件生命周期方法,页面即将出现aboutToAppear() {Log.info('TargetPage aboutToAppear');}// 组件生命周期方法,页面即将消失aboutToDisappear() {Log.info('TargetPage aboutToDisappear');}build() {NavDestination() {Column({ space: 0 }) {Text("内容").width('100%').height('100%').textAlign(TextAlign.Center).fontSize("25fp");}}.title("目标页面").width('100%').height('100%').onReady(ctx => {this.pageStack = ctx.pathStack; // 获取当前的路径栈const params = this.pageStack.getParamByName("TargetPage"); // 获取传递的参数Log.info('接收到的参数:', params);// 例如,如果传递的数据为 { id: "12345", name: "示例数据" }if (params) {const id = params.id; // 获取具体的参数值const name = params.name;Log.info(`获取到的 ID: ${id}, 名称: ${name}`);}});}
}

总结

通过使用 Navigation 组件及其相关接口,开发者可以方便地实现页面间的跳转和数据传递,从而构建丰富且流畅的用户界面。将页面逻辑与导航结构紧密结合,可以极大提升应用的可维护性和用户体验。希望本篇文章能帮助到您在鸿蒙应用开发中的导航实现。

写在最后

最后,推荐下笔者的业余开源app影视项目“爱影家”,推荐分享给与我一样喜欢免费观影的朋友。【注:该项目仅限于学习研究使用!请勿用于其他用途!】

开源地址:爱影家app开源项目介绍及源码

https://gitee.com/yyz116/imovie

💖技术交流

 ​​​​​​​

其他资源

文档中心--组件导航 (Navigation)(推荐)

HarmonyOS:NavPathStack的详细使用说明以及示例-CSDN博客

HarmonyOS Next开发学习手册——组件导航 (Navigation) (推荐)_鸿蒙 navigation-CSDN博客

「HarmonyNextOS」页面路由跳转Router更换为Navigation_鸿蒙 routermap-CSDN博客

CommonAppDevelopment/common/routermodule/README_AUTO_GENERATE.md · HarmonyOS-Cases/Cases - Gitee.com

SystemRouterMap: 本项目提供系统路由的验证,运用系统路由表的方式,跳转到模块(HSP/HAR)的页面,可以不用配置不同跳转模块间的依赖。

HarmonyOS ArkUI实战开发-页面导航(Navigation)_arkui navigation-CSDN博客

【鸿蒙实战开发】基于Navigation的路由管理_navigation组件关联的路由栈提供了入栈方法-CSDN博客 OpenHarmony三方库中心仓--HMRouter

https://juejin.cn/post/7372488623944630281

如何开发一个OpenHarmony购物app导航页面-鸿蒙开发者社区-51CTO.COM

鸿蒙HarmonyOS实战-ArkUI组件(Navigation)_harmonyos navigation-CSDN博客

【HarmonyOS NEXT 】应用开发:ArkTS导航组件一(Navigation)_arkts navigation-CSDN博客

https://zhuanlan.zhihu.com/p/1076639693

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

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

相关文章

字典学习算法

分为固定基字典和学习型字典 学习型字典 是指通过训练大量与目标数据相似的数据&#xff0c;学习其特征获得的字典。字典学习主要包括两个阶段&#xff0c;一个是字典构建阶段&#xff0c;一个是利用字典进行样本表示阶段。 首次提出&#xff1a;最优方向法&#xff08;Method …

Euporie 是一款功能强大、使用便捷的终端 Jupyter 交互工具,让Jupyter Notebook在终端下运行

在现代数据科学领域&#xff0c;Jupyter Notebook 已成为不可或缺的工具&#xff0c;它以其强大的交互性、可读性和可移植性而闻名。然而&#xff0c;在某些场景下&#xff0c;例如远程服务器、容器环境或仅仅个人偏好&#xff0c;使用终端进行操作更便捷。 Euporie 应运而生&a…

spring day 1021

ok了家人们&#xff0c;这周学习spring框架&#xff0c;我们一起去看看吧 Spring 一.Spring概述 1.1 Spring介绍 官网&#xff1a; https://spring.io/ 广义的 Spring &#xff1a; Spring 技术栈 &#xff08;全家桶&#xff09; 广义上的 Spring 泛指以 Spring Framework…

STM32L010F4 最小系统设计

画一个 STM32L010F4 的测试板子...... by 矜辰所致前言 最近需要用到一个新的 MCU&#xff1a; STM32L010F4 &#xff0c;上次测试的 VL53L0X 需要移植到这个芯片上&#xff0c;网上一搜 STM32L010F4&#xff0c;都是介绍资料&#xff0c;没有最小系统&#xff0c;使用说明等。…

在VMware上创建虚拟机以及安装Linux操作系统,使用ssh进行远程连接VMware安装注意点 (包含 v1,v8两张网卡如果没有的解决办法)

一&#xff0c;VMware上创建虚拟机 1.VMware下载 1&#xff09;点击VMware官网进入官网 网址:VMware by Broadcom - Cloud Computing for the EnterpriseOptimize cloud infrastructure with VMware for app platforms, private cloud, edge, networking, and security.https…

NAT工作原理详解:网络地址转换的关键角色

NAT工作原理详解&#xff1a;网络地址转换的关键角色 在现代计算机网络中&#xff0c;网络地址转换&#xff08;NAT&#xff09;扮演着至关重要的角色。它不仅仅是简单地将私有IP地址转换为公共IP地址&#xff0c;而是在多个方面保证了网络的正常运行和安全性。本文将详细讲解…

从网络请求到Excel:自动化数据抓取和保存的完整指南

背景介绍 在投资和财经领域&#xff0c;论坛一直是投资者们讨论和分享信息的重要平台&#xff0c;而东方财富股吧作为中国最大的财经论坛之一&#xff0c;聚集了大量投资者实时交流股票信息。对于投资者来说&#xff0c;自动化地采集这些发帖信息&#xff0c;并进行分析&#…

Maven私服架构

目录 1.maven私服介绍 1.1 私服介绍 1.2 Nexus介绍 2. maven私服实战 2.1 nexus安装 2.2 nexus仓库类型 2.3 将项目发布到私服 2.4 从私服下载jar包 2.5 将第三方jar包发布到私服 1.maven私服介绍 1.1 私服介绍 正式开发时&#xff0c;不同的项目组开发不同的工程。m…

《深度学习》 了解YOLO基本知识

目录 一、关于YOLO 1、什么是YOLO 2、经典的检测方法 1&#xff09;one-stage单阶段检测 模型指标介绍&#xff1a; 2&#xff09;two-stage多阶段检测 二、关于mAP指标 1、概念 2、IOU 3、关于召回率和准确率 4、示例 5、计算mAP 一、关于YOLO 1、什么是YOLO YOL…

一文2500字从0到1实现压测自动化!

大家好&#xff0c;我是小码哥&#xff0c;最近工作有点忙&#xff0c;一直在实现压测自动化的功能&#xff0c;今天来分享一下实现思路 我所在的业务线现在项目比较少了&#xff0c;所以最近一个月我都没有做业务测试&#xff0c;需求开发完后RD直接走免测就上线&#xff0c;…

手机ip切换成全局模式怎么弄

在当今数字化时代&#xff0c;智能手机已成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;都离不开它的陪伴。随着网络技术的不断发展&#xff0c;手机IP地址的切换技术也逐渐走进大众视野&#xff0c;中&#xff0c;“全局模式” 作为IP切…

windows环境下vscode编写c语言连接mysql

创建一个文件夹test02 在文件夹中创建test.c文件 用vscode打开test02文件夹 自动生成tasks.json和launch.json文件&#xff0c;需要安装这里通C/C Runner插件来自动生成json文件和一些文件夹。 接下来配置mysql 本地已经安装了mysql数据库&#xff0c;此安装过程省略。 有…

java如何部署web后端服务

java如何部署web后端服务 简单记录一下&#xff0c;方便后续使用。 部署流程 1.web打包 2.关掉需要升级的运行中的服务 /microservice/hedgingcustomer-0.0.1-SNAPSHOT/conf/bin/ 执行脚本 sh shutdown.sh 3.解压文件 返回到/microservice 将升级包上传到该路径&#x…

JAVA IDEA 取消掉Warning:(22, 14) Class ‘XXXController‘ is never used 提示信息

方法一&#xff1a;代码修改 无用的方法&#xff1a; 删除对应的代码。增加该类对应的应用实现。 方法二&#xff1a;取消掉提示 找到settings—Editor—Inspections&#xff0c;搜索Unused declaration 右边的勾取消掉&#xff0c;对应的校验属性。

座舱软件开发“道与术”

脑图 仅仅个人归纳见解&#xff0c;欢迎专家莅临指导。

【CHI】CHI协议自问自答

学习CHI有一段时间了&#xff0c;如今回过头来&#xff0c;再读协议&#xff0c;一些问题做个记录。如果有错误的地方&#xff0c;欢迎指正。如果有其他的问题&#xff0c;也欢迎留言讨论。 spec&#xff1a; IHI0050F_amba_chi_architecture_spec 【持续更新ing】 目录 1. …

react18中如何实现同步的setState来实现所见即所得的效果

在react项目中&#xff0c;实现添加列表项&#xff0c;最后一项自动显示在可视区域范围&#xff01;&#xff01; 实现效果 代码实现 import { useState, useRef } from "react"; import { flushSync } from "react-dom"; function FlushSyncRef() {con…

JVM成神之路

目录 JVM入门关&#xff1a; 一&#xff1a;JVM的内存布局是咋样的&#xff1f; 二&#xff1a;方法区&#xff0c;永久代&#xff0c;元空间有什么区别&#xff1f; 三&#xff1a;常量池和字符串常量池有什么区别&#xff1f; 四&#xff1a;什么是堆溢出&#xff0c;什…

结构化系统分析,结构化系统设计(正片)

结构化分析方法&#xff1a;是面向数据流进行需求分析的方法&#xff0c;是用抽象模型的概念&#xff0c;按软件内部数据传递、变换的关系&#xff0c;自顶向下逐层分解&#xff0c;直到找到满足功能要求的所有可实现的软件为止。 数据流图&#xff08;DFD&#xff09;&#xf…

Linux系统:本机(物理主机)访问不了虚拟机中的apache服务问题的解决方案

学习目标&#xff1a; 提示&#xff1a;本文主要讲述-本机(物理主机)访问不了虚拟机中的apache服务情况下的解决方案 Linux系统&#xff1a;Ubuntu 23.04&#xff1b; 文中提到的“本机”&#xff1a;代表&#xff0c;宿主机&#xff0c;物理主机&#xff1b; 首先&#xff0c…