HarmonyOS 鸿蒙Next Arkts自定义组件问题

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

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:

cke_40257.png

加入Header2的定义:

cke_58044.png

cke_60908.png


更多关于HarmonyOS 鸿蒙Next Arkts自定义组件问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

测试结果令人迷惑:

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中,自定义组件的生命周期方法包括aboutToAppearaboutToDisappear等,可以在组件即将显示或消失时执行特定的逻辑。

自定义组件的使用方式与系统组件类似,可以在其他组件的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刷新。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!