HarmonyOS 鸿蒙Next ARKTS语言是否有反射机制 或 使用ARKTS实现工厂类动态生成自定义组件的最佳实践

发布于 1周前 作者 yibo5220 来自 鸿蒙OS

HarmonyOS 鸿蒙Next ARKTS语言是否有反射机制 或 使用ARKTS实现工厂类动态生成自定义组件的最佳实践

有这样的一个业务场景,需要根据后端返回的json内容,来生成不同的Card排列(千人千面)。 希望将不同的Card作为自定义组件,然后以一个全局的工厂类,根据后端json数据解析Card type和统一的data属性,来生成不同的Card组件。  我理想的场景是,工厂类和page页面,实现完后就不用再修改,与Card解耦,后续新增Card类只需要按照标准(比如调用工厂类的register方法)扩展即可,只要实现了Card类,就自然支持该种Card的解析,实现该场景的核心是,需要一个类似objective-c中的NSClassFromString方法,通过string找到类并生成对象。  现在因为ARKTS语言的限制,我好像必须在page中写大量的switch或者if判断,并引用所有Card组件。目前我对ARKTS还不够了解,想问下我这种场景,在鸿蒙开发里的最佳实践应该是怎样的。


更多关于HarmonyOS 鸿蒙Next ARKTS语言是否有反射机制 或 使用ARKTS实现工厂类动态生成自定义组件的最佳实践的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

当前并没有类似IOS的NSClassFromString方法来实现,尝试下面两个arkts反射的方法看看
使用动态import导入模块,然后找到要反射的类new一个对象并转为ESObject类型,然后使用ESObject类型的索引:

import('../common/TestDataCls').then(ns => {
let cls: ESObject = new ns.TestDataCls();
let p = 'name';
cls[p] = "1";
})
2、
export default class classPerson {
name: string = 'Xiaoming'

func() {
console.log('fun print')
}
}

Button().onClick(() => {
let Xiaoming = new classPerson()
Reflect.set(Xiaoming, 'key', 'value');

let val: string = Reflect.get(Xiaoming, 'key');
console.log('key == ' + val)

let strXiaoming: string = Reflect.get(Xiaoming, 'name');
console.log('name == ' + strXiaoming)
})

更多关于HarmonyOS 鸿蒙Next ARKTS语言是否有反射机制 或 使用ARKTS实现工厂类动态生成自定义组件的最佳实践的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next ARKTS语言具备反射机制。ARKTS作为鸿蒙系统的UI开发框架,在设计上融入了现代编程语言的多种特性,反射机制便是其中之一。通过反射机制,开发者可以在运行时动态地获取对象或类的信息,包括类属性、方法以及构造函数等,进而实现更加灵活和动态的代码行为。

在实现工厂类动态生成自定义组件的最佳实践中,利用ARKTS的反射机制,可以动态地根据传入的不同参数或类型信息,来实例化对应的组件类。这通常涉及到以下几个步骤:

  1. 定义组件基类:所有自定义组件都继承自这个基类。
  2. 创建工厂类:工厂类中包含一个静态方法,该方法接受组件的类型信息(如类名)作为参数。
  3. 利用反射实例化组件:在工厂类的静态方法中,根据传入的类型信息,使用ARKTS的反射API动态地实例化对应的组件对象。
  4. 返回组件对象:工厂方法返回实例化后的组件对象,供上层调用者使用。

这种实现方式不仅提高了代码的复用性和灵活性,还使得组件的扩展和维护变得更加容易。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部