HarmonyOS入门学习
HarmonyOS入门学习
- 前言
- 快速入门
- ArkTS组件
- 基础组件
- Image组件
- Text组件
- TextInput 文本输入框
- Button
- slider 滑动组件
- 页面布局
- 循环控制
- ForEach循环创建组件
- List
- 自定义组件
- 创建自定义组件
- @Builder 自定义函数
- 状态管理
- @Prop和@Link
- @Provide和@Consume
- @ObjectLink和@Observed
- ArkUI
- 页面路由
- 属性动画和显示动画
- 属性动画
- 显示动画
- 转场动画
- Stage模型
- Stage模型概述
- UIAbility生命周期
- 页面及组件生命周期
- UIAbility的启动模式 (待完善)
- 网络连接
- Http的数据请求
- 第三方库axios
- 数据持久化
- Preference
- 关系型数据库
- 通知
- 基础通知
- 普通文本型通知
- 长文本类型通知
- 多行文本类型通知
- 图片类型通知
- 通知替他内容拓展
- 进度条通知
- 通知行为意图
- 鸿蒙开发遇到问题
- oh-package.json5引入依赖问题
前言
- 官方网站:https://developer.harmonyos.com
由于ArkTSd 语法是基于TypeScript的,如果没有TypecScript的基础可以先初步学习下TypeScript的语法:
- 参考链接:http://t.csdnimg.cn/1WWAk?spm=1011.2480.3001.8118
快速入门
基本代码结构介绍:
ArkTS组件
基础组件
这里只介绍一些基础组件的基本用法,一些组件的特别的属性用法,希望大家多查文档。 DevEco Studio 内置API文档,大家查看非常方便
如果我们想查看某个组件的文档, 只需要选中某个组件,把鼠标悬浮在改组件上, 会弹出如下框,点击弹出框按钮,即可以查看API文档:
Image组件
- Image: 图片显示组件, 声明Image组件并设置图片源:
Image(src: string | PixelMap | Resource)
string格式
:通常用来加载网络图片,需要申请网络访问权限:ohos.permission.INTERNET
。例如:Image('https://xxxxx.png')
PixelMap格式, 可以加载像素图,常用在图片编辑中。例如:
Image(PixelMapObject)
Resource格式,加载本地图片, 推荐使用:
Image($r(‘app.media.mate60’))Image($rawfile(‘mate60’))
具体的Image组件的其他属性, 可以参考API文档, 文档上都描写的非常清楚。
Text组件
声明Text组件并设置文本内容Text(content?: string | Resource)
string格式,直接填写文本内容
Text(‘文本内容’)
Resource格式,地区本地资源文件。
注意:使用Resource格式时,可以配置多个string.json文件内容,达到我们实现国际化的目的。 base/element/string.json文件中必须要配置, 如果使用的变量在其他配置文件中没有找到, 最后会找到base目录下的string.json文件。 项目中你如果配置了各个语言的变量, 那么这个变量的展示的值,随着你系统的当前语言来展示你在对应语言文件中配置的内容
TextInput 文本输入框
声明TextInput组件: TextInput(value?:{placeholder?: ResourceStr, text?: ResourceStr, controller?: TextInputController})
placeHoder: 输入框无输入时的提示文本
text: 输入框当前的文本内容
关于输入框类型InputType的一些说明:
Button
- 声明Button组件:
- 方法1:
Button(options?: {type?: ButtonType, stateEffect?: boolean})
包含单个子组件 - 方法2:
Button(label?: ResourceStr, options?: { type?: ButtonType, stateEffect?: boolean })
lables 是按钮文字,使用文本内容直接创建相应的按钮组件,此时无法包含子组件。如果包含了子组件, 会报如下错误:
- 方法1:
slider 滑动组件
声明组件: Slider(options?: {value?: number, min?: number, max?: number, step?: number, style?: SliderStyle, direction?: Axis, reverse?: boolean})
页面布局
Cloumn: 垂直方向布局:Column(value?: {space?: string | number})
. 相关属性介绍如下:
- justifyContent: 设置子元素在主轴方向的对齐方式
- alignItems: 设置子元素在交叉轴方向的对齐方式
Row(横向布局)和Column的用法类似,具体的使用参考文档。
循环控制
ForEach循环创建组件
当数据结构一样时, 我们可以使用forEach循环数组,根据数组的内容创建组件。
forEach循环中也可以使用if/else
条件控制语句,可以根据数据的不同来渲染不同的页面组件。
List
列表(LIst)是一种复杂容器,具备下列特点:
- 列表项(ListItem)数据过多超出屏幕后,会自动提供滚动功能
- 列表(ListItem)既可以纵向排列,也可以横向排列
List(value?:{space?: number | string, initialIndex?: number, scroller?: Scroller})
上面我们通过ForEach来循环渲染组件, 当我们渲染的组件超过一屏显示的数量后, 我们发现无法滚动展示下面被隐藏的内容。 这里我们可以使用List组件, 当内容超过一屏之后,可以像下滑动展示剩下的内容
Blank()
//空白填充器 在容器主轴方向自动填充空白空间,达到自适应拉伸效果。layoutWeight
:父容器尺寸确定时,设置了layoutWeight属性的子组件与兄弟元素占主轴尺寸按照权重进行分配,忽略元素本身尺寸设置,在任意尺寸设备下,自适应占满剩余空间。
注意:List组件内,必须要包裹ListItem组件才可以,我们的内容都是定义在ListItem中。如果没有包裹ListItem,会报错
自定义组件
创建自定义组件
比如上述代码中的头部,我们可以单独抽出一个组件来使用: 代码如下:
@Builder 自定义函数
我们除了上述这个单独抽取到文件的组件方法之外我们还可以使用自定义函数, 我们可以通过自定义函数来达到类似组件封装的目的, 而且自定义函数做内部的体验封装更合适一点。
全局自定义函数
全局自定义函数是写在组件外面的, 所有的组件都可以调用, 作为函数可以传参!
局部自定义函数: 相比较全局自定义函数, 少了function字段, 并且只能组件内部调用, 调用时需要加this
我们可以发现,在上述的代码中我们有很多可以用公用的样式,假如样式有变动,可能会导致我们修改的地方很多,代码很难维护。我们可以定义一个样式公共函数,使用的地方直接调用函数。这样样式改动的时候,我们只需要修改公共函数的内部样式即可。
自定义全局的公共样式函数:
注意:全局公共样式函数, 里面写的样式必须是所有组件通用的属性, 如果有特殊属性可以使用@Extend属性。但是@Extend(继承模式,只能写在全局)
公共样式函数里面除了可以写样式除外,还可以设置事件方法。
局部自定义的公共样式函数:
状态管理
在声明式UI中,是以状态驱动视图更新:
- 状态(State):指驱动视图更新的数据(被装饰器标记的变量)
- 视图(View):基于UI描述渲染得到的用户界面
说明:
- @State装饰器标记的变量必须初始化,不能为空值
- @State支持Object、class、string、number、boolean、enum类型以及这些类型的数据
- 嵌套类型以及数组中的对象属性无法触发视图更新
@Prop和@Link
当父子组件之间需要数据同步时,可以使用@Prop和@Link装饰器:
@Prop装饰器示例代码:
@Link装饰器示例代码:
通过@Link装饰器修饰的变量, 父组件把totalTask和finishTask两个变量传递给,TaskList组件, TaskList组件内部会改动到这个两个值, 然后同步给父组件, 父组件在同步给Header组件。这样就产生了一个数据的联动
如果父组件使用的是对象类型,子组件需要使用这个对象,那么子组件可以创建对象中对应的属性就可以了。
@Link支持对象类型的示例代码:
@Provide和@Consume
@Provide和@Consume可以跨组件提供类似@State和@Link的双向同步, 不用显示传参,只需要使用该装饰器修饰. @Providet提供,@Consume使用
注意:能使用@State和@Link的尽量使用, 实在有跨组件的需求的可以使用@Provide和@Consume
@ObjectLink和@Observed
@ObjectLink和@Observed装饰器用于在涉及嵌套对象
或数组元素为对象
的场景中进行双向数据同步
基于上面的代码,我们实现一个选中checkBox后, 每个item的标题样式设置为选中置灰样式。
但是上面结果显示,当我们选中时, item并没有展示我们想要的类型。原因是, 我们修改的是Tasks(数组)中Task(对象)的某个属性值, 所以没办法监听到这种嵌套类型的中的某个属性变化的。
如果想要监听嵌套类型中的数据变化,需要实现一下几步:
第一步:需要给嵌套对象上 加上@Observed
第二步:需要给元素对应的变量加上 @ObjectLink关键字
由上面代码可知,task是一个参数, 我们没办法加@ObjectLink关键字, 所以这里我们需要把渲染的这些逻辑封装成一个组件, task作为一个参数传递过去, 然后再给这个参数添加@ObjectLink关键字
由上面运行结果可知, 我们确实监听到了 嵌套类型中的数据的变化, 但是有个问题,我们发现当我们选中任务的时候, 没办同步状态,我们可以把执行方法当做参数传递到组件中
错误的传递方法:
原因:我们把handlerTaskChnage进去,使用onTaskChange来做接受,当我们执行onTaskChange方法时, 本质上是执行handlerTaskChnage方法,当执行这个方法的时候,就回去寻找this
, 方法内不访问到父组件的一些属性, 子组件内没有这个属性,所以找不到这个属性。
所以后面如果需要传递方法的时候,需要注意下方法内部的this。
那么我们如何保持this不变了,API提供了一个bind()
函数, 作用是把this绑定到这个函数上, 那么函数内部的this,永远都是你传递的这个this
ArkUI
页面路由
页面路由是指应用程序中实现不同页面之间的跳转和数据传递。
- 页面栈的最大容量上限为
32
个页面,使用router.clear()
方法可以清空页面栈,释放内存 - Router有两种页面跳转模式, 分别是:
router.pushUrl()
:目标页不会替换当前页,而是压人页面栈,因此可以用router.back()
返回当前页router.replaceUrl()
:目标页替换当前页,当前页会被销毁释放资源,无法返回当前页
- Router有两种页面实例模式,分别是:
Standard
:标准实例模式,每次跳转都会新建一个目标并压入栈顶。默认就是这种模式Single
:单实例模式,如果目标页已经在栈中,则离栈顶最近的同url
页面会移动到栈顶并重新加载
页面路由使用:
- 首先导入HarmonyOS提供的Router模块:
import router from '@ohos.router'
- 然后利用router实现调转,返回等操作
注意:router跳转的路径, 必须是在resource/base/profile/main_pages.json文件中配置对应的路由路径, 如果没有在文件中配置对应的路径,那么会报如下错误:
- 异常响应回调函数,错误码:
- 100001: 内部错误,可能是渲染失败
- 100002: 路由地址错误
- 100003: 路由栈中页面超过
32
文件配置示例如下:
我们上述创建的页面都是直接创建的ArkTS File
,所以需要手动再resource/base/profile/main_pages.json
文件中配置, 其实我们可以直接选择创建Page
这样系统会直接帮我们在json文件中配置好,无需我们在去手动配置
有时候我们在返回之前弹出一个提示框,提示用户, API已经给我们提供好了函数:
示例如下:
属性动画和显示动画
属性动画
属性动画
是通过设置组件的animation
属性来给组件添加动画,当组件的width、height、Opacity、backgroundColor、scale、rotate、translate等属性变更时,可以实现渐变过渡效果。
注意: animation属性一定要放在动画属性后面, 如果没有放在动画属性后面, 那么这个动画属性也不会起作用的,也就是没有动画
上述代码是没有位移的动画
显示动画
显示动画
是通过全局animationTo函数来修改组件属性,实现属性变化时的渐变过渡效果
Animation是全局通用的函数 , 直接调用
相关动画属性:
转场动画
组件转场动画
是在组件插入或移动时的过渡动画,通过组件的transition
属性来配置
transiton的相关属性:
注意:转场动画需要配合animationTo这个方法来使用,需要配合是否展示相关组件来使用。(更多的API使用方式,请参考官方文档)
Stage模型
Stage模型概述
全局配置文件:
Ability模块的配置文件:
官方文档:配置文件简介
UIAbility生命周期
Ability的相关声明周期方法:
由上面代码可以,在实际上, 系统把onWindowStageCreate
和onWindowStageDestroy
这个两个生命周期方法加入到了,Alility的生命周期中了。
页面及组件生命周期
页面组件从创建到销毁的过程:
注意:页面生命周期只能在@Entry
标记的入口组件中使用, 而另外两个组件的生命周期方法则没有要求
UIAbility的启动模式 (待完善)
网络连接
Http的数据请求
请求配置:
返回response描述:
第三方库axios
- 第一步下载和安装
ohpm
ohpm的安装官方连接
- 第二步:下载axios库: 进入项目目录,然后输入下面指令
ohpm install @ohos/axios
在使用之前,我们需要去配置下网络权限:
鸿蒙第三方库仓库:https://ohpm.openharmony.cn/#/cn/home
**使用axios: **
数据持久化
Preference
Perference为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据
使用方式:
// 导入 Preference模块
import preferences from '@ohos.data.preferences';export class PreferenceUtils {// 缓存 preference的map列表prefMap: Map<string, preferences.Preferences> = new Map// 加载preference实例async loadPreference(context, name: string) {try {let pref = await preferences.getPreferences(context, name)this.prefMap.set(name, pref)console.log('testTag', `加载Preference[${name}]成功`)} catch (e) {console.log('testTag', `加载Preference[${name}]失败`, JSON.stringify(e))}}// 缓存数据async putPreferenceValue(name: string, key: string, value: preferences.ValueType ) {// 判断prefMap是否有这个prefrerence实例, 没有则报错 该preference实例没有初始化if (!this.prefMap.has(name)) {console.log('testTag', `Preference[${name}]尚未初始化`)return}try {let pref = this.prefMap.get(name)// 写入数据await pref.put(key, value)// 刷新磁盘await pref.flush()console.log('testTag', `保存Preference[${name}]成功`)} catch (e) {console.log('testTag', `保存Preference[${name}]失败`, JSON.stringify(e))}}// 获取数据async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType) {if (!this.prefMap.has(name)) {console.log('testTag', `Preference[${name}]尚未初始化`)return}try {let pref = this.prefMap.get(name)// 获取数据let value = pref.get(key, defaultValue)console.log('testTag', `读取Preferences[${name}].[${key}] = [${value}]成功`)return value} catch (e) {console.log('testTag', `读取Preferences[${name}].[${key}] 失败`, JSON.stringify(e))}}
}
- 说明
- Key为string类型, 要求非空且长度不超过80字节
- Value可以是string、number、boolean及以上类型数组,大小不超过8192字节
- 数据量建议不超过一万条
关系型数据库
关系型数据库(RDB)是基于SQLite组件提供的本地数据库, 用于管理应用中的结构化数据。例如: 记账本、备忘录。
初始化数据库:
对于数据库的增删改查操作,鸿蒙提供了一些简单的操作, 不用我们每个操作都需要写SQL命令。
查询操作示例:
增、删、该操作示例:
通知
基础通知
应用可以通过通知接口发送消息通知,提醒用户关注应用中的变化。用户可以在通知栏查看和操作通知内容。
通知的基础用法:
通知共有4中类型:
普通文本型通知
长文本类型通知
多行文本类型通知
图片类型通知
通知替他内容拓展
进度条通知
进度条通知会展示一个动态的进度条,主要用于文件下载、长任务处理的进度显示
通知行为意图
参考官方文档:
- https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/notification-with-wantagent-0000001477981041-V2
- https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/js-apis-inner-wantagent-wantagentinfo-0000001428061912-V2
鸿蒙开发遇到问题
oh-package.json5引入依赖问题
在多模块的开发模式中, 各个模块在oh-package.json5中引入依赖问题,有如下需要注意的地方:
如A 模块中引入 testModel
:
"dependencies":{"testModel": "file:../../libraries/testModel"
}
在B模块中也引入testModel
:
"dependencies":{"TestModel": "file:../../libraries/testModel"
}
这个时候最终打出的app包会包含两个 testModel
和TestModel
两个库,testModel
中的静态变量也会有多份。
注意:还有,引入HSP中的文件不能用相对路径引用,必须使用库名
import xxx from 'testModel' // IDE能识别是HSPimport xxx from 'testModel/xxx' // IDE识别不了是HSP,会重新引入和构造一份
相关文章:

