鸿蒙开发笔记

115 阅读3分钟

编辑器操作

  • 自动导包:鼠标悬浮,点击弹框中的update import或者alt+shift+enter进行快速导包
  • 自动删除未使用的impot:文件右键选择optimize imports来快速清除
  • 全局搜索内容:敲击两次shift
  • 快速调取文档:随便找个函数在弹框右下角点击show in API进行快速查阅
  • 快速抽离代码:选中代码右键重构,选择抽离成方法,自动定义方法并调用

ArkTS

  • 声明:关键字+变量/常量名:类型注释 = 值
let count: number = 0;
count = 40;
const MAX_COUNT:number = 100;
  • 类型:
    • 基本类型:string、number、boolean
let name: string = 'xiaoming';
let age: number = 20;
let isMale: boolean = true;
console.log(name);
//console.log输出需要字符串类型
console.log(age.toString());
console.log(`My nae is ${name},and I am ${age} years old`);
    • 引用类型:Object、Array、自定义类
let students: Array<string> = ['Xiaoming', 'Zhangsan'];
let students: string[] =  ['Xiaoming', 'Zhangsan'];

class User {...}
let user:User = new User();
    • 枚举类型:Enum
enum Color {
    Red,
    Blue,
    Green
}
let favouriteColor: Color = Color.Red;
    • 联合类型:Union
let luckyNum: number | string = 7;
luckyNum = 'seven';
    • 类型别名:Aliases
type Matrix = number[][];
type NullableObject = Object | null;
  • 空安全:有时存在声明变量时不确定初始值。这种情况下通常使用联合类型包含null

let name: string | null = null;

    • 空安全机制的三种方式
1.使用if/else进行判断
if(name != null)
2.使用空值合并表达式,??左边的值为null或者undefined时会返回表达式右边的值
let name: string | null = null;
const res = name ?? '';
3.使用?可选链,如果是null,运算符会返回undefined
let name: string | null = 'aa';
let len = name?.length;

ArkTS支持自动类型推导,没有指定类型时,支持使用类型推断自动选择合适的类型

let meaningOfLife = 42;//会被推测为number类型

  • 函数的声明和使用:
    • function 函数名( 参数列表 ): 返回类型 { 函数体 }
    • 箭头函数/lambda表达式: (参数列表):返回类型 => { 函数体 }
    • 闭包函数:一个函数可以将另一个函数当作返回值,保留对内部作用域的访问
function outerFunc(): () => string {
    let count = 0l
    return (): string => {
        count++;
        return count.toString()
    }
}
let invoker = outerFunc();
console.log(invoker())
console.log(invoker())
  • 类的声明和使用
    • 类的声明
class Person {
    name: string = 'xiaoming';
    age: number = 20;
    isMale: boolean = true;
}
    • 类的创建
const person = new Person();
console.log(person.name);

const person: Person = { name: 'xiaoming', age: 29, isMale: true};
console.log(person.name);

class Person {
    public name: string = 'xiaoming';
    private _age: number = 20;
    isMale : boolean = true;
    
    constructor(name: string, age: number,isMale: boolean){
        this.name = name;
        this._age = age;
        this.isMale = isMale;
    }
    //私有变量通过getter和setter方法控制,通过person.age实际访问到的就是get方法
    get age(): number {
        return this._age;
    }
    set age(age:number){
        this._age = age;
    }
}
    • 多态和继承
class Emplyee extends Person {
    department: string;
    
    constructor(name: string, age: number, isMale: boolean, department: string){
        super(name, age, isMale);
        this.departmet = department;
    }
    //重写父类方法
    public printInfo(): string {
        //调用父类方法
        super.printInfo();
        console.log(`working in ${this.department}`);
    }
}
  • 接口声明和使用
interface AreaSize {
    width: number;
    height: number;
}
let area: AreaSize = { width: 100, height: 100 };

interface AreaSize {
    width: number;
    height: number;
    
    calculateAreaSize(): number;// 方法的声明
    someMethod(): void;
}

//对应有方法声明的接口,实现需要用implements
class RectangleSize implements AreaSize {
    width: number = 0;
    height: number = 0;
    
    somMethod(): void {
        console.log( 'someMethod called' );
    }
    
    calculateAreaSize(): number {
        return this.width * this.height'
    }
}
  • 模块的导入导出: export和import
  • 声明式UI
//对于需要驱动视图更新的变量,用@State定义
@State isComplete: Boolean = false;

Row() {
    if(this.isComplete) {
        Image($r('app.media.ic_ok'))
    } else {
        Image($r('app.media.ic_default'))
    }
    Text('学习ArkTS')
}
.onClick( () => {
    this.isComplete = !this.isComplete;
})
    • 自定义组件的声明
@Component   //定义为一个组件部分
struct ToDoItem {
    private content ?: string;
    ...
    build() {
    //build函数内部进行相应的声明式UI描述
        Row() {
            Image($r('app.media.ic_default'))
            ...
            Text(this.content)
        }
        .borderRadius(24)
    }
}

@Entry
@Component
struct ToDoListPage {
    ...
    build() {
        Column() {
            Text('待办')
            ...
            TodoItem({ content : '学习arkTS' })
        }
    }
}
    • 组件的生命周期
// Index.ets
import { router } from '@kit.ArkUI';

@Entry
@Component
struct MyComponent {
  @State showChild: boolean = true;
  @State btnColor:string = "#FF007DFF"

  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  onPageShow() {
    console.info('Index onPageShow');
  }
  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  onPageHide() {
    console.info('Index onPageHide');
  }

  // 只有被@Entry装饰的组件才可以调用页面的生命周期
  onBackPress() {
    console.info('Index onBackPress');
    this.btnColor ="#FFEE0606"
    return true // 返回true表示页面自己处理返回逻辑,不进行页面路由;返回false表示使用默认的路由返回逻辑,不设置返回值按照false处理
  }

  // 组件生命周期
  aboutToAppear() {
    console.info('MyComponent aboutToAppear');
  }

  // 组件生命周期
  onDidBuild() {
    console.info('MyComponent onDidBuild');
  }

  // 组件生命周期
  aboutToDisappear() {
    console.info('MyComponent aboutToDisappear');
  }

  build() {
    Column() {
      // this.showChild为true,创建Child子组件,执行Child aboutToAppear
      if (this.showChild) {
        Child()
      }
      // this.showChild为false,删除Child子组件,执行Child aboutToDisappear
      Button('delete Child')
      .margin(20)
      .backgroundColor(this.btnColor)
      .onClick(() => {
        this.showChild = false;
      })
      // push到page页面,执行onPageHide
      Button('push to next page')
        .onClick(() => {
          router.pushUrl({ url: 'pages/page' });
        })
    }

  }
}

@Component
struct Child {
  @State title: string = 'Hello World';
  // 组件生命周期
  aboutToDisappear() {
    console.info('[lifeCycle] Child aboutToDisappear')
  }

  // 组件生命周期
  onDidBuild() {
    console.info('[lifeCycle] Child onDidBuild');
  }

  // 组件生命周期
  aboutToAppear() {
    console.info('[lifeCycle] Child aboutToAppear')
  }

  build() {
    Text(this.title)
      .fontSize(50)
      .margin(20)
      .onClick(() => {
        this.title = 'Hello ArkUI';
      })
  }
}