如何实现跨文件组件复用
2024-12-18 15:58:44
122次阅读
0个评论
在应用开发中,我们通常需要使用相同功能和样式的ArkUI组件,例如购物页面中会使用相同样式的Button按钮、Text显示文字,我们常用的方法是抽取公共样式或者封装成一个自定义组件到公共组件库中以减少冗余代码。
当需要适用于多个原生组件结合的场景,如Image+Text等复合自定义组件时,推荐使用跨文件组件复用方案。
具体实现可参考如下步骤:
1.提供方在公共组件库CommonText中创建公用的自定义组件ImageText,该组件支持外部传入attributeModifier属性。
export class ImageModifier implements AttributeModifier<ImageAttribute> {
width: number = 60;
height: number = 60;
constructor(width: number, height: number) {
this.width = width;
this.height = height
}
applyNormalAttribute(instance: ImageAttribute): void {
instance.width(this.width);
instance.height(this.height);
}
}
/*
自定义class实现text的AttributeModifier接口,用于初始化
*/
export class TextModifier implements AttributeModifier<TextAttribute> {
textSize: number = 12;
constructor(textSize: number) {
this.textSize = textSize;
}
applyNormalAttribute(instance: TextAttribute): void {
instance.fontSize(this.textSize);
instance.fontColor(Color.Orange);
instance.textAlign(TextAlign.Center);
instance.border({ width: 1, color: Color.Orange, style: BorderStyle.Solid });
instance.margin({ right: 10 });
}
}
/*
自定义class实现checkbox的AttributeModifier接口,用于初始化
*/
export class CheckboxModifier implements AttributeModifier<CheckboxAttribute> {
size: number = 15;
constructor(size: number) {
this.size = size;
}
applyNormalAttribute(instance: CheckboxAttribute): void {
instance.width(this.size);
instance.height(this.size);
}
}
/**
* 自定义封装图文组件
*/
@Component
export struct ImageText {
@State textOneContent: string | Resource = 'default';
@State imageSrc: PixelMap | ResourceStr | DrawableDescriptor = $r('app.media.icon');
//接受外部传入的AttributeModifier类实例,可以只定制部分组件,选择性传入参数。
@State textOne: AttributeModifier<TextAttribute> = new TextModifier(12);
@State imageModifier: AttributeModifier<ImageAttribute> = new ImageModifier(60, 60);
@State checkboxModifier: AttributeModifier<CheckboxAttribute> = new CheckboxModifier(15);
build() {
Row() {
Checkbox()
.attributeModifier(this.checkboxModifier)
Image(this.imageSrc)
.attributeModifier(this.imageModifier)
.margin({ right: 10 })
Text(this.textOneContent)
.attributeModifier(this.textOne)
.fontColor(Color.Orange)
}
.padding({ top: 5 })
.margin({ right: 10, bottom: 15 })
.width(200)
.height(100)
}
}
2.使用方分别实现Image组件、Text组件和checkbox的AttributeModifier接口实现类,然后使用自定义组件ImageText和入参,即可实现跨文件组件复用。
import { ImageText, ImageModifier, TextModifier, CheckboxModifier } from './CommonText';
@Entry
@Component
struct Details {
// 使用方创建提供方的AttributeModifier实现类实例
@State textOne: TextModifier = new TextModifier(36);
@State imageModifier: ImageModifier = new ImageModifier(100, 100);
@State checkboxModifier: CheckboxModifier = new CheckboxModifier(20);
build(){
Row(){
ImageText({
textOne: this.textOne,
imageModifier: this.imageModifier,
imageSrc: $r('app.media.icon'),
checkboxModifier: this.checkboxModifier,
textOneContent: 'hello'
})
}
.width('100%')
.height('100%')
.alignItems(VerticalAlign.Center)
.justifyContent(FlexAlign.Center)
}
}
00
- 1回答
- 0粉丝
- 0关注
相关话题
- Repeat:子组件复用
- OpenHarmony: 如何实现跨模块的页面跳转功能
- 实现文件内容数据同步
- 如何实现防截屏功能
- 如何实现应用的屏幕自动旋转
- OpenHarmony 如何实现防截屏功能
- OpenHarmony: 实现文件没有默认导出,也可以默认导入
- 跨平台开发鸿蒙原生应用
- OpenHarmony跨平台框架开发指南
- OpenHarmony: 跨模块访问 HSP/HAR 包资源
- 鸿蒙跨平台框架来了ArkUI-X
- 如何实现上下切换的页面间跳转动画
- Video组件如何播放图库内的某一个视频
- 如何实现折叠屏折叠态不适配旋转,展示态适配旋转
- HarmonyOS应用开发实战:半天实现知乎日报项目( 五、组件导航Navigation使用详解)