网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
一、跨文件样式复用
适用场景:当需要向外提供单一组件的样式定制效果时,推荐使用这种方案。使用方在调用接口时,编码量相对方式二更少,仅需几行即可完成调用,使用便捷。
- 提供方创建AttributeModifier接口的实现类。
// attributeModifier.ets
/*
自定义class实现Text的AttributeModifier接口
*/
export class CommodityText implements AttributeModifier<TextAttribute> {
textType: TextType = TextType.TYPE_ONE;
textSize: number = 15;
constructor( textType: TextType, textSize: number) {
this.textType = textType;
this.textSize = textSize;
}
applyNormalAttribute(instance: TextAttribute): void {
if (this.textType === TextType.TYPE_ONE) {
instance.fontSize(this.textSize);
instance.fontColor($r('app.color.orange'));
instance.fontWeight(FontWeight.Bolder);
instance.width($r('app.string.max_size'));
} else if (this.textType === TextType.TYPE_TWO) {
instance.fontSize(this.textSize);
instance.fontWeight(FontWeight.Bold);
instance.fontColor($r('sys.color.ohos_id_counter_title_font_color'));
instance.width($r('app.string.max_size'));
} else if (this.textType === TextType.TYPE_Three) {
instance.fontColor(Color.Gray);
instance.fontSize(this.textSize);
instance.fontWeight(FontWeight.Normal);
instance.width($r('app.string.max_size'));
} else if (this.textType === TextType.TYPE_FOUR) {
instance.fontSize(this.textSize);
instance.fontColor($r('app.color.orange'));
instance.textAlign(TextAlign.Center);
instance.border({ width: $r('app.float.float_1'), color: $r('app.color.orange'), style: BorderStyle.Solid });
instance.margin({ right: $r('app.float.float_10') });
}
}
}
/*
枚举文本类型
*/
export enum TextType {
TYPE_ONE,
TYPE_TWO,
TYPE_Three,
TYPE_FOUR
}
- 使用方创建提供方的AttributeModifier实现类实例,并作为系统组件attributeModifier属性方法的参数传入。
// ShoppingCart.ets
import { CommodityText } from '../common/attributeModifier';
@Component
export struct Details {
// 使用方创建提供方的AttributeModifier实现类实例
@State textOne: CommodityText = new CommodityText(TextType.TYPE_ONE, 15);
...
build(){
...
Text($r('app.string.store_name'))
// TODO:知识点:将入参的AttributeModifier类实例与系统组件绑定
.attributeModifier(this.textOne)
.fontColor($r('sys.color.ohos_id_counter_title_font_color'))
...
}
}
// Details.ets
import { CommodityText } from '../common/attributeModifier';
@Component
export struct Details {
// 使用方创建提供方的AttributeModifier实现类实例
@State textOne: MyTextModifier = new MyTextModifier(TextType.TYPE_ONE, 30);
...
build(){
...
Text($r('app.string.commodity_price'))
// 动态设置组件样式
.attributeModifier(this.textOne)
.width($r('app.float.float_100'))
...
}
}
二、跨文件组件复用
适用场景:适用于多个原生组件结合的场景,如Image+Text等复合自定义组件。
- 提供方在公共组件库中创建公用的自定义组件,该组件支持外部传入attributeModifier属性。
//CommonText.ets
/**
* 自定义封装图文组件
*/
@Component
export struct ImageText {
@State item: string | Resource = $r('app.string.text');
@State textOneContent: string | Resource = $r('app.string.text');
@State textTwoContent: string | Resource = $r('app.string.text');
@State textThreeContent: string | Resource = $r('app.string.text');
@State imageSrc: PixelMap | ResourceStr | DrawableDescriptor = $r('app.media.icon');
// TODO:知识点:接受外部传入的AttributeModifier类实例,可以只定制部分组件,选择性传入参数。
@State textOne: AttributeModifier<TextAttribute> = new TextModifier();
@State textTwo: AttributeModifier<TextAttribute> = new TextModifier();
@State textThree: AttributeModifier<TextAttribute> = new TextModifier();
@State imageModifier: AttributeModifier<ImageAttribute> = new ImageModifier();
@State checkboxModifier: AttributeModifier<CheckboxAttribute> = new CheckboxModifier();
build() {
Row() {
Row() {
Checkbox()
.attributeModifier(this.checkboxModifier)
// TODO:知识点:AttributeModifier不支持入参为CustomBuilder或Lamda表达式的属性,且不支持事件和手势。image只能单独通过入参传递使用。
Image(this.imageSrc)
.attributeModifier(this.imageModifier)
}
.margin({ right: $r('app.float.float_10'), bottom: $r('app.float.float_15') })
Column({ space: COLUMN_SPACE }) {
// TODO:知识点:将入参的AttributeModifier类实例与系统组件绑定
Text(this.item)
.attributeModifier(this.textTwo)
Text(this.textThreeContent)
.attributeModifier(this.textThree)
CommonText({ textFour: new TextModifier() })
Text(this.textOneContent)
.attributeModifier(this.textOne)
.fontColor($r('app.color.orange'))
}
}
.padding({ top: $r('app.float.float_5') })
.width($r('app.string.max_size'))
.height($r('app.string.max_size'))
}
}
/*
自定义class实现image的AttributeModifier接口,用于初始化
*/
class ImageModifier implements AttributeModifier<ImageAttribute> {
applyNormalAttribute(instance: ImageAttribute): void {
instance.width($r('app.float.float_100'));
instance.height($r('app.float.float_100'));
}
}
/*
自定义class实现text的AttributeModifier接口,用于初始化
*/
class TextModifier implements AttributeModifier<TextAttribute> {
applyNormalAttribute(instance: TextAttribute): void {
instance.fontSize($r('app.float.float_12'));
instance.fontColor($r('app.color.orange'));
instance.textAlign(TextAlign.Center);
instance.border({ width: $r('app.float.float_1'), color: $r('app.color.orange'), style: BorderStyle.Solid });
instance.margin({ right: $r('app.float.float_10') });
}
}
/*
自定义class实现checkbox的AttributeModifier接口,用于初始化
*/
class CheckboxModifier implements AttributeModifier<CheckboxAttribute> {
applyNormalAttribute(instance: CheckboxAttribute): void {
instance.width($r('app.float.float_15'));
instance.height($r('app.float.float_15'));
}
}
- 使用方分别实现Image组件和Text组件的AttributeModifier接口实现类。
/*
自定义class实现Image组件的AttributeModifier接口
*/
export class ImageModifier implements AttributeModifier<ImageAttribute> {
width: Length | Resource = 0;
height: Length | Resource = 0;
constructor(width: Length | Resource, height: Length | Resource) {
this.width = width;
this.height = height;
}
applyNormalAttribute(instance: ImageAttribute): void {
instance.width(this.width);
instance.height(this.height);
instance.borderRadius($r('app.float.float_10'));
}
}
/*
自定义class实现Text的AttributeModifier接口
*/
export class CommodityText implements AttributeModifier<TextAttribute> {
...
}
- 使用方创建Image组件和Text组件的AttributeModifier接口实现类实例,并作为提供方自定义组件CustomImageText的入参传入。
@Component
export struct ShoppingCart {
// TODO:知识点:使用方创建Image组件和Text组件的AttributeModifier接口实现类实例
@State textOne: CommodityText = new CommodityText(TextType.TYPE_ONE, 15);
@State textTwo: CommodityText = new CommodityText(TextType.TYPE_TWO, 17);
@State textThree: CommodityText = new CommodityText(TextType.TYPE_Three, 15);
@State imageModifier: ImageModifier = new ImageModifier(100, 100);
@State checkboxModifier: CheckboxModifier = new CheckboxModifier();
build() {
...
// AttributeModifier实例作为提供方自定义组件ImageText的入参传入。
ImageText({
item: item,
textOne: this.textOne,
textTwo: this.textTwo,
textThree: this.textThree,
imageModifier: this.imageModifier,
imageSrc: $r('app.media.icon'),
checkboxModifier: this.checkboxModifier,
textOneContent: $r('app.string.commodity_price'),
textTwoContent: $r('app.string.commodity_name'),
textThreeContent: $r('app.string.commodity_model')
})
...
}
}
高性能知识点
本示例使用了动态属性设置和自定义封装公共组件,实现了跨文件样式和组件复用,减少了工程很多冗余的代码。
工程结构&模块类型
dynamicattributes
|---common
| |---AttributeModifier.ets // 自定义AttributeModifier接口
**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
![](https://img-blog.csdnimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)
![img](https://img-blog.csdnimg.cn/img_convert/04b27be06fdc6e0826c99b65a06f9a12.png)
![img](https://img-blog.csdnimg.cn/img_convert/347db328188960af74d8a3654d7000ae.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
)
[外链图片转存中...(img-7z2j6UCJ-1715740393174)]
[外链图片转存中...(img-K5RsQ41a-1715740393174)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**