HarmonyOS入门学习
HarmonyOS入门学习 前言快速入门ArkTS组件基础组件Image组件Text组件TextInput 文本输入框Buttonslider 滑动组件 页面布局循环控制ForEach循环创建组件 List自定义组件创建自定义组件Builder 自定义函数 状态管理Prop和LinkProvide和ConsumeObjectLink和Observed ArkUI页面路由…...

【Mock|JS】Mock的get传参+获取参数信息
mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…...
spring cloud gateway k8s优雅启停
通过配置readiness探针和preStop hook,实现优雅启动和停止(滚动部署) 1. k8s工作负载配置 readinessProbe:httpGet:path: /datetimeport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 1periodSeconds: 30successThreshold: 1fa…...

嵌入式软件面试-linux-中高级问题
Linux系统启动过程: BIOS自检并加载引导程序。引导程序(如GRUB)加载Linux内核到内存。内核初始化硬件,加载驱动,建立内存管理。加载init进程(PID为1),通常是systemd或SysVinit。init…...
css禁用元素指针事件,鼠标穿透,点击下层元素,用`pointer-events:none;`
pointer-events: 对鼠标事件的反应 MDN pointer-events 英文 https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events 菜鸟教程 CSS pointer-events 属性 https://www.runoob.com/cssref/css3-pr-pointer-events.html 常用取值 auto 和 none pointer-events: aut…...

Eureka的介绍和作用,以及搭建
一、Eureka的介绍和作用 Eureka是Netflix开源的一种服务发现和注册工具,它为分布式系统中的服务提供了可靠的服务发现和故障转移能力。Eureka是Netflix的微服务架构的关键组件之一,它能够实时地监测和管理服务实例的状态和可用性。 在Eureka架构中&…...
shell和linux的关系
Shell 和 Linux 之间存在密切的关系,但它们并不是同一个东西。让我们分别了解一下它们: Linux: Linux 是一个自由和开放源代码的类UNIX操作系统。 Linux 的内核由林纳斯托瓦兹(Linus Torvalds)于1991年首次发布&…...

数据在内存的存储
整数在内存中的存储 我们来回顾一下,整数在计算机是以补码的形式进行存储的,整数分为正整数和负整数,正整数的原码、反码和补码是一样的,负整数的原码、反码和补码略有不同(反码是原码除符号位,其他位按位取…...
JavaScript之ES中的类继承与Promise
类 ES5中的类及继承 //人function Person(name,age){this.name name;this.age age;}Person.prototype.eat function () {console.log(this.name "eat");}//程序员,继承,人function Programmer(name,age,language){//构造函数继承Person.…...

浅析多模态大模型技术路线梳理
前段时间 ChatGPT 进行了一轮重大更新:多模态上线,能说话,会看图!微软发了一篇长达 166 页的 GPT-4V 测评论文,一时间又带起了一阵多模态的热议,随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作紧随其后…...

使用 Amazon SageMaker 微调 Llama 2 模型
本篇文章主要介绍如何使用 Amazon SageMaker 进行 Llama 2 模型微调的示例。 这个示例主要包括: Llama 2 总体介绍Llama 2 微调介绍Llama 2 环境设置Llama 2 微调训练 前言 随着生成式 AI 的热度逐渐升高,国内外各种基座大语言竞相出炉,在其基础上衍生出…...

牛客小白月赛86(D剪纸游戏)
题目链接:D-剪纸游戏_牛客小白月赛86 (nowcoder.com) 题目描述: 输入描述: 输入第一行包含两个空格分隔的整数分别代表 n 和 m。 接下来输入 n行,每行包含 m 个字符,代表残缺纸张。 保证: 1≤n,m≤10001 字符仅有 . 和 * 两种字符…...

MySQL的基础操作与管理
一.MySQL数据库基本操作知识: 1.SQL语句: 关系型数据库,都是使用SQL语句来管理数据库中的数据。 SQL,即结构化查询语言(Structured Query Language) 。 SQL语句用于维护管理数据库,包括数据查询、数据更新、访问控…...
Pytorch 中的forward 函数内部原理
PyTorch中的forward函数是nn.Module类的一部分,它定义了模型的前向传播规则。当你创建一个继承自nn.Module的类时,你实际上是在定义网络的结构。forward函数是这个结构中最关键的部分,因为它指定了数据如何通过网络流动。 单独设计 forward …...

四、C语言中的数组:如何输入与输出二维数组(数组,完)
本章的学习内容如下 四、C语言中的数组:数组的创建与初始化四、C语言中的数组:数组的输入与元素个数C语言—第6次作业—十道代码题掌握一维数组四、C语言中的数组:二维数组 1.二维数组的输入与输出 当我们输入一维数组时需要一个循环来遍历…...

基于python+vue智慧农业小程序flask-django-php-nodejs
传统智慧农业采取了人工的管理方法,但这种管理方法存在着许多弊端,比如效率低下、安全性低以及信息传输的不准确等,同时由于智慧农业中会形成众多的个人文档和信息系统数据,通过人工方法对知识科普、土壤信息、水质信息、购物商城…...

好用的GPTs:指定主题搜索、爬虫、数据清洗、数据分析自动化
好用的GPTs:指定主题搜索、爬虫、数据清洗、数据分析自动化 Scholar:搜索 YOLO小目标医学方面最新论文Scraper:爬虫自动化数据清洗数据分析 点击 Explore GPTs: Scholar:搜索 YOLO小目标医学方面最新论文 搜索 Scho…...
使用Qt自带windeployqt打包QML的exe
1.在开始菜单输入CMD找到对应的Qt开发版本,我的是Qt5.15.2(MinGW 8.1.0 64-bit)。 2.在控制台输入如下字符串,格式为 windeployqt exe绝对路径 --qmldir 工程的绝对路径 如下是我的打包代码。 我需要打包的exe的绝对路径 D:\Prj\Code\Demo\QML\Ana…...
C代码快速傅里叶变换-分类和推理-常微分和偏微分方程
要点 C代码例程函数计算实现: 线性代数方程解:全旋转高斯-乔丹消元,LU分解前向替换和后向替换,对角矩阵处理,任意矩阵奇异值分解,稀疏线性系统循环三对角系统解,将矩阵从完整存储模式转换为行索…...

计算机组成原理 双端口存储器原理实验
一、实验目的 1、了解双端口静态随机存储器IDT7132的工作特性及使用方法 2、了解半导体存储器怎样存储和读出数据 3、了解双端口存储器怎样并行读写,产生冲突的情况如何 二、实验任务 (1)按图7所示,将有关控制信号和和二进制开关对应接好,…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...