HarmonyOS系统开发ArkTS入门案例及组件

news2024/11/16 19:54:52

目录

一、声明式UI

二、ArkTs 快速入门案例

三、组件

四、渲染控制


一、声明式UI

  声明式UI就是一种编写用户界面的范式或方式、
  ArArkTS 在继承了Typescript语法的基础上,主要扩展了声明式UI开发相关的能力。
  声明式UI开发范式大致流程:定义页面状态、描述页面效果、改变状态

1、定义页面状态
   分析和定义页面的各种状态,声明状态变量表示不同的状态。如显示开灯关灯状态
   @State isOn:boolean =false; //默认关灯   
   @State 表示是状态变量,只有状态变量修改,页面才会更新。   
   
2、描述界面显示效果
   描述界面在不同状态下的显示效果,如开灯效果和关灯效果
   关灯显示关灯照片
   开灯显示开灯照片


3、改变状态
   点击按钮改变状态,如开灯状态和关灯状态
   点击关灯isOn:boolean =false,显示关灯照片
   点击开灯isOn:boolean =true ,显示开灯照片
   

二、ArkTs 快速入门案例


    @Entry
    @Component
    struct LightPage {
      @State isOn: boolean = false;
      build() {
        Column({ space: 20 }) {
          if (this.isOn) {
            Image('pages/helloworld/light/solution/images/img_light.png')
              .height(300)
              .width(300)
              .borderRadius(20)
          } else {
            Image('pages/helloworld/light/solution/images/img_dark.png')
              .height(300)
              .width(300)
              .borderRadius(20)
          }
          Row({ space: 50 }) {
            Button('关灯')
              .onClick(() => {
                this.isOn = false
              })
            Button('开灯')
              .onClick(() => {
                this.isOn = true;
              })
          }
        }
        .height('100%')
        .width('100%')
        .justifyContent(FlexAlign.Center)
      }
    }

三、组件

1、声明式组件
    组件由 组件名称、组件参数、组件属性方法、组件事件方法、子组件组成。
    组件名称(组件参数){ 子组件 }.组件属性方法().组件属性方法().组件事件方法
    ============================================================

      组件 Button

      Button({ type: ButtonType.Circle }) {
        子组件
        Image('pages/light/images/img_light.png')
          .width(25)
          .height(25)
      }
      .witdh(50)
      .height(50)
      .backgroundColor(Color.Red)
      .onclick(() => {
        console.log('创建组件 onclick 测试');
      })

组件案例
===============================================================

  @Entry
      @Component
      struct Index {
        @State isOn: boolean = false;
        @State isDel: boolean = false;
      
        build() {
          Column({ space: 10 }) {
            if (this.isDel) {
              Image('pages/delete/images/man.jpg').width(300).height(300);
            } else {
              Image('pages/delete/images/girl.jpg').width(300).height(300);
            }
            Row({ space: 20 }) {
              Button('还原')
                .onClick(() => {
                  this.isDel = false;
                });
              Button() {
                Image('pages/delete/images/ic_delete.png')
                  .width(25).height(25)
              }
              .type(ButtonType.Circle)
              .width(50).height(50).backgroundColor(Color.Red)
              .onClick(() => {
                this.isDel = true;
              });
            }
          }
          .width('100%')
          .height("100%")
          .justifyContent(FlexAlign.Center)
      
        }
      }

      
2、自定义组件
   提高代码复用性
   @Component 装饰器:装饰 struct 关键字声明的数据结构
   @Entry 装饰器:标识该组件为组件树的根节点,也就是一个页面入口组件
   struct:ArkTS用于自定义组件或者自定义定义弹窗的关键字,与结构类相似
   build() build() 用于声明自定义组件的UI结构
   组件属性:定义组件的属性

自定义组件案例
============================================================
    SwitchButton.ets文件:

    @Component
    export struct SwitchButton {
      color: Color = Color.Blue
    
      build() {
        Button() {
          Image('pages/on_off/images/icon_switch.png')
            .width(25).height(25)
        }
        .type(ButtonType.Circle)
        .width(50)
        .height(50)
        .backgroundColor(this.color)
      }
    }

   ============================================================
    on_off.etc文件:  

  import { SwitchButton } from './SwitchButton';
    @Entry
    @Component
    struct on_off {
      @State isOn: boolean = false;
      @State isDel: boolean = false;
    
      build() {
        Column({ space: 30 }) {
          if (this.isDel) {
            Image('pages/on_off/images/man.jpg').width(300).height(300);
          } else {
            Image('pages/on_off/images/girl.jpg').width(300).height(300);
          }
          Row({ space: 30 }) {
            SwitchButton({ color: Color.Green })
              .onClick(() => {
                this.isDel = false;
              });
    
            SwitchButton({ color: Color.Red })
              .onClick(() => {
                this.isDel = true;
              });
          }
        }
        .width('100%')
        .height("100%")
        .justifyContent(FlexAlign.Center)
    
      }
    }

   

四、渲染控制


if...else  和 Foreach循环


if...else案例    =========================================================================
    PlayButton.ets文件:
    ---------------------

    @Component
    export struct PlayButton {
      color: Color = Color.White;
      isShow: boolean = true;
      build() {
        Button() {
          Image('pages/condition/images/' + (this.isShow ? "ic_play.png" : "ic_pause.png"))
            .width(50).height(50)
        }
        .width(100)
        .height(100)
        .backgroundColor(this.color)
      }
    }

    paly.ets文件:
    ---------------------

    import { PlayButton } from './playButton';
    
    @Entry
    @Component
    struct Play {
      @State isRunning: boolean = true;
    
      build() {
        Column({ space: 10 }) {
          if (this.isRunning) {
            Image('pages/condition/images/girl.jpg').width(300).height(300);
          } else {
            Image('pages/condition/images/man.jpg').width(300).height(300);
          }
    
          Row() {
            if (this.isRunning) {
              PlayButton({ isShow: this.isRunning })
                .onClick(() => {
                  this.isRunning = false;
                })
            }else {
              PlayButton({ isShow: this.isRunning })
                .onClick(() => {
                  this.isRunning = true;
                })
            }
          }
        }
        .width('100%')
        .height("100%")
        .justifyContent(FlexAlign.Center)
      }
    }

    Foreach循环案例  
    =======================================================================================
    FruitButton.ets文件:
    ---------------------

    @Component
    export struct PlayButton {
      color: Color = Color.White;
      isShow: boolean = true;
      build() {
        Button() {
          Image('pages/condition/images/' + (this.isShow ? "ic_play.png" : "ic_pause.png"))
            .width(50).height(50)
        }
        .width(100)
        .height(100)
        .backgroundColor(this.color)
      }
    }


    
    fruit.ets文件:
    ---------------------
 

   import { PlayButton } from './playButton';
    
    @Entry
    @Component
    struct Fruit {
      @State options: string[] = ['桃子', '苹果', '香蕉', '香梨', '荔枝'];
      @State answer: string = '_______?';
      @State color: Color = Color.Black;
      @State fontSize: number = 25;
    
      build() {
        Column({ space: 23 }) {
          Row({ space: 15 }) {
            Text('你最喜欢的水果是')
              .fontColor(Color.Black)
              .fontSize(25)
              .fontWeight(FontWeight.Bold)
            Text(this.answer)
              .fontColor(this.color)
              .fontSize(this.fontSize)
              .fontWeight(FontWeight.Bold)
          }
    
          ForEach(this.options, (item: string) => {
            Column({ space: 40 }) {
              Button(item)
                .fontSize(32)
                .width(180)
                .height(90)
                .backgroundColor(Color.Orange)
                .onClick(() => {
                  this.answer = item;
                  this.color = Color.Red;
                  this.fontSize=44;
                })
            }
    
          })
        }
        .width('100%')
        .height("100%")
        .justifyContent(FlexAlign.Center)
      }
    }


    
    
    

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

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

相关文章

IPv4到IPv6的过渡策略

IPv4到IPv6的过渡是一个复杂且必要的过程,随着全球互联网的不断发展,IPv4地址资源的枯竭使得向IPv6过渡成为一项紧迫的任务。IPv6提供了更广阔的地址空间、更高的安全性和更灵活的路由方式,是未来互联网发展的必然趋势。下面将详细阐述如何从…

面向对象【内部类】

什么是内部类 将一个类 A 定义在另一个类 B 里面,里面的那个类 A 就称为内部类(InnerClass),类 B 则称为外部类(OuterClass) 为什么要声明内部类 具体来说,当一个事物 A 的内部,还…

基于SpringBoot的后勤管理系统【附源码】

后勤管理系统开发说明 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myecli…

LLM 面试知识点——模型基础知识

1、主流架构 目前LLM(Large Language Model)主流结构包括三种范式,分别为Encoder-Decoder、Causal Decoder、Prefix Decode。对应的网络整体结构和Attention掩码如下图。 、 各自特点、优缺点如下: 1)Encoder-Decoder 结构特点:输入双向注意力,输出单向注意力。 代表…

【C语言】linux内核pci_save_state

一、中文注释 //include\linux\pci.h /* 电源管理相关的例程 */ int pci_save_state(struct pci_dev *dev);//drivers\pci\pci.c /*** pci_save_state - 在挂起前保存PCI设备的配置空间* dev: - 我们正在处理的PCI设备*/ int pci_save_state(struct pci_dev *dev) {int i;/* X…

HTML + CSS 核心知识点- 定位

简述: 补充固定定位也会脱离文档流、不会占据原先位置 1、什么是文档流 文档流是指HTML文档中元素排列的规律和顺序。在网页中,元素按照其在HTML文档中出现的顺序依次排列,这种排列方式被称为文档流。文档流决定了元素在页面上的位置和互相之…

基于Spring Boot的美食分享系统设计与实现

摘 要 美食分享管理,其工作流程繁杂、多样、管理复杂与设备维护繁琐。而计算机已完全能够胜任美食分享管理工作,而且更加准确、方便、快捷、高效、清晰、透明,它完全可以克服以上所述的不足之处。这将给查询信息和管理带来很大的方便&#x…

PHP<=7.4.21 Development Server源码泄露漏洞 例题

打开题目 dirsearch扫描发现存在shell.php 非预期解 访问shell.php&#xff0c;往下翻直接就看到了flag.. 正常解法 访问shell.php 看见php的版本是7.3.33 我们知道 PHP<7.4.21时通过php -S开起的WEB服务器存在源码泄露漏洞&#xff0c;可以将PHP文件作为静态文件直接输…

万界星空科技WMS仓储管理包含哪些具体内容?

wms仓库管理是通过入库业务、出库业务、仓库调拨、库存调拨和虚仓管理等功能&#xff0c;综合批次管理、物料对应、库存盘点、质检管理、虚仓管理和即时库存管理等功能综合运用的管理系统&#xff0c;有效控制并跟踪仓库业务的物流和成本管理全过程&#xff0c;实现完善的企业仓…

面试笔记——Redis(缓存击穿、缓存雪崩)

缓存击穿 缓存击穿&#xff08;Cache Breakdown&#xff09;&#xff1a; 当某个缓存键的缓存失效时&#xff08;如&#xff0c;过期时间&#xff09;&#xff0c;同时有大量的请求到达&#xff0c;并且这些请求都需要获取相同的数据&#xff0c;这些请求会同时绕过缓存系统&a…

寻找可能认识的人

给一个命名为&#xff1a;friend.txt的文件 其中每一行中给出两个名字&#xff0c;中间用空格分开。&#xff08;下图为文件内容&#xff09; 题目&#xff1a;《查找出可能认识的人 》 代码如下&#xff1a; RelationMapper&#xff1a; package com.fesco.friend;import or…

C 练习实例77-指向指针的指针-二维数组

关于数组的一些操作 #include<stdio.h> #include<stdio.h> void fun(int b[],int length) {for(int i0;i<length;i){printf("%d ",b[i]);}printf("\n");for(int i0;i<length;i){ //数组作为形参传递&#xff0c;传递的是指针&#xff0…

做跨境用哪种代理IP比较好?

代理IP对于做跨境的小伙伴来说&#xff0c;都是必不可少的工具&#xff0c;目前出海的玩法已经是多种多样&#xff0c;开店、账号注册、短视频运营、直播带货、网站SEO等等都是跨境人需要涉及到的业务。而国外代理IP的获取渠道非常多&#xff0c;那么做跨境到底应该用哪种代理I…

onnx 格式模型可视化工具

onnx 格式模型可视化工具 0. 引言1. 可视化工具2. 安装 Netron: Viewer for ONNX models 0. 引言 ONNX 是一种开放格式&#xff0c;用于表示机器学习模型。ONNX 定义了一组通用运算符&#xff08;机器学习和深度学习模型的构建基块&#xff09;和通用文件格式&#xff0c;使 A…

R语言绘图 | 带标签的火火火火火火火山图 | 标记感兴趣基因 | 代码注释 + 结果解读

在火山图中&#xff0c;我们有时候会想要标注出自己感兴趣的基因&#xff0c;这个时候该怎么嘞&#xff01; 还有还有&#xff0c;在添加标签时&#xff0c;可能会遇到元素过多或位置密集导致标签显示不全&#xff0c;或者虽然显示全了但显得密集杂乱&#xff0c;不易阅读的情况…

6.计算机网络

重要章节、考题比重大&#xff01; 主要议题&#xff1a; 1.网络分类 偶尔考 局域网&#xff1a;覆盖面较小&#xff0c;吞吐效率高&#xff0c;传输速度快&#xff0c;可靠性高&#xff1b; 广域网&#xff1a;传输距离较远&#xff0c;通过分组交换技术来实现&#xff1b…

【图论】树链剖分

本篇博客参考&#xff1a; 【洛谷日报#17】树链剖分详解Oi Wiki 树链剖分 文章目录 基本概念代码实现常见应用路径维护&#xff1a;求树上两点路径权值和路径维护&#xff1a;改变两点最短路径上的所有点的权值求最近公共祖先 基本概念 首先&#xff0c;树链剖分是什么呢&…

简单使用NSIS打包软件

NSIS是一个开源的打包工具. 官网: Download - NSIS (sourceforge.io) 使用这个编译 ​ 但是不建议使用这玩意写脚本,字体太难看了.我用vscode写的脚本,用这个编译的. ​ 写好脚本用这个软件打开, 然后选择这个编译,如果语法有错误 会编译不过,会提醒你哪一行不行,如果编译…

java的23种设计模式03-创建型模式02-抽象工厂方法

一、抽象工厂方法 1-1、抽象工厂方法的定义 抽象工厂模式是一个比较复杂的创建型模式。 抽象工厂模式和工厂方法不太一样&#xff0c;它要解决的问题比较复杂&#xff0c;不但工厂是抽象的&#xff0c;产品是抽象的&#xff0c;而且&#xff1a;有多个产品需要创建&#xff…

python中isinstance函数判断各种类型的小细节

1. 基本语法 isinstance(object, classinfo) Return true if the object argument is an instance of the classinfo argument, or of a (direct, indirect or virtual) subclass thereof. Also return true if classinfo is a type object (new-style class) and object is…