HarmonyOS鸿蒙Next中一种动态按需创建组件的方案
HarmonyOS鸿蒙Next中一种动态按需创建组件的方案
1、为什么需要动态化创建组件
- 创建与使用分离
- 按需创建、按需使用
- 抽象化
2、如何动态化创建组件?一个完整的DEMO
2.1、涉及到的文件结构
- pages
- factory
- components
- DemoComponent01.ets
- DemoComponent02.ets
- DemoComponent03.ets
- Manager.ets
- components
- Index.ets
- factory
2.2、各文件的代码
DemoComponent01.ets
@Component
export default struct DemoComponent01 {
build(){
Text('DemoComponent01').fontSize(30)
}
}
DemoComponent02.ets
@Component
export default struct DemoComponent02 {
build(){
Text('DemoComponent02').fontSize(40)
}
}
DemoComponent03.ets
@Component
export default struct DemoComponent03 {
build(){
Text('DemoComponent03').fontSize(50)
}
}
Manager.ets
import DemoComponent01 from './components/DemoComponent01';
import DemoComponent02 from './components/DemoComponent02';
import DemoComponent03 from './components/DemoComponent03';
@Builder
function dBuilder01() {
DemoComponent01()
}
@Builder
function dBuilder02() {
DemoComponent02()
}
@Builder
function dBuilder03() {
DemoComponent03()
}
const builders = new Map([
['DemoComponent01', () => wrapBuilder(dBuilder01)],
['DemoComponent02', () => wrapBuilder(dBuilder02)],
['DemoComponent03', () => wrapBuilder(dBuilder03)]
])
export default (componentName: string): WrappedBuilder<object[]> | undefined => {
const builderFunc = builders.get(componentName);
if(builderFunc) {
return builderFunc()
}
return
}
Index.ets
import getComponentByName from './factory/Manager';
enum EComponentName {
Component01 = 'DemoComponent01',
Component02 = 'DemoComponent02',
Component03 = 'DemoComponent03'
}
@Entry
@Component
struct Index {
@State message: string = '';
@Builder
renderSelfComponent(){
getComponentByName(this.message)?.builder()
}
build() {
RelativeContainer() {
Column(){
TextInput({text: this.message})
.id('HelloWorld')
.fontSize(26)
.fontWeight(FontWeight.Bold)
.onChange((val) => {
this.message = val
})
if (this.message === EComponentName.Component01) {
Text(this.message).fontColor(Color.Red).fontSize(32)
this.renderSelfComponent()
}
if (this.message === EComponentName.Component02) {
Text(this.message).fontColor(Color.Green).fontSize(32)
this.renderSelfComponent()
}
if (this.message === EComponentName.Component03) {
Text(this.message).fontColor(Color.Orange).fontSize(32)
this.renderSelfComponent()
}
}.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
}
.height('100%')
.width('100%')
}
}
更多关于HarmonyOS鸿蒙Next中一种动态按需创建组件的方案的实战教程也可以访问 https://www.itying.com/category-93-b0.html
map那里是个函数,函数执行才会真正创建对象吧,我理解是这样的。而需要的时候才会执行函数,才会执行wrapperBuilder函数。装饰器对应的应该只是声明。就像类与实例的关系。
在HarmonyOS鸿蒙Next中,动态按需创建组件的方案主要依赖于ArkUI框架的组件化设计。通过使用@Component
装饰器,开发者可以定义可复用的UI组件,并在运行时根据需要动态创建和销毁这些组件。具体实现步骤如下:
- 定义组件:使用
@Component
装饰器定义一个UI组件,组件内部可以包含布局、样式和事件处理逻辑。例如:
@Component
struct MyComponent {
build() {
Column() {
Text('Dynamic Component')
.fontSize(20)
.fontColor(Color.Black)
}
}
}
- 动态创建组件:在父组件中,通过条件渲染或状态管理,动态决定是否创建子组件。例如,使用
if
语句根据条件渲染组件:
@Entry
@Component
struct ParentComponent {
@State showComponent: boolean = false;
build() {
Column() {
Button('Toggle Component')
.onClick(() => {
this.showComponent = !this.showComponent;
});
if (this.showComponent) {
MyComponent();
}
}
}
}
-
组件销毁:当条件不再满足时,组件会自动从UI树中移除,释放相关资源。开发者无需手动管理组件的生命周期。
-
组件复用:通过将组件定义为独立的模块,可以在多个地方复用,提高代码的可维护性和可读性。
-
性能优化:动态创建组件时,ArkUI框架会进行高效的UI更新,确保性能不受影响。开发者可以通过合理设计组件结构和状态管理,进一步优化性能。
这种动态按需创建组件的方案,适用于需要根据用户交互或数据变化动态调整UI的场景,能够有效提升应用的灵活性和响应速度。
在HarmonyOS鸿蒙Next中,可以通过@Builder
装饰器实现动态按需创建组件。@Builder
允许开发者定义一个可复用的组件构建函数,根据条件或数据动态生成UI组件。例如:
@Builder
function dynamicComponent(isVisible: boolean) {
if (isVisible) {
Text('Hello, HarmonyOS!')
} else {
Text('Component Hidden')
}
}
在页面中使用时,可以根据状态动态调用该函数:
@State isVisible: boolean = true;
build() {
Column() {
dynamicComponent(this.isVisible)
}
}
这种方式灵活且高效,适用于需要根据条件或数据动态生成UI的场景。