HarmonyOS 鸿蒙Next 自定义组件的build里最上层是Text组件,但是外部引用这个组件,无法使用Text相关的属性进行配置

发布于 1周前 作者 nodeper 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 自定义组件的build里最上层是Text组件,但是外部引用这个组件,无法使用Text相关的属性进行配置

自定义组件的build里最上层是Text组件,但是外部引用这个组件,无法使用Text相关的属性进行配置,如果我想快速使用其属性配置,因为arkts不能继承,不然我直接继承Text组件进行操作了

例子如下:
@ComponentV2
export struct citeBuilder {
@BuilderParam str:string
@BuilderParam res:ResourceStr

build(){ Text(){ Span(this.str) ImageSpan(this.res) … } } }


然后我外部在不同的场景使用到这个citeBuilder,但是最外层Text的属性有差异,有些要固定几行。。。省略,有些不用。我试了试citeBuilder().fontColor(xxx)点不出来,如果我要这个组件可以有Text组件的属性,自动设置到这个组件的最上层Text上要如何处理呢?

2 回复

自定义组件是只能通过链式调用 通用属性和方法。不支持text的特有属性
ArkUI给自定义组件设置样式时,相当于给MyComponent套了一个不可见的容器组件,而这些样式是设置在容器组件上的,而非直接设置给MyComponent的Button组件。通过渲染结果我们可以很清楚的看到,背景颜色红色并没有直接生效在Button上,而是生效在Button所处的开发者不可见的容器组件上。
文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-create-custom-components-V5#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E9%80%9A%E7%94%A8%E6%A0%B7%E5%BC%8F

参考这串代码:

// src/main/ets/pages/CommonComponent.ets

// Image组件的AttributeModifier接口实现类 export class ImageModifier implements AttributeModifier<ImageAttribute> { private imageWidth: Length = 0; private imageHeight: Length = 0;

constructor(width: Length, height: Length) { this.imageWidth = width; this.imageHeight = height; }

width(width: Length) { this.imageWidth = width; return this; }

height(height: Length) { this.imageHeight = height; return this; }

applyNormalAttribute(instance: ImageAttribute): void { instance.width(this.imageWidth); instance.height(this.imageHeight); instance.borderRadius(10) } }

// Text组件的AttributeModifier接口实现类 export class TextModifier implements AttributeModifier<TextAttribute> { private fontcolor: ResourceColor | undefined = Color.Green; private fontsize: number = 16; constructor(fontcolor?:ResourceColor,fontsize?:number) { if (fontcolor){ this.fontcolor = fontcolor; } if (fontsize) { this.fontsize = fontsize; }

}

applyNormalAttribute(instance: TextAttribute): void { instance.fontSize(this.fontsize); instance.fontColor(this.fontcolor) } } @Component export struct CustomImageText { @Prop imageAttribute: AttributeModifier<ImageAttribute>; @Prop textAttribute: AttributeModifier<TextAttribute>; @Prop imageSrc: PixelMap | ResourceStr | DrawableDescriptor; @Prop text: string;

build() { Column({ space: 10 }) { Image(this.imageSrc) .attributeModifier(this.imageAttribute) Text(this.text) .attributeModifier(this.textAttribute) } } } @Entry @Component struct CommonComponent { imageAttribute: ImageModifier = new ImageModifier(330, 330); textAttribute: TextModifier = new TextModifier(Color.Red,40); // textAttribute: TextModifier = new TextModifier();

build() { NavDestination() { Column() { CustomImageText({ imageAttribute: this.imageAttribute, textAttribute: this.textAttribute, imageSrc: $r(‘app.media.kangaroo’), text: ‘Scenery’ })

} .margin({ top: 10 }) .justifyContent(FlexAlign.Start) .alignItems(HorizontalAlign.Center) .width(300) .height(300) }

} }

自定义组件不可以通过.进行链式调用,只可以在创建时赋值,上面的代码是创建一个图片和文字,文字可以设置fontsize 和fontcolor ,如果不传使用默认设置的样式

在HarmonyOS鸿蒙Next的组件开发中,当你创建自定义组件并在其构建结构的最上层使用Text组件时,外部引用该自定义组件时无法直接配置Text相关属性,这是组件封装的一个基本原则。自定义组件应被视为一个独立的实体,其内部实现细节(如Text组件)对外是不可见的。

为了解决这个问题,你可以在自定义组件内部定义一些属性(如自定义属性),并通过这些属性来控制Text组件的行为和外观。例如,你可以定义一个名为text的自定义属性来传递文本内容,并在自定义组件的代码中读取这个属性来设置Text组件的文本。

此外,如果需要在外部对Text组件的某些样式进行配置(如字体大小、颜色等),你也可以在自定义组件中定义相应的自定义属性,并在内部进行相应的样式设置。

总之,你需要通过自定义属性来桥接外部配置和内部Text组件的属性设置。这是保持组件封装性的同时,提供灵活配置的一种有效方式。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部