王学岗鸿蒙开发(北向)——————(七、八)ArkUi的各种装饰器

arts包含如下:1,装饰器 ;2,组件的描述(build函数);3,自定义组件(@Component修饰的),是可复用的单元;4,系统的组件(鸿蒙官方提供);等
装饰器的作用:装饰类、变量、方法、结构等。
@State 可以用数据驱动UI更新。
@Entry 入口文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

组件的调用

@Entry
@Component
@Preview
struct Index {@State message: string = 'Hello World'aboutToAppear() {}build() {Column() {//可以不传参Test()//也可以传参,使用{}Test({msg:'马超'})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}aboutToDisappear() {}
}
//自定义组件
@Component
struct Test{private msg:string = '赵云';build(){Column(){Text(this.msg)}}
}

在这里插入图片描述

@Entry
@Component
@Preview
struct Index {@State message: string = 'Hello World'msg:string = '曹操'aboutToAppear() {}build() {Column() {//调用的时候需要使用this.this指代当前所属组件//注意,这里传递的是值不是引用。如果在Button的点击方法中更改了//this.msg的值,MyBuilderFunction1不会修改显示内容this.MyBuilderFunction1(this.msg)this.MyBuilderFunction2()this.MyBuilderFunction3()//调用全局构建函数,不能使用thisGlobalBuilder()Button('按钮').onClick((event:ClickEvent)=>{console.log("点击了按钮")this.msg = '曹丕'})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}aboutToDisappear() {}@Builder //自定义组件内构建函数MyBuilderFunction0() {Text(this.message).fontSize(50)}@Builder //自定义组件内构建函数MyBuilderFunction1(msg:string) {Text(msg).fontSize(50)}@Builder //自定义组件内构建函数MyBuilderFunction2() {Text('刘备').fontSize(50)}@Builder //自定义组件内构建函数MyBuilderFunction3() {Text('孙坚').fontSize(50)}}//全局构建函数,需要使用function
@Builder
function GlobalBuilder(){Text('我是全局的构建函数').fontSize(40)
}
@Entry
@Component
@Preview
struct Index {@State message: string = 'Hello World'msg:string = '曹操'aboutToAppear() {}build() {Column() {//MyBuilderFunction后这里不能用括号Child({builder:this.MyBuilderFunction})}.width('100%').height('100%').justifyContent(FlexAlign.Center)}aboutToDisappear() {}@BuilderMyBuilderFunction(){Text('我爱你爱你').fontSize(50)}
}
//子组件被父组件调用,
@Component
struct Child{//不初始化会报错//Property 'builder' in the custom component 'Child' is missing assignment or initialization.// @BuilderParam装饰器:引用@Builder函数//  当开发者创建了自定义组件,并想对该组件添加特定功能时,例如在自定义组件中添加一个点击跳转操作。//  若直接在组件内嵌入事件方法,将会导致所有引入该自定义组件的地方均增加了该功能。//  为解决此问题,ArkUI引入了@BuilderParam装饰器,@BuilderParam用来装饰指向@Builder方法的变量,//  开发者可在初始化自定义组件时对此属性进行赋值,为自定义组件增加特定的功能。该装饰器用于声明任意UI描述的一个元素,//  类似slot占位符。@BuilderParam builder:()=>void;build(){Column(){this.builder()Text('吕玲绮').fontSize(50)}}
}

在这里插入图片描述

@Entry
@Component
@Preview
struct Index {@State message: string = 'Hello World'msg: string = '曹操'aboutToAppear() {}build() {Column() {//如果名字相同,都叫MyStyle,组件内的优先级高//@Styles不能传递参数Text('曹操').MyStyle1()Text('刘备').MyStyle2()Text('孙权').MyStyle1()Text('吕布').MyStyle2()}.justifyContent(FlexAlign.Center).height('100%').width('100%')}//自定义样式,组件内不需要function,只能是通用属性和事件,@StylesMyStyle1(){.width('100%').height(100).backgroundColor('green')}
}
//自定义样式,组件外需要function,只能是通用样式,不能传递参数
@Styles
function MyStyle2(){.width('100%').height(100).backgroundColor('blue')
}

在这里插入图片描述

@Entry
@Component
@Preview
struct Index {@State message: string = 'Hello World'aboutToAppear() {}build() {Column({ space: 20 }) {Text('曹操').MyTextStyle(Color.White)Text('孙坚').MyTextStyle(Color.Blue)Text('刘备').MyTextStyle(Color.Green)Text('吕布').MyTextStyle()}.justifyContent(FlexAlign.Center).height('100%').width('100%')}
}
//扩展原生样式,可以用私有的,可以传递参数,参数可以设置默认值,有默认值的写在最后面
@Extend(Text) function MyTextStyle(color:Color = Color.Orange) {.fontSize(50).fontColor(color).backgroundColor(Color.Gray)}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

@Entry
@Component
@Preview
struct Index {//定义状态变量@State count: number = 0build() {Column({ space: 20 }) {Text(`count =${this.count}`).fontSize(50)Button('点击加一').onClick(()=>{this.count++})}.justifyContent(FlexAlign.Center).height('100%').width('100%')}
}

在这里插入图片描述

@Entry
@Component
@Preview
struct Index {//定义状态变量@State count: number = 0build() {Column({ space: 20 }) {Text(`父组件的count${this.count}`).fontSize(40)Button('父点击加一').onClick(() => {this.count++})Child({ childCount: this.count })}.justifyContent(FlexAlign.Center).height('100%').width('100%')}
}@Component
struct Child {//把count传递给子组件Child,使用@Prop修饰@Prop private childCount: numberbuild() {Column() {Text(`子组件的count${this.childCount}`).fontSize(40)//prop是单向同步,这里点击加一变得只有child组件,父组件不变Button('子点击加一').onClick(() => {this.childCount++})}}
}
@Entry
@Component
@Preview
struct Index {//定义状态变量@State count: number = 0build() {Column({ space: 20 }) {Text(`父组件的count${this.count}`).fontSize(40)Button('父点击加一').onClick(() => {this.count++})//@Link修饰的变量必须要加$Child({ childCount:$count})}.justifyContent(FlexAlign.Center).height('100%').width('100%')}
}@Component
struct Child {//把count传递给子组件Child,使用@Prop修饰@Link private childCount: numberbuild() {Column() {Text(`子组件的count${this.childCount}`).fontSize(40)//link是单向同步,这里点击加一变得父组件与子组件都会变Button('子点击加一').onClick(() => {this.childCount++})}}
}

@prop不能是数组、对象,但支持枚举类型,不允许初始化
@link支持类型比较多,详见上图

在这里插入图片描述
@Provider 和@Consume是生产者和消费者模式

@Entry
@Component
@Preview
struct Index {//定义状态变量@Provide count: number = 0build() {Column({ space: 20 }) {Text(`父组件的count ${this.count}`).fontSize(40)Button('父点击加一').onClick(() => {this.count++})//不需要传递参数了Child()}.justifyContent(FlexAlign.Center).height('100%').width('100%')}
}@Component
struct Child {@Consume count: numberbuild() {Column() {Text(`子组件${this.count}`).fontSize(40)GrandSon()}}
}@Component
struct GrandSon {@Consume count: numberbuild() {Column() {Text(`孙组件${this.count}`).fontSize(40)Button('孙点击加一').onClick(() => {//孙组件点击改变count,父组件,子组件也会改变this.count++})}}
}

@Entry
@Component
@Preview
struct Index {@State grade:Grade = new Grade(new Student('孙悟空',18))build() {Column({ space: 20 }) {Text(`父组件中的name=${this.grade.stu.name},年龄=${this.grade.stu.age}`).fontSize(30)Button('父组件').onClick(()=>{this.grade.stu.age+=1console.log(`年龄${this.grade.stu.age}`)})Child({stu:this.grade.stu})}.justifyContent(FlexAlign.Center).height('100%').width('100%')}
}
//子组件
@Component
struct Child{//传递学生对象,增加@ObjectLink后,在父组件中点击修改年龄,子组件可以响应,也会修改@ObjectLink stu:Studentbuild(){Column(){Text(`子组件中的name=${this.stu.name},年龄=${this.stu.age}`).fontSize(30)}}
}
//学生类,单独使用Observed没任何效果,需要搭配@ObjectLink或者@Prop
@Observed
class Student {name: string = ''age: number = 18constructor(name: string, age: number) {this.name = name;this.age = age;}
}
//年级
@Observed
class Grade {stu: Studentconstructor(stu: Student) {this.stu = stu;}
}

@Watch,监听某个值,一旦值变化了,会调用某个函数

@Entry
@Component
@Preview
struct Index {@State@Watch('myCallBack')//@Watch的作用是监听count的值,只要count值发生变化,myCallBack就会被回调一次count:number = 0@State message:string = '@Watch回调函数被第0次调用'build() {Column({ space: 20 }) {Text(this.message).fontSize(40).fontColor(Color.Green)Button('点击count+1').onClick(()=>{//如果这里注释掉,myCallBack函数不会调用,因为count值没有变化this.count++})}.justifyContent(FlexAlign.Center).height('100%').width('100%')}myCallBack(){console.log('callback被调用了');}
}

@Watch修饰的可以是类

@Entry
@Component
@Preview
struct Index {@State@Watch('myCallBack')//@Watch的作用是监听count的值,只要count值发生变化,myCallBack就会被回调一次person:Person = new Person(1)build() {Column({ space: 20 }) {Text(`${this.person.count}`).fontSize(40).fontColor(Color.Green)Button('点击count+1').onClick(()=>{//如果这里注释掉,myCallBack函数不会调用,因为count值没有变化this.person.count++})}.justifyContent(FlexAlign.Center).height('100%').width('100%')}myCallBack(){console.log('callback被调用了');}}
class Person{count:number;constructor(count:number) {this.count = count;}
}

UI状态存储,上面讲述的是组件传值,组件传值是在一个界面传值,多个界面传值无法使用。
多个界面如下配置
在这里插入图片描述

import router from '@ohos.router'
@Entry
@Component
@Preview
struct Index {build() {Column({ space: 20 }) {Button('界面跳转').onClick(()=>{//界面跳转,router.pushUrl({url:'pages/Index2'})})}.justifyContent(FlexAlign.Center).height('100%').width('100%')}
}

界面跳转的写法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上代码:
在这里插入图片描述

//定义常量,购物车中存取都用这个键
export const Key: string = 'cart_key'
//添加购物车,这里直接使用string,不再新建一个类
export const addCart = (goods:string) => {//从购物车中取出对应的商品,从AppStorage中通过键取,没有值就给个空字符串const myGoods = AppStorage.Get(Key) as string || ''//字符串拼接下,let str = goods.concat(myGoods)//将购物车信息放入到AppStorage中AppStorage.SetOrCreate(Key,str)
}
//清空购物车
export const clearCart = ()=>{AppStorage.SetOrCreate(Key,'')
}
//不要忘记了export
import router from '@ohos.router'
@Entry
@Component
@Preview
struct Index {build() {Column({ space: 20 }) {Button('界面跳转').onClick(()=>{//界面跳转,router.pushUrl({url:'pages/GoodsPages'})})}.justifyContent(FlexAlign.Center).height('100%').width('100%')}
}
import promptAction from '@ohos.promptAction'
import router from '@ohos.router'
import { addCart } from '../tools/util'
@Entry
@Component
@Preview
struct GoodsPages {//商品页面build() {Column({ space: 20 }) {Button('苹果手机加入购物车').onClick(()=>{addCart('苹果手机')promptAction.showToast({message:"苹果购买成功"})})Button('华为手机加入购物车').onClick(()=>{addCart('华为手机')promptAction.showToast({message:"华为购买成功"})})Button('跳转到购物车界面').onClick(()=>{router.pushUrl({url:'pages/Index2'})})}.justifyContent(FlexAlign.Center).height('100%').width('100%')}}

上述代码有一个问题,数据没有持久化存储,观点app在重新打开,购物车里的商品会消失
在这里插入图片描述
需要持久化
//一句话实现持久化存储
PersistentStorage.PersistProp(Key,‘’)

import { Key } from '../tools/util'
//一句话实现持久化存储
PersistentStorage.PersistProp(Key,'')
@Entry
@Component
@Preview
struct Index2 {//购物车界面,有添加商品,跳转到别的界面,购物车信息依然可以共享//大部分的时候存储的是json字符串,AppStorage是存储在内存中,需要持久化@StorageProp(Key)//必须初始化,如果有值就取出来,如果没值就把初始化的值存入AppStoragecart:string = ''build() {Column({ space: 20 }) {Text(`购物车的商品:${this.cart}`).fontSize(30)}.justifyContent(FlexAlign.Center).height('100%').width('100%')}// test(){//   JSON.parse(this.cart)//   JSON.stringify()// }
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在src/main/ets/entryability/EntryAbility.ts的onWindowStageCreate()中加载默认启动的界面
在这里插入图片描述
在这里插入图片描述
//组件在界面中的生命周期函数
//界面出现时候的回调
aboutToAppear(){}
//界面销毁时候的回调
aboutToDisappear(){}

import router from '@ohos.router'
@Entry
@Component
@Preview
struct Index {aboutToAppear(){console.log("马超","aboutToAppear")}aboutToDisappear(){console.log("马超","aboutToDisappear")}onPageShow(){console.log("马超","onPageShow")}onPageHide(){console.log("马超","onPageHide")}build() {Column({ space: 20 }) {Button('界面跳转').onClick(()=>{//界面跳转,router.pushUrl({url:'pages/GoodsPages'})})}.justifyContent(FlexAlign.Center).height('100%').width('100%')}
}

启动app时候的打印

06-09 16:53:36.367 20540-974/? I 0FEFE/JsApp: 马超 aboutToAppear
06-09 16:53:36.368 20540-974/? I 0FEFE/JsApp: 马超 onPageShow

屏幕息屏的时候调用

06-09 16:54:06.228 20540-974/com.example.myapplication I 0FEFE/JsApp: 马超 onPageHide

pushUrl时候的跳转

06-09 16:55:12.002 20540-974/com.example.myapplication I 0FEFE/JsApp: 马超 onPageHide

replaceUrl时候的跳转

06-09 16:56:29.723 22798-1042/com.example.myapplication I 0FEFE/JsApp: 马超 aboutToDisappear

退出app时候的跳转

06-09 16:56:29.723 22798-1042/com.example.myapplication I 0FEFE/JsApp: 马超 aboutToDisappear

只有@Component修饰而没有@Entry修饰的组件只有下面两个方法

  aboutToAppear(){console.log("马超","aboutToAppear")}aboutToDisappear(){console.log("马超","aboutToDisappear")}```
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/394fdc2d4ecb4f7f933328cd3fae3cfb.png)

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

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

相关文章

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(五)---- 操作系统的组织结构(OS design)

系列文章目录 操作系统入门系列-MIT6.S081(操作系统)学习笔记(一)---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建&#x…

【机器人和人工智能——自主巡航赛项】进阶篇

文章目录 案例要求创建地图rviz仿真 保存地图坐标点定位识别训练主逻辑理解语音播报模块匹配二维码识别多点导航讲解视频其余篇章 案例要求 创建地图 ./1-gmapping.sh 把多个launch文件融合在sh文件里面 rviz仿真 rviz是rose集成的可视化界面,查看机器人的各项数…

CPP初级:模板的运用!

目录 一.泛型编程 二.函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 三.函数模板的实例化 1.隐式实例化 2.显式实例化 3.模板参数的匹配原则 四.类模板 1.类模板的定义格式 2.类模板的实例化 一.泛型编程 泛型编程:编写与类型无关的通用代码…

vs2019 c++20规范 全局函数 ref 及模板类 reference_wrapper<_Ty> 的源码分析

这是个引用&#xff0c;可以包裹一个对象&#xff0c;相当于引用该对象&#xff0c;而不是在作为函数形参时产生值传递。因为模板 reference_wrapper<_Ty> 其实是封装了该对象的地址。下面以图示形式给出其重要的成员函数。模板其实都差不多&#xff0c;跟人也一样&#…

Linux | buildrootfs 添加mkfs.ext3/mkfs.ext4 支持

因个人需要&#xff0c;mkfs.ext3 但是项目中还没有这个命令 所以琢磨了半天 这里将其小记一下 在buildrootfsz中&#xff0c;需要将e2fsprogs 勾选上然后重新编译就好了 make menuconfig Target packages-> Filesystem and flash utilities-> e2fsprogs

JVMの静、动态绑定异常捕获JIT即时编译

在说明静态绑定和动态绑定之前&#xff0c;我们首先要了解在字节码指令的层面&#xff0c;JVM是如何调用方法的&#xff1a; 例如我有以下的代码&#xff0c;很简单就是在main方法中调用了另一个静态方法&#xff1a; public class MethodTest {public static void main(Strin…

论文阅读——MIRNet

项目地址&#xff1a; GitHub - swz30/MIRNet: [ECCV 2020] Learning Enriched Features for Real Image Restoration and Enhancement. SOTA results for image denoising, super-resolution, and image enhancement.GitHub - soumik12345/MIRNet: Tensorflow implementation…

数据库(29)——子查询

概念 SQL语句中嵌套SELECT语句&#xff0c;称为嵌套查询&#xff0c;又称子查询。 SELECT * FROM t1 WHERE column1 (SELECT column1 FROM t2); 子查询外部语句可以是INSERT/UPDATE/DELETE/SELECT的任何一个。 标量子查询 子查询返回的结果是单个值&#xff08;数字&#xff…

电子设计入门教程硬件篇之集成电路IC(二)

前言&#xff1a;本文为手把手教学的电子设计入门教程硬件类的博客&#xff0c;该博客侧重针对电子设计中的硬件电路进行介绍。本篇博客将根据电子设计实战中的情况去详细讲解集成电路IC&#xff0c;这些集成电路IC包括&#xff1a;逻辑门芯片、运算放大器与电子零件。电子设计…

31、matlab卷积运算:卷积运算、二维卷积、N维卷积

1、conv 卷积和多项式乘法 语法 语法1&#xff1a;w conv(u,v) 返回向量 u 和 v 的卷积。 语法2&#xff1a;w conv(u,v,shape) 返回如 shape 指定的卷积的分段。 参数 u,v — 输入向量 shape — 卷积的分段 full (默认) | same | valid full&#xff1a;全卷积 ‘same…

UnityXR Interaction Toolkit 如何使用XRHand手部识别

前言 Unity的XR Interaction Toolkit是一个强大的框架,允许开发者快速构建沉浸式的VR和AR体验。随着虚拟现实技术的发展,手部追踪成为了提升用户交互体验的关键技术之一。 本文将介绍如何在Unity中使用XR Interaction Toolkit实现手部识别功能。 准备工作 在开始之前,请…

统信UOS1070上配置文件管理器默认属性01

原文链接&#xff1a;统信UOS 1070上配置文件管理器默认属性01 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在统信UOS 1070上配置文件管理器默认属性的文章。文件管理器是我们日常操作系统使用中非常重要的工具&#xff0c;了解如何配置其默认属性可以极大地…

apache poi 插入“下一页分节符”并设置下一节纸张横向的一种方法

一、需求描述 我们知道&#xff0c;有时在word中需要同时存在不同的节&#xff0c;部分页面需要竖向、部分页面需要横向。本文就是用java调用apache poi来实现用代码生成上述效果。下图是本文实现的效果&#xff0c;供各位看官查阅&#xff0c;本文以一篇课文为例&#xff0c;…

Linux系统推出VB6开发IDE了?Gambas,Linux脚本编写

第一个Linux程序&#xff0c;加法计算加弹窗对话框,Gambas,linux版的类似VB6的IDE开发环境 一开始想用VB6的Clng函数转成整数&#xff0c;没这函数。 输入3个字母才有智能提示&#xff0c;这点没做好 没有msgbox函数&#xff0c;要用messagebox.warning 如果可以添加函数别名就…

[书生·浦语大模型实战营]——第六节 Lagent AgentLego 智能体应用搭建

1. 概述和前期准备 1.1 Lagent是什么 Lagent 是一个轻量级开源智能体框架&#xff0c;旨在让用户可以高效地构建基于大语言模型的智能体。同时它也提供了一些典型工具以增强大语言模型的能力。 Lagent 目前已经支持了包括 AutoGPT、ReAct 等在内的多个经典智能体范式&#x…

通过双模式对抗提示越狱视觉语言模型

最近&#xff0c;将视觉整合到大型语言模型&#xff08;LLMs&#xff09;中的兴趣显著增加&#xff0c;催生了大型视觉语言模型&#xff08;LVLMs&#xff09;。这些模型结合了视觉和文本信息&#xff0c;如LLaVA和Gemini&#xff0c;已经在包括图像字幕、视觉问题回答和图像检…

论文阅读:All-In-One Image Restoration for Unknown Corruption

发表时间&#xff1a;2022 cvpr 论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2022/papers/Li_All-in-One_Image_Restoration_for_Unknown_Corruption_CVPR_2022_paper.pdf 项目地址&#xff1a;https://github.com/XLearning-SCU/2022-CVPR-AirNet 代码解读…

c++中, 直接写浮点数, 是float 还是 double?

如果直接一个浮点数, 那么他默认是float还是double呢? 测试用例 #include <iostream> using namespace std;int main() {auto x 0.2;float f 0.2;double d 0.2;cout << "x Size : " << sizeof(x) << " bytes" << endl…

vue28:组件化开发和根组件

简单写个点击事件 <template> <div class"app"><div class"box" click"fn"></div></div> </template><script> export default {//导出当前组件的配置项//里面可以提供 data methods computed wat…

AtCoder Beginner Contest 356 G. Freestyle(凸包+二分)

题目 思路来源 quality代码 题解 对n个泳姿点(ai,bi)建凸包&#xff0c;实际上是一个上凸壳&#xff0c; 对于询问(ci,di)来说&#xff0c;抽象画一下这个图&#xff0c;箭头方向表示询问向量 按x轴排增序&#xff0c;并且使得后面的y不小于前面的y&#xff0c;因为总可以多…