HarmonyOS 鸿蒙Next Arkts自定义组件问题
HarmonyOS 鸿蒙Next Arkts自定义组件问题
学习鸿蒙开发教程,在自定义封装组件时遇到了问题。
教程说自定义封装组件有两种模式,一种是在当前ets文件中自定义组件,如代码中的Header2;一种是在新的ets文件中自定义组件,然后在别的ets文件中import,如代码中的Header。我首先使用的是Header进行封装,封装调用过程正常。接着我引入Header2的自定义之后,编译就会报错。将Header2的自定义注释掉,代码就又能正常运行。
使用的编译工具是DevEco Studio 3.1。
代码如下:
class Item{
// 结构对象
name: string
image: ResourceStr
price: number
// 构造函数
constructor(name: string, image: ResourceStr, price: number) {
this.name = name
this.image = image
this.price = price
}
}
// 全局自定义构建函数
/*@Builder function ItemCard(item: Item){
Row({space: 10}) {
Image(item.image)
.width(100)
Column({space: 4}){
Text(item.name)
.fontSize(30)
.fontWeight(FontWeight.Bold)
Text('¥: ' + item.price)
.fontSize(24)
.fontColor('#f36')
}
.alignItems(HorizontalAlign.Start)
.padding(20)
.height(120)
}
.width('100%')
.margin(5)
.padding(10)
.backgroundColor('#fff')
.borderRadius(20)
}
// 自定义样式封装,全局
/*@Styles function fillScreen(){
.width('100%')
.height('100%')
.padding(10)
.backgroundColor('#DCDCDC')
}
// 自定义字体样式
@Extend(Text) function priceText(){
.fontSize(24)
.fontColor('#f36')
}
/*@Component
struct Header2 {
private title: ResourceStr
// 标题构建
build() {
Row() {
Image($r('app.media.ic_public_back'))
.width(30)
// Blank(1)
Text(this.title)
.fontSize(30)
.fontWeight(FontWeight.Bold)
// Image($r('app.media.test1'))
Blank()
Image($r('app.media.ic_public_refresh'))
.width(30)
}
.width('100%')
.height(30)
}
}
import { Header } from '../components/commonComponents'
@Entry
@Component
struct ItemPage {
private items: Array<Item> = [
new Item('测试1', $r('app.media.test1'), 25),
new Item('测试2', $r('app.media.test2'), 26),
new Item('测试3', $r('app.media.test3'), 27),
new Item('测试4', $r('app.media.test4'), 28),
new Item('测试5', $r('app.media.test5'), 29)
]
@State message: string = '商品列表'
build() {
Column({ space: 8 }) {
// 标题部分
// Header2({title: "sss"})
Header({title: this.message})
.margin({left: 5, top: 20, bottom: 10, right: 5})
.padding({left: 10, right: 10})
// 商品列表部分
List({space: 8}) {
ForEach(
this.items,
(item: Item) => {
ListItem(){
this.ItemCard(item)
}
}
)
}
.width('100%')
.layoutWeight(1)
}
.fillScreen()
}
// 自定义样式封装,全局
@Styles fillScreen(){
.width('100%')
.height('100%')
.padding(10)
.backgroundColor('#DCDCDC')
}
// 局部自定义构建函数,使用时要加this
@Builder ItemCard(item: Item){
Row({space: 10}) {
Image(item.image)
.width(100)
Column({space: 4}){
Text(item.name)
.fontSize(30)
.fontWeight(FontWeight.Bold)
Text('¥: ' + item.price)
.priceText()
}
.alignItems(HorizontalAlign.Start)
.padding(20)
.height(120)
}
.width('100%')
.margin(5)
.padding(10)
.backgroundColor('#fff')
.borderRadius(20)
}
}
运行结果展示:
不定义Header2:
加入Header2的定义:
更多关于HarmonyOS 鸿蒙Next Arkts自定义组件问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
测试结果令人迷惑:
1、引发问题的居然是 fillScreen()
样式函数;
2、解决方式:不用样式函数,直接将属性放在 Column()
; 或者将 fillScreen
改成全局;皆可解决问题。
原因:不知,且令人迷惑。。。可考虑开个工单让官方看看。
更多关于HarmonyOS 鸿蒙Next Arkts自定义组件问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,ArkTS自定义组件是通过@Component
装饰器来定义的。自定义组件可以包含UI描述、状态管理、事件处理等逻辑。以下是一个简单的自定义组件示例:
@Component
struct MyCustomComponent {
@State private count: number = 0;
build() {
Column() {
Text(`Count: ${this.count}`)
.fontSize(20)
.margin(10);
Button('Increment')
.onClick(() => {
this.count++;
})
.margin(10);
}
.justifyContent(FlexAlign.Center)
.width('100%')
.height('100%');
}
}
在这个示例中,MyCustomComponent
是一个自定义组件,包含一个状态变量count
和一个按钮。点击按钮时,count
的值会增加,并且UI会自动更新。
自定义组件可以通过@Prop
、@Link
、@State
等装饰器来管理组件的状态和属性。@Prop
用于父组件向子组件传递数据,@Link
用于双向绑定,@State
用于组件内部的状态管理。
自定义组件还可以通过@Builder
装饰器定义可复用的UI片段,或者通过@Extend
装饰器扩展已有的组件样式。
在鸿蒙Next中,自定义组件的生命周期方法包括aboutToAppear
、aboutToDisappear
等,可以在组件即将显示或消失时执行特定的逻辑。
自定义组件的使用方式与系统组件类似,可以在其他组件的build
方法中直接使用:
@Entry
@Component
struct MyApp {
build() {
Column() {
MyCustomComponent()
}
.justifyContent(FlexAlign.Center)
.width('100%')
.height('100%');
}
}
通过自定义组件,开发者可以构建复杂的UI结构和交互逻辑,提升应用的可维护性和复用性。
在HarmonyOS的ArkTS中,自定义组件通常通过继承Component
类来实现。你可以定义组件的属性、状态和生命周期方法。例如,使用@Component
装饰器来声明组件,并通过@State
、@Prop
等装饰器管理状态和属性。确保在build
方法中返回组件的UI结构。调试时,注意检查组件生命周期是否正确执行,以及状态更新是否触发UI刷新。