当前位置:   article > 正文

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

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

下一章

目录

一、声明式UI

二、ArkTs 快速入门案例

三、组件

四、渲染控制


一、声明式UI

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

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


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

二、ArkTs 快速入门案例

  1.     @Entry
  2.     @Component
  3.     struct LightPage {
  4.       @State isOn: boolean = false;
  5.       build() {
  6.         Column({ space: 20 }) {
  7.           if (this.isOn) {
  8.             Image('pages/helloworld/light/solution/images/img_light.png')
  9.               .height(300)
  10.               .width(300)
  11.               .borderRadius(20)
  12.           } else {
  13.             Image('pages/helloworld/light/solution/images/img_dark.png')
  14.               .height(300)
  15.               .width(300)
  16.               .borderRadius(20)
  17.           }
  18.           Row({ space: 50 }) {
  19.             Button('关灯')
  20.               .onClick(() => {
  21.                 this.isOn = false
  22.               })
  23.             Button('开灯')
  24.               .onClick(() => {
  25.                 this.isOn = true;
  26.               })
  27.           }
  28.         }
  29.         .height('100%')
  30.         .width('100%')
  31.         .justifyContent(FlexAlign.Center)
  32.       }
  33.     }

三、组件

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

  1.       组件 Button
  2. Button({ type: ButtonType.Circle }) {
  3.         子组件
  4.         Image('pages/light/images/img_light.png')
  5.           .width(25)
  6.           .height(25)
  7.       }
  8.       .witdh(50)
  9.       .height(50)
  10.       .backgroundColor(Color.Red)
  11.       .onclick(() => {
  12.         console.log('创建组件 onclick 测试');
  13.       })

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

  1.   @Entry
  2.       @Component
  3.       struct Index {
  4.         @State isOn: boolean = false;
  5.         @State isDel: boolean = false;
  6.       
  7.         build() {
  8.           Column({ space: 10 }) {
  9.             if (this.isDel) {
  10.               Image('pages/delete/images/man.jpg').width(300).height(300);
  11.             } else {
  12.               Image('pages/delete/images/girl.jpg').width(300).height(300);
  13.             }
  14.             Row({ space: 20 }) {
  15.               Button('还原')
  16.                 .onClick(() => {
  17.                   this.isDel = false;
  18.                 });
  19.               Button() {
  20.                 Image('pages/delete/images/ic_delete.png')
  21.                   .width(25).height(25)
  22.               }
  23.               .type(ButtonType.Circle)
  24.               .width(50).height(50).backgroundColor(Color.Red)
  25.               .onClick(() => {
  26.                 this.isDel = true;
  27.               });
  28.             }
  29.           }
  30.           .width('100%')
  31.           .height("100%")
  32.           .justifyContent(FlexAlign.Center)
  33.       
  34.         }
  35.       }

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

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

  1.     @Component
  2.     export struct SwitchButton {
  3.       color: Color = Color.Blue
  4.     
  5.       build() {
  6.         Button() {
  7.           Image('pages/on_off/images/icon_switch.png')
  8.             .width(25).height(25)
  9.         }
  10.         .type(ButtonType.Circle)
  11.         .width(50)
  12.         .height(50)
  13.         .backgroundColor(this.color)
  14.       }
  15.     }

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

  1.   import { SwitchButton } from './SwitchButton';
  2.     @Entry
  3.     @Component
  4.     struct on_off {
  5.       @State isOn: boolean = false;
  6.       @State isDel: boolean = false;
  7.     
  8.       build() {
  9.         Column({ space: 30 }) {
  10.           if (this.isDel) {
  11.             Image('pages/on_off/images/man.jpg').width(300).height(300);
  12.           } else {
  13.             Image('pages/on_off/images/girl.jpg').width(300).height(300);
  14.           }
  15.           Row({ space: 30 }) {
  16.             SwitchButton({ color: Color.Green })
  17.               .onClick(() => {
  18.                 this.isDel = false;
  19.               });
  20.     
  21.             SwitchButton({ color: Color.Red })
  22.               .onClick(() => {
  23.                 this.isDel = true;
  24.               });
  25.           }
  26.         }
  27.         .width('100%')
  28.         .height("100%")
  29.         .justifyContent(FlexAlign.Center)
  30.     
  31.       }
  32.     }

   

