鸿蒙组件

一、组件基础

1.1 什么是ArkTS

  ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。
  误区: 前端同学,原有的DOM/WebAPI在这里皆不存在 ,如:document.querySelector/window.location
ArtTS绝不是TS:

  • TS在前端中虽然有类型约束,但是他会编译成js去运行
  • ArtTS编译后直接映射字节码-编译过程带类型

ArkTS采用声明式UI的方法来绘制页面,设置属性,绑定事件

1.2 组件结构

UI组件结构

1.2.1 struct-自定义组件

  自定义组件必须使用struct关键字来声明(注意不能有继承关系-组件名不能系统组件名重名
语法: struct 组件名 {}
注:struct关键字声明的UI描述-必须被@Component或者@CustomDialog修饰

1.2.2 Component修饰符

  Component装饰器只能修饰struct关键字声明的结构,被修饰后的struct具备组件的描述(渲染)能力

1.2.3 build函数

  • 用于定义组件的UI描述,一个struct结构必须实现build函数
  • build函数可以没有内容,如果有的话,必须有且只有一个容器组件(可以放置子组件的组件)(只有被entry装饰里面有限制)
  • 常见容器组件-:Flex、Column、Row、List、Grid、Panel、Button

1.2.4 entry修饰符

  entry将自定义组件定义为UI页面的入口,最多可以使用entry装饰一个自定义组件(在一个ets文件中)
  entry修饰的组件,最终会被注册,具体文件位置:main/resources/base/profile/main_pages.json

a、自动注册-新建组件时,采用新建Page的方式
b、手动注册-新建一个ets文件,自己在main_pages.json中手动添加路径

  注意:如果你手动删除了某一个带entry的组件,你需要手动去main_page中去删除该路径,否则编译会报错

1.2.5总结

  • 一个UI描述必须使用struct来声明,不能继承
  • struct必须被Component或者CustomDialog修饰
  • struct必须实现build方法,build方法可以没有元素,但是有的话有且只有一个可容纳子组件的容器组件(entry修饰的组件)
  • entry修饰符表示该组件是页面级组件,一个文件中只允许修饰一个struct组件
  • 采用分拆组件的形式可以有效解解耦我们的业务

1.3 系统组件(ArkUI)

  1. 常用组件:
    Text 文本组件-(只能放Span子组件)
Text() {
  Span('$$')
    .fontSize(12)
  Span('2.5')
    .fontSize(18)
}

Column 列组件,纵向排列,Flex布局主轴是Y (任意子组件)
Row 行组件,横向向排列,Flex布局主轴是X (任意子组件)
Flex 以弹性方式布局子组件的容器组件。(存在二次布局,官方推荐有性能要求,使用Column和Row代替) (任意子组件)
Button 按钮组件 (单子组件)
TextInput 输入框组件 (无子组件)
Image (无子组件)
Button (单个子组件)
List (限制ListItem子组件)
Scroll (限制单个子组件)

  1. 使用组件
    使用组件采用 组件名()的语法
    有构造参数采用 组件名(参数)的语法
    组件里放置子组件采用组件名() { 子组件的语法 }的链式语法
    组件设置属性采用组件名().width().height()的语法
    组件又有属性又有子组件采用组件名(){ ... 子组件 }.width().height()的语法

  在arkUI中,我们的内容如果超过了屏幕显示,则不会显示滚动条,需要使用Scroll来包裹
  需要注意的是: 该组件滚动的前提是主轴方向大小小于内容大小。子组件不要设置高度,否则不能滚动

1.4 组件事件

  监听原生组件的事件和设置属性的方式是一样的都是链式调用,值得注意的是,我们注册事件都要使用箭头函数的写法,Next版本会有对于匿名函数function的限制
function test() {} const test = () => {}
  请注意:在注册事件中的逻辑务必使用箭头函数 () => {}极不推荐 function() {}

a、因为function中this指向为undefind
b、Next下一代不再支持funtion匿名函数声明
c、箭头函数中的this指向当前struct实例,可以方便的调用方法和获取属性

public和private关键字
  如果不写或者写public 表示该属性可被外界即父组件赋值,如果写private表示该属性只会被该组件的this获取
  当我们事件处理逻辑比较复杂,写在UI描述中无法抽提的时候,我们可以在struct结构体中定义;当我们需要在组件中记录一些状态时,变量应该显示的在struct中声明;

struct EventCase {
  @State account:string = ""
  @State password:string = ""
  getBtnState():boolean {
    return this.account !== "" && this.password !== ""
  }
}

说明:promptAction和AlertDailog都可以弹出提示 promptAction需要引入包,AlertDialog不需要引入就可以直接使用

1.5 组件状态

  @State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。
  加上该@State修饰符后,当数据发生改变,造成了build的重新执行,来保证我们状态的变化。
State修饰的类型:

  • Object、class、string、number、boolean、enum类型,以及这些类型的数组
  • 类型必须被指定
  • 不支持any,不支持简单类型和复杂类型的联合类型,不允许使用undefined和null

css知识点:
  layoutWeight(1),表示占父容器剩余宽度的百分比
class是ArkTS主推的定义对象类型的形式,interface/type也可以用,但是有限制

class User {
  name: string
  age: number
  address: {
    province: string
    city: string
    area: string
  }
}

State修饰符声明的数据,只能监听到第一层的数据变化,如果发现第二层变化-不会触发UI更新

@State
user: 类型 = {
  a: {
    b: '1323'
  }
}
this.user.a = { ...this.user.a, b: '456'  }

css知识点:
  layoutWeight(1),表示占父容器剩余宽度的百分比
TS知识点:整数和字符串互转
  toString():整数转字符串; parseInt(value):强转整数
结构赋值只支持单层赋值并引起UI更新,第二层不支持,所以使用延展属性...

  1. this.user.address = { ...this.user.address, province: value }
    {...}:表示前端的浅拷贝,先将前端的属性赋值给一个对象,再改变其中一个值
  2. this.user.address.province = value
    this.user = {...this.user}

总结:
修饰符:

@Entry(页面级组件)
@Component
struct Index {
  @State    // 响应式数据 数据变化 => UI更新
  build() {
    // 可以没有内容
    // 被entry修饰的组件 如果只放一个组件- 这个组件应该是一个容器组件- 不能同时放两个
  }
}

  State修饰符声明的数据,只能监听到第一层的数据变化,如果发现第二层变化-不会触发UI更新

@State
user: 类型 = {
  a: {
    b: '1323'
  }
}
this.user.a = { ...this.user.a, b: '456'  }

@state count:number = 5; // number为TS的类型注解

timer:number = -1; // 声明一个timer的标记,初始值-1代表定时器不存在,setInterval返回的值大于0
this.timer = setInterval( () => {
}, 1000)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352