HarmonyOS 鸿蒙Next中仓颉自定义组件如何使用“.”链式调用

HarmonyOS 鸿蒙Next中仓颉自定义组件如何使用“.”链式调用

自定义组件

package ohos_app_cangjie_entry.components

import ohos.base.*
import ohos.component.*
import ohos.state_manage.*
import ohos.state_macro_manage.*
import ohos.resource_manager.*

@Component
public class AppHeader {
    @State
    var message:String = 'message'
    
    func build() {
        Text(message)
    }
    func setMessage(message:String) {
        this.message = message
    }
}

调用

@Entry
@Component
public class Home {
    func build(){
        Stack(Alignment.Top) {
            Text("home")
            .height(150.vp)
            .fontSize(20.vp)
            AppHeader().setMessage('home')//任何链式调用都会报错
        }
        .width(100.percent)
        .height(100.percent)
    }
}

报错

   | 
20 |             AppHeader().setMessage('home')
   |                      ^ expected 3 arguments, found 0
   | 
note: which is expanded as follows
   | 
   | /* 12.4 */        match(AppHeader().setMessage(this, ObservedProperty("", "home"))) {
   |                                  ^^ 
   | 
note: the error occurs after the macro is expanded

更多关于HarmonyOS 鸿蒙Next中仓颉自定义组件如何使用“.”链式调用的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

目前我的仓颉版本,好像还没有办法

更多关于HarmonyOS 鸿蒙Next中仓颉自定义组件如何使用“.”链式调用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,仓颉自定义组件使用"."链式调用需遵循以下规则:组件需继承Component基类并实现ComponentContainer接口,通过@Component装饰器声明。链式调用的每个方法必须返回组件实例(this),例如:this.width(100).height(200)。需在TS/ETS文件中定义类方法,方法内部处理属性后返回当前对象。注意:链式调用仅适用于同一组件实例的属性设置,跨组件需通过状态变量联动。仓颉的链式语法与ArkUI声明式语法并行支持,不可混用。

在HarmonyOS Next的仓颉语言中,自定义组件要实现链式调用需要遵循特定规则。针对你的代码问题,关键在于组件方法需要返回组件实例本身(self/this)。修改AppHeader组件如下:

@Component
public class AppHeader {
    @State
    var message:String = 'message'
    
    func build() {
        Text(message)
    }
    
    func setMessage(message:String) -> AppHeader {
        this.message = message
        return this
    }
}

主要修改点:

  1. setMessage方法返回AppHeader实例(return this)
  2. 这样就能支持链式调用:AppHeader().setMessage('home').height(100.vp)

仓颉的链式调用机制要求每个修改属性的方法都必须返回组件实例本身,这与ArkTS的链式调用原理一致。系统组件如Text的样式方法也是通过返回组件实例来实现链式调用的。

回到顶部