鸿蒙NEXT开发教程:浅谈@ComponentV2装饰器
听说今天的广州车展上有一部分人已经看到华为汽车的最后一“界”,尊界超豪华大轿车,应该很快就要正式亮相,可以期待一波。
在api12之后,鸿蒙系统推出一个V2版本的状态管理装饰器,不过目前还在开发试用状态,幽蓝君仔细研究了一下,今天跟大家做一个简单的介绍。
幽蓝君对V2版本装饰器的总结是,它是为了修补目前版本状态管理的不足,新增了一些功能更加精细的状态变量装饰器,等到开发试用完善之后应该会和当前装饰器合并到一起,不再使用V2区分。
下面跟大家详细介绍一下@ComponentV2装饰器。
@ComponentV2和@Component一样,都用于装饰自定义组件,但是@ComponentV2内部只能使用全新的状态变量装饰器,比如@Local、@param、@Once、@Event、@Provider、@Consumer等。这几个装饰器有什么作用呢,请往下看:
@Local:组件内部状态
@Local的作用和现在的@State类似,但是鸿蒙研发团队认为@State装饰器可以从外部初始化是一个缺陷,所以@Local是一个组件内部状态,它不接受从外部进行的初始化,下面我写了一段demo,让我们来感受一下:
@ComponentV2 struct TextV2{
@Local text:string = 'v2'
build() {
Text(this.text)
.fontColor(Color.Brown)
.fontSize(20)
}
}
@Component struct TextV1{
@State text:string = 'v1'
build() {
Text(this.text)
.fontColor(Color.Grey)
.fontSize(20)
}
}

可以看到,当我向子组件传值时,@Local修饰符是不接受的。
@Param:组件外部输入
和@Local相反,@Param表示组件从外部传入的状态,它是为了父子组件之间的数据能够进行同步。但是它是不支持组件内部进行修改的:

@Once:初始化同步一次
这个装饰器看单词就比较好理解,只能修改一次,不过它的局限性比较大,必须和@Param配合使用,不能单独使用,它是为了实现仅从外部初始化一次、不接受后续同步变化的能力。
@Param @Once text:string = 'v2'
@Event组件输出
@Event也和@Param有关系,因为@Param修饰的变量无法从内部修改,但是有时它又需要修改,那怎么办呢,@Event装饰的事件负责告诉父组件,再由父组件进行修改。好像有点多此一举:
@ComponentV2 struct TextV2{
@Param text:string = 'v2'
@Event changeText: (x: string) => void = (x: string) => {};
build() {
Column(){
Text(this.text)
.fontColor(Color.Brown)
.fontSize(20)
.onClick(()=>{
this.changeText('hahaha')
})
}
}
@Provider装饰器和@Consumer装饰器:跨组件层级双向同步
我们在V1版本里都使用过@Provide和@Consume,是用来跨组件层级双向传递的装饰器,这两个长的很像,功能也类似,不过有一些细小的区别,直接跟大家截个图吧:

@Monitor:监听
我们之前使用@Watch来监听变量的变化,不过@Watch无法实现对对象、数组中某一单个属性或数组项变化的监听,且无法获取变化之前的值。而@Monitor可以:
@Local text:string = 'v2'
//监听text
@Monitor('text')
onStrChange(monitor: IMonitor){
monitor.dirty.forEach((path:string)=>{
console.log('修改前:',monitor.value(path)?.before)
console.log('修改后:',monitor.value(path)?.now
)
})
}
@Computed:计算属性
@Computed用来装饰getter方法,并且会随着被计算的值的变化而变化,并且只会计算一次,另外,@Computed的计算性能更佳。文字比较难理解,举个例子:
@Local a:number = 10
@Local b:number = 20
@Computed
get c(){
return this.a + this.b
}
鸿蒙NEXT开发教程:浅谈@ComponentV2装饰器的更多相关文章
- 浅谈Python装饰器
一.概念 装饰器是Python语言中的高级语法.主要的功能是对一个函数.方法.或者类进行加工,作用是为已经存在的对象添加额外的功能,提升代码的可读性.装饰器是设计模式的一种,被用于有切面需求的场景,较 ...
- Android安全开发之浅谈密钥硬编码
Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...
- Android应用安全开发之浅谈加密算法的坑
<Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题 Android开发中,难免会遇到需要加解密一些数据内 ...
- 安卓开发_浅谈ListView(SimpleAdapter数组适配器)
安卓开发_浅谈ListView(ArrayAdapter数组适配器) 学习使用ListView组件和SimapleAdapter适配器实现一个带图标的ListView列表 总共3部分 一.MainAc ...
- 安卓开发_浅谈Android动画(四)
Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1. ValueAnimator 基本属 ...
- 安卓开发_浅谈ListView(自定义适配器)
ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ...
- 【大型软件开发】浅谈大型Qt软件开发(二)面向未来开发——来自未来的技术:COM组件。我如何做到让我们的教学模块像插件一样即插即用,以及为什么这么做。
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...
- 【大型软件开发】浅谈大型Qt软件开发(三)QtActive Server如何通过COM口传递自定义结构体?如何通过一个COM口来获得所有COM接口?
前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考. 鉴于接下来的一年我要进行这个 ...
- 开发技术--浅谈Python函数
开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
随机推荐
- 使用idea合并 dev分支合并到test分支
这里展示将dev分支合并到test分支首先切换到test分支 按下图所示操作
- QT5笔记:10. 容器类的迭代
1. 这里指的是Java类型的迭代器,即使用方式和Java中一致 代器的使用例子(适用于可读可写迭代器) QList<QString>list;//声明容器类 list << ...
- .NET 10 首个预览版发布,跨平台开发与性能全面提升
前言 2024年2月25日,微软正式推出 .NET 10 预览版 1,标志着这一跨平台开发框架迈入新里程碑. 本次更新聚焦 JIT 编译器优化.运行时性能提升和跨平台开发体验增强,同时引入多项开发者期 ...
- JS代码执行
- CICFlowMeter 使用方法
前言 因实验需要提取流量特征,就找到了这个较为著名的流量特征提取工具 CICFlowMeter .例如 CIC-IDS-2017 数据集就是通过这个工具提取而来. 网络上的教程众说纷纭,但我始终是无法 ...
- 2022美亚杯个人赛wp(纯文字思路)
2022美亚杯个人赛wp(纯文字思路) vc镜像密码CZDGm#&2_Ns$7wSMn%ZGr7xntcHS7d5uFta#Up9544jx_cvP$uFM7?pTDa*jN&QyFD ...
- gitee如何删除仓库
进入仓库的管理页面点击删除
- next.js 添加 PWA 渐进式WEB应用(service-worker) 支持
本文仅作为 next 系列文章中的一部分,其他 next 文章参考: https://blog.jijian.link/categories/nextjs/ 去 github 搜索了一把,估计是我关键 ...
- 零经验选手,Compose 一天开发一款小游戏!
猛男翻卡牌 猛男启动 继上一个 Compose 练习项目 SimpleTodo 之后,又尝试用 Compose 来做了一个翻牌记忆游戏[猛男翻卡牌].这次是零经验写游戏项目,连原型都没有做设计,问了 ...
- Go语言计算字符串长度——len()和RuneCountInString()
Go 语言的内建函数 len(),可以用来获取切片.字符串.通道(channel)等的长度.下面的代码可以用 len() 来获取字符串的长度. tip1 := "genji is a nin ...