当前位置: 首页 > article >正文

HarmonyOS的@State装饰器的底层实现

HarmonyOS的@State装饰器的底层实现

  • 序言
  • 准备工作
  • 实现@State装饰器

序言

ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,进一步通过规范强化静态检查和分析,使得在程序运行之前的开发期能检测更多错误,提升代码健壮性,并实现更好的运行性能。同时,提供了声明式UI范式、状态管理支持等相应的能力,让开发者可以以更简洁、更自然的方式开发高性能应用。

准备工作

首先创建一个HTML文件,然后安装typeScript

npm i typescript -g

创建一个ts文件并在HTML文件中引入同名的js文件(这个js文件随后会通过自动编译生成),通过下面的命令创建typeScript的配置文件tsconfig.josn

tsc --init

如图:请添加图片描述
请添加图片描述
自动化编译

  1. ts默认编译的js版本是S7,我们可以手动在tsconfig.josn中将其改为ES6
    请添加图片描述

  2. 监视目录中.ts文件变化

tsc --watch

  1. 优化:当编译出错时不生成.js文件

tsc --noEmitOnError --watch

打开装饰器支持
请添加图片描述

实现@State装饰器

// 定义一个装饰器函数State,用于给类的属性添加getter和setter
function State(target: object, propertyKey: string) {
    // 定义一个私有属性,用于存储实际的属性值
    let key = `__${propertyKey}`;
    // 使用Object.defineProperty来定义属性的描述符
    Object.defineProperty(target, propertyKey, {
        // getter函数,返回私有属性的值
        get() {
            return this[key];
        },
        // setter函数,设置私有属性的值,并打印属性的新值
        set(newVal: string) {
            console.log(`${propertyKey}的最新值为:${newVal}`);
            this[key] = newVal;
        },
        // 属性是可枚举的
        enumerable: true,
        // 属性描述符是可配置的
        configurable: true,
    });
}

// 定义一个Person类,包含name和age属性
class Person {
    name: string;
    // 使用State装饰器装饰age属性
    @State age: number;
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
}

// 创建两个Person实例
const p1 = new Person('张三', 18);
const p2 = new Person('李四', 28);

// 修改p1的age属性,会触发State装饰器中的setter函数
p1.age = 30;
// 修改p2的age属性,同样会触发State装饰器中的setter函数
p2.age = 40;

// 打印p1对象,展示其属性值
console.log(p1);

http://www.kler.cn/a/393345.html

相关文章:

  • 三维测量与建模笔记 - 特征提取与匹配 - 4.2 梯度算子、Canny边缘检测、霍夫变换直线检测
  • 微擎框架php7.4使用phpexcel导出数据报错修复
  • ctfshow-web入门-SSTI(web361-web368)上
  • AMD CPU下pytorch 多GPU运行卡死和死锁解决
  • ArcGIS Pro属性表乱码与字段名3个汉字解决方案大总结
  • 《情商》提升:增强自我意识,学会与情绪共处
  • elasticsearch实战应用理论实践!2W字带你全部了解elasticsearch
  • UNIX 域套接字
  • 【3D Slicer】的小白入门使用指南四
  • AIoT的协同计算
  • 解锁数据世界:从基础到精通的数据库探索之旅
  • Unity URP自定义后处理系统
  • SQL:给数据表字段拼接字符串
  • HarmonyOS和OpenHarmony区别是什么?鸿蒙和安卓IOS的区别是什么?
  • 除了防盗,特力康智能窨井盖还能监测井下环境吗?具体都监测些什么?
  • A029-基于Spring Boot的物流管理系统的设计与实现
  • 【Chapter 3】Machine Learning Classification Case_Prediction of diabetes-XGBoost
  • AI写作(四)预训练语言模型:开启 AI 写作新时代(4/10)
  • docker desktop es windows解决vm.max_map_count [65530] is too low 问题
  • CSS: Clearing Floats with Overflow
  • vue3项目初始化完整流程,vue3+TypeScript+vue-router+pinia+element-plus+axios+unocss+mock
  • SQL 外连接
  • 【go从零单排】Regular Expressions正则表达式
  • 【秋招笔试-支持在线评测】11.13花子秋招(已改编)-三语言题解
  • Elasticsearch专栏-4.es基本用法-查询api
  • 【软件测试】白盒、黑盒、灰盒测试,按照测试阶段分类