四、渲染控制


if...else  和 Foreach循环


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

  1.     @Component
  2.     export struct PlayButton {
  3.       color: Color = Color.White;
  4.       isShow: boolean = true;
  5.       build() {
  6.         Button() {
  7.           Image('pages/condition/images/' + (this.isShow ? "ic_play.png" : "ic_pause.png"))
  8.             .width(50).height(50)
  9.         }
  10.         .width(100)
  11.         .height(100)
  12.         .backgroundColor(this.color)
  13.       }
  14.     }

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

  1.     import { PlayButton } from './playButton';
  2.     
  3.     @Entry
  4.     @Component
  5.     struct Play {
  6.       @State isRunning: boolean = true;
  7.     
  8.       build() {
  9.         Column({ space: 10 }) {
  10.           if (this.isRunning) {
  11.             Image('pages/condition/images/girl.jpg').width(300).height(300);
  12.           } else {
  13.             Image('pages/condition/images/man.jpg').width(300).height(300);
  14.           }
  15.     
  16.           Row() {
  17.             if (this.isRunning) {
  18.               PlayButton({ isShow: this.isRunning })
  19.                 .onClick(() => {
  20.                   this.isRunning = false;
  21.                 })
  22.             }else {
  23.               PlayButton({ isShow: this.isRunning })
  24.                 .onClick(() => {
  25.                   this.isRunning = true;
  26.                 })
  27.             }
  28.           }
  29.         }
  30.         .width('100%')
  31.         .height("100%")
  32.         .justifyContent(FlexAlign.Center)
  33.       }
  34.     }

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

  1.     @Component
  2.     export struct PlayButton {
  3.       color: Color = Color.White;
  4.       isShow: boolean = true;
  5.       build() {
  6.         Button() {
  7.           Image('pages/condition/images/' + (this.isShow ? "ic_play.png" : "ic_pause.png"))
  8.             .width(50).height(50)
  9.         }
  10.         .width(100)
  11.         .height(100)
  12.         .backgroundColor(this.color)
  13.       }
  14.     }


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

  1.   import { PlayButton } from './playButton';
  2.     
  3.     @Entry
  4.     @Component
  5.     struct Fruit {
  6.       @State options: string[] = ['桃子', '苹果', '香蕉', '香梨', '荔枝'];
  7.       @State answer: string = '_______?';
  8.       @State color: Color = Color.Black;
  9.       @State fontSize: number = 25;
  10.     
  11.       build() {
  12.         Column({ space: 23 }) {
  13.           Row({ space: 15 }) {
  14.             Text('你最喜欢的水果是')
  15.               .fontColor(Color.Black)
  16.               .fontSize(25)
  17.               .fontWeight(FontWeight.Bold)
  18.             Text(this.answer)
  19.               .fontColor(this.color)
  20.               .fontSize(this.fontSize)
  21.               .fontWeight(FontWeight.Bold)
  22.           }
  23.     
  24.           ForEach(this.options, (item: string) => {
  25.             Column({ space: 40 }) {
  26.               Button(item)
  27.                 .fontSize(32)
  28.                 .width(180)
  29.                 .height(90)
  30.                 .backgroundColor(Color.Orange)
  31.                 .onClick(() => {
  32.                   this.answer = item;
  33.                   this.color = Color.Red;
  34.                   this.fontSize=44;
  35.                 })
  36.             }
  37.     
  38.           })
  39.         }
  40.         .width('100%')
  41.         .height("100%")
  42.         .justifyContent(FlexAlign.Center)
  43.       }
  44.     }


    
    
    

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/273756
推荐阅读
相关标签
  

闽ICP备14008679号