HarmonyOS 鸿蒙Next 自定义组件的build里最上层是Text组件,但是外部引用这个组件,无法使用Text相关的属性进行配置
HarmonyOS 鸿蒙Next 自定义组件的build里最上层是Text组件,但是外部引用这个组件,无法使用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上要如何处理呢?
自定义组件是只能通过链式调用 通用属性和方法。不支持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