ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

鸿蒙 6.1 API 23 开发坑系列篇 1:ArkUI.modifier 装饰器坑——attributeModifier + AttributeModifier<T> 状态化节点修改器根因

鸿蒙 6.1 API 23 开发坑系列篇 1:ArkUI.modifier 装饰器坑——attributeModifier + AttributeModifier<T> 状态化节点修改器根因

本文是「鸿蒙 6.1 API 23 开发坑系列」第 1 篇(ArkUI 桶第 1 篇)。鸿蒙 6.1 API 23 共 397 个 API namespace,本系列按类别分桶写几百篇,每篇一个具体 API namespace 真名坑。本篇讲@ohos.arkui.modifiernamespace(API 12+,鸿蒙 6.1 API 23 基座)——74 个 Modifier 装饰器类,attributeModifier+AttributeModifier<T>状态化节点修改器根因。鸿蒙坑根因applyNormalAttribute是方法声明不是属性——buttonModifier.applyNormalAttribute = fn编译错arkts-no-method-reassignment(ArkTS 禁止给对象方法重新赋值),正确用法是class MyModifier implements AttributeModifier<T> { applyNormalAttribute(instance) {} }+attributeModifier(myModifier)绑定。

一、开篇:鸿蒙 modifier 不是 React useReducer,是「节点属性修改器」

你写 React 时,组件状态管理用useReducer(reducer 函数 + dispatch 派发动作):

// React useReducer:reducer 函数 + dispatch 派发动作(状态管理 hook) function Button() { const [state, dispatch] = useReducer((state, action) => { if (action.type === 'toggle') { return { fontSize: 20, bgColor: '#28a745', fontColor: '#ffffff' } } return { fontSize: 16, bgColor: '#2563eb', fontColor: '#ffffff' } }, { fontSize: 16, bgColor: '#2563eb', fontColor: '#ffffff' }) // ❌ React useReducer:reducer 函数 + dispatch 派发动作(状态管理 hook,不是节点修改器) return <button style={{ fontSize: state.fontSize, backgroundColor: state.bgColor }} onClick={() => dispatch({ type: 'toggle' })}>按钮</button> }

你写鸿蒙 ArkTS 时,节点属性修改用AttributeModifier<T>装饰器(class implements + applyNormalAttribute 方法 + attributeModifier 绑定):

// ArkTS AttributeModifier:class implements + applyNormalAttribute 方法 + attributeModifier 绑定 class MyButtonModifier implements AttributeModifier<ButtonAttribute> { fontSize: number = 16 bgColor: ResourceColor = '#2563eb' fontColor: ResourceColor = '#ffffff' // ✅ applyNormalAttribute 是方法声明(class implements AttributeModifier<T>,不是属性赋值) applyNormalAttribute(instance: ButtonAttribute): void { // ✅ instance 是 ButtonAttribute 实例,改属性用同名 setter 方法 instance.fontSize(this.fontSize) instance.backgroundColor(this.bgColor) instance.fontColor(this.fontColor) } // ✅ applyPressedAttribute 按下态(可选方法,状态化节点修改器多状态) applyPressedAttribute(instance: ButtonAttribute): void { instance.backgroundColor('#dc3545') instance.fontSize(22) } } const myButtonModifier: MyButtonModifier = new MyButtonModifier() @Entry @Component struct Index { build() { // ✅ attributeModifier 绑定装饰器实例到组件(鸿蒙坑:attributeModifier 绑定 AttributeModifier<T> 实例) Button('受 MyButtonModifier 装饰器控制的按钮') .attributeModifier(myButtonModifier) } }

React useReducer vs 鸿蒙 AttributeModifier 的区别:React 把状态管理当 reducer 函数(useReducer + dispatch 派发动作,状态管理 hook,声明式 UI),ArkTS 把节点属性修改当装饰器类(class implements AttributeModifier + applyNormalAttribute 方法改 instance 属性 + attributeModifier 绑定,节点属性修改器,命令式 setter)。根因不是状态管理 hook 是节点属性修改器——applyNormalAttribute 是方法声明改 instance 属性,attributeModifier 绑定装饰器实例到组件。

二、根因:鸿蒙 AttributeModifier 的绑定机制

鸿蒙@ohos.arkui.modifiernamespace(API 12+)有74 个 Modifier 装饰器类,每个继承对应 Attribute 类 + 实现AttributeModifier<XxxAttribute>interface,核心方法applyNormalAttribute(instance: XxxAttribute): void改属性。绑定机制来自四重根因。

机制 1:74 个 Modifier 类——extends XxxAttribute implements AttributeModifier

鸿蒙 74 个 Modifier 装饰器类,每个 extends 对应 Attribute 类 + implements AttributeModifier:

// ✅ ButtonModifier 类声明(extends ButtonAttribute implements AttributeModifier<ButtonAttribute>) export declare class ButtonModifier extends ButtonAttribute implements AttributeModifier<ButtonAttribute> { applyNormalAttribute?(instance: ButtonAttribute): void } // ✅ TextModifier 类声明(extends TextAttribute implements AttributeModifier<TextAttribute>) export declare class TextModifier extends TextAttribute implements AttributeModifier<TextAttribute> { applyNormalAttribute?(instance: TextAttribute): void } // ✅ 74 个 Modifier 类:ButtonModifier/TextModifier/ImageModifier/ColumnModifier/RowModifier/... // ✅ 每个 extends 对应 Attribute 类 + implements AttributeModifier<XxxAttribute> // 鸿蒙 74 个 Modifier 装饰器类:extends XxxAttribute implements AttributeModifier<XxxAttribute>

鸿蒙 Modifier 类清单(74 个):CommonModifier(基座)/ AlphabetIndexerModifier / BlankModifier / ButtonModifier / CalendarPickerModifier / CheckboxModifier / CheckboxGroupModifier / ColumnModifier / ColumnSplitModifier / CounterModifier / DataPanelModifier / DatePickerModifier / DividerModifier / GaugeModifier / GridModifier / GridColModifier / GridItemModifier / GridRowModifier / HyperlinkModifier / ImageAnimatorModifier / ImageModifier / SymbolGlyphModifier / ImageSpanModifier / LineModifier / ListModifier / ListItemModifier / ListItemGroupModifier / LoadingProgressModifier / MarqueeModifier / MenuModifier / MenuItemModifier / NavDestinationModifier / NavigationModifier / NavigatorModifier / NavRouterModifier / PanelModifier / PathModifier / PatternLockModifier / PolygonModifier / PolylineModifier / ProgressModifier / QRCodeModifier / RadioModifier / RatingModifier / RectModifier / RefreshModifier / RichEditorModifier / RowModifier / RowSplitModifier / ScrollModifier / SearchModifier / SelectModifier / ShapeModifier / SideBarContainerModifier / SliderModifier / SpanModifier / StackModifier / StepperItemModifier / SwiperModifier / TabsModifier / TextAreaModifier / TextModifier / TextClockModifier / TextInputModifier / TextPickerModifier / TextTimerModifier / TimePickerModifier / ToggleModifier / VideoModifier / WaterFlowModifier / ContainerSpanModifier / SymbolSpanModifier / ParticleModifier / StepperModifier。

机制 2:applyNormalAttribute 是方法声明不是属性——arkts-no-method-reassignment 编译错

鸿蒙坑根因:applyNormalAttribute是方法声明不是属性——buttonModifier.applyNormalAttribute = fn编译错:

// ❌ 鸿蒙坑:applyNormalAttribute 是方法不是属性,赋值覆盖编译错 arkts-no-method-reassignment const buttonModifier: ButtonModifier = new ButtonModifier() // ❌ ArkTS 禁止给对象方法重新赋值:buttonModifier.applyNormalAttribute = (instance) => { ... } // ❌ 编译错:Reassigning object methods is not supported (arkts-no-method-reassignment) // ✅ 正确用法:class implements AttributeModifier<T>,applyNormalAttribute 是方法声明 class MyButtonModifier implements AttributeModifier<ButtonAttribute> { applyNormalAttribute(instance: ButtonAttribute): void { instance.fontSize(20) instance.backgroundColor('#28a745') instance.fontColor('#ffffff') } } // 鸿蒙坑根因:applyNormalAttribute 是方法声明不是属性,ArkTS 禁止给对象方法重新赋值

arkts-no-method-reassignment 编译错根因:ArkTS 语法规则禁止给对象方法重新赋值(obj.method = fn非法),applyNormalAttribute在 .d.ts 里声明为方法(applyNormalAttribute?(instance: ButtonAttribute): void),所以buttonModifier.applyNormalAttribute = fn触发arkts-no-method-reassignment编译错。正确用法是class MyModifier implements AttributeModifier<T>声明方法,不是赋值覆盖方法。

机制 3:attributeModifier(modifier) 绑定装饰器实例到组件

鸿蒙attributeModifier(modifier)绑定装饰器实例到组件(不是 attribute 是装饰器绑定):

// ✅ attributeModifier 绑定装饰器实例到组件(鸿蒙坑:attributeModifier 绑定 AttributeModifier<T> 实例) const myButtonModifier: MyButtonModifier = new MyButtonModifier() @Entry @Component struct Index { build() { // ✅ attributeModifier(modifier) 绑定装饰器实例到组件 Button('受 MyButtonModifier 装饰器控制的按钮') .attributeModifier(myButtonModifier) .onClick(() => { // ✅ 装饰器控制的按钮点击,applyPressedAttribute 按下态触发 }) } } // attributeModifier 绑定装饰器实例到组件(不是 attribute 是装饰器绑定)

attributeModifier vs attribute 的区别attributeModifier(modifier)绑定的是AttributeModifier<T>实例(装饰器类实例,applyNormalAttribute 方法改 instance 属性),不是单个 attribute 值(fontSize/fontColor 等声明式属性)。装饰器绑定是命令式 setter(instance.fontSize()),声明式属性是声明式 UI(.fontSize(16))。

机制 4:applyXxxAttribute 多状态——Normal/Pressed/Focused 等可选方法

鸿蒙AttributeModifier<T>interface 有多个可选 apply 方法(Normal/Pressed/Focused 等多状态):

// ✅ applyXxxAttribute 多状态:Normal/Pressed/Focused 等可选方法 class MyButtonModifier implements AttributeModifier<ButtonAttribute> { // ✅ applyNormalAttribute 正常态(必选) applyNormalAttribute(instance: ButtonAttribute): void { instance.fontSize(16) instance.backgroundColor('#2563eb') } // ✅ applyPressedAttribute 按下态(可选,状态化节点修改器多状态) applyPressedAttribute(instance: ButtonAttribute): void { instance.backgroundColor('#dc3545') instance.fontSize(22) } // ✅ applyFocusedAttribute 聚焦态(可选,状态化节点修改器多状态) applyFocusedAttribute(instance: ButtonAttribute): void { instance.backgroundColor('#ff6600') instance.fontSize(18) } } // applyXxxAttribute 多状态:Normal/Pressed/Focused 等可选方法

applyXxxAttribute 多状态方法applyNormalAttribute(正常态,必选)/applyPressedAttribute(按下态,可选)/applyFocusedAttribute(聚焦态,可选)/applyDisabledAttribute(禁用态,可选)/applySelectedAttribute(选中态,可选)/applyPointerOverAttribute(鼠标悬停态,可选)等。每个状态对应一个 apply 方法,instance 是对应 Attribute 实例,改属性用同名 setter。

三、真机配图:鸿蒙 ArkUI.modifier 装饰器坑——attributeModifier + AttributeModifier

真机配图展示鸿蒙 ArkUI.modifier 装饰器坑:

  • 初始态:鸿蒙 6.1 ArkUI.modifier 装饰器坑标题,场景1卡片(受 MyButtonModifier 装饰器控制的按钮蓝色 fontSize=16 + ①toggle 按钮)、场景2卡片(受 MyTextModifier 装饰器控制的文本黑色 fontSize=14 + ②toggle 按钮)、鸿蒙坑卡片(arkts-no-method-reassignment 错误演示)、要点说明
  • ButtonModifier toggle 态:点击「① toggle MyButtonModifier 状态」按钮,modifierStatus 显示「✅ MyButtonModifier 状态切换:toggle=true fontSize=20 bgColor=#28a745」,受装饰器控制的按钮已变绿色 fontSize=20——状态化节点修改器验证
  • TextModifier toggle 态:点击「② toggle MyTextModifier 状态」按钮,受 MyTextModifier 装饰器控制的文本已变红色 fontSize=18——文本装饰器验证
  • applyPressedAttribute 按下态:点击「受 MyButtonModifier 装饰器控制的按钮」,pressed=1,applyPressedAttribute 按下态触发(按钮变红色 fontSize=22)——按下态验证

四、真解法:鸿蒙 AttributeModifier 的三个场景

场景 1:class implements AttributeModifier + attributeModifier 绑定——90% 场景首选

class implements AttributeModifier + attributeModifier 绑定用AttributeModifier<ButtonAttribute>+attributeModifier(modifier)

// ✅ 场景 1:class implements AttributeModifier<T> + attributeModifier 绑定(API 12,90% 场景首选) class MyButtonModifier implements AttributeModifier<ButtonAttribute> { fontSize: number = 16 bgColor: ResourceColor = '#2563eb' fontColor: ResourceColor = '#ffffff' // ✅ applyNormalAttribute 是方法声明(class implements AttributeModifier<T>,不是属性赋值) applyNormalAttribute(instance: ButtonAttribute): void { // ✅ instance 是 ButtonAttribute 实例,改属性用同名 setter 方法 instance.fontSize(this.fontSize) instance.backgroundColor(this.bgColor) instance.fontColor(this.fontColor) } } const myButtonModifier: MyButtonModifier = new MyButtonModifier() @Entry @Component struct Index { build() { // ✅ attributeModifier 绑定装饰器实例到组件 Button('受 MyButtonModifier 装饰器控制的按钮') .attributeModifier(myButtonModifier) } } // class implements AttributeModifier<T> + attributeModifier 绑定:90% 场景首选

鸿蒙 AttributeModifier API 真名坑AttributeModifier<T>interface(API 12+,鸿蒙 6.1 API 23 基座);applyNormalAttribute(instance: T): void正常态方法(必选);applyPressedAttribute(instance: T): void按下态方法(可选);applyFocusedAttribute(instance: T): void聚焦态方法(可选);applyDisabledAttribute(instance: T): void禁用态方法(可选);applySelectedAttribute(instance: T): void选中态方法(可选);attributeModifier(modifier: AttributeModifier<T>)绑定装饰器实例到组件;74 个 Modifier 类extends 对应 Attribute 类 implements AttributeModifier;SysCapSystemCapability.ArkUI.ArkUI.Full@crossplatform跨平台;@atomicservice原子化服务。

场景 2:applyXxxAttribute 多状态——Normal/Pressed/Focused 等可选方法

applyXxxAttribute 多状态用applyPressedAttribute+applyFocusedAttribute等可选方法:

// ✅ 场景 2:applyXxxAttribute 多状态——Normal/Pressed/Focused 等可选方法(API 12) class MyButtonModifier implements AttributeModifier<ButtonAttribute> { applyNormalAttribute(instance: ButtonAttribute): void { instance.fontSize(16) instance.backgroundColor('#2563eb') instance.fontColor('#ffffff') } // ✅ applyPressedAttribute 按下态(可选方法,状态化节点修改器多状态) applyPressedAttribute(instance: ButtonAttribute): void { instance.backgroundColor('#dc3545') instance.fontSize(22) } // ✅ applyFocusedAttribute 聚焦态(可选方法,状态化节点修改器多状态) applyFocusedAttribute(instance: ButtonAttribute): void { instance.backgroundColor('#ff6600') instance.fontSize(18) } } // applyXxxAttribute 多状态:Normal/Pressed/Focused 等可选方法,instance 改属性用同名 setter

鸿蒙 applyXxxAttribute 多状态 API 真名坑applyNormalAttribute(正常态,N 首字母大写驼峰命名);applyPressedAttribute(按下态,P 首字母大写);applyFocusedAttribute(聚焦态,F 首字母大写);applyDisabledAttribute(禁用态,D 首字母大写);applySelectedAttribute(选中态,S 首字母大写);applyPointerOverAttribute(鼠标悬停态,P 首字母大写);鸿蒙坑applyNormalAttribute大小写坑——Normal 不是 normal,首字母大写驼峰命名;instance 改属性用同名 setter 方法(instance.fontSize()/instance.backgroundColor()/instance.fontColor())。

场景 3:arkts-no-method-reassignment 编译错——applyNormalAttribute 是方法不是属性

arkts-no-method-reassignment 编译错——buttonModifier.applyNormalAttribute = fn非法:

// ❌ 场景 3:arkts-no-method-reassignment 编译错——applyNormalAttribute 是方法不是属性 const buttonModifier: ButtonModifier = new ButtonModifier() // ❌ ArkTS 禁止给对象方法重新赋值:buttonModifier.applyNormalAttribute = (instance) => { ... } // ❌ 编译错:Reassigning object methods is not supported (arkts-no-method-reassignment) // ❌ 错误信息:Error Message: Reassigning object methods is not supported (arkts-no-method-reassignment) // ✅ 正确用法:class implements AttributeModifier<T>,applyNormalAttribute 是方法声明 class MyButtonModifier implements AttributeModifier<ButtonAttribute> { applyNormalAttribute(instance: ButtonAttribute): void { instance.fontSize(20) instance.backgroundColor('#28a745') instance.fontColor('#ffffff') } } // arkts-no-method-reassignment 编译错根因:applyNormalAttribute 是方法声明不是属性,ArkTS 禁止给对象方法重新赋值

arkts-no-method-reassignment 编译错根因:ArkTS 语法规则禁止给对象方法重新赋值(obj.method = fn非法,arkts-no-method-reassignment),applyNormalAttribute在 .d.ts 里声明为方法(applyNormalAttribute?(instance: ButtonAttribute): void),所以buttonModifier.applyNormalAttribute = fn触发编译错。鸿蒙坑applyNormalAttribute是方法声明不是属性——不能赋值覆盖,必须 class implements AttributeModifier 声明方法。

五、一句话哲学

写鸿蒙 ArkUI 记住:modifier 不是 React.useReducer 是「节点属性修改器」——鸿蒙 6.1 API 23@ohos.arkui.modifiernamespace(API 12+,74 个 Modifier 装饰器类,extends XxxAttribute implements AttributeModifier,SysCap SystemCapability.ArkUI.ArkUI.Full,@crossplatform @atomicservice)。根因不是状态管理 hook 是节点属性修改器——applyNormalAttribute(instance: T): void是方法声明不是属性(❌buttonModifier.applyNormalAttribute = fn编译错arkts-no-method-reassignment,ArkTS 禁止给对象方法重新赋值;✅ 正确用法class MyModifier implements AttributeModifier<T> { applyNormalAttribute(instance) {} }),attributeModifier(modifier)绑定装饰器实例到组件(不是 attribute 是装饰器绑定,命令式 setter),applyXxxAttribute多状态(Normal/Pressed/Focused/Disabled/Selected/PointerOver 等可选方法,首字母大写驼峰命名,instance 改属性用同名 setterinstance.fontSize()/instance.backgroundColor()/instance.fontColor())。节点属性修改器 applyNormalAttribute 是方法不是属性是鸿蒙 6.1 ArkUI.modifier 装饰器坑核心!

能力系列回链

  • �鸿蒙 7.0 新特性篇 1~17(沉浸式毛玻璃/Component3D/智能体框架/方舟引擎/星盾安全/星河互联/空间音频/可变字体/游戏快启/分布式数据盾/LTPO 可变帧率/AI 文档识别/多形态服务窗口/AI 反诈/机密计算/空间计算/小艺全面进化)
  • 鸿蒙 6.1 API 23 开发坑系列篇 1「ArkUI.modifier 装饰器坑」——attributeModifier + AttributeModifier 状态化节点修改器(本文)

真机 demo 完整代码

// 鸿蒙 6.1 API 23 开发坑系列篇 1:ArkUI.modifier 装饰器坑——attributeModifier + AttributeModifier<T> 状态化节点修改器根因 // 本 demo 用 attributeModifier 绑定 + 自定义 class implements AttributeModifier<ButtonAttribute> 演示鸿蒙 6.1 装饰器根因(本机 API 21 可跑) // 鸿蒙坑根因:applyNormalAttribute 是方法不是属性——arkts-no-method-reassignment 禁止 buttonModifier.applyNormalAttribute = fn 赋值,必须 class implements AttributeModifier<T> // ✅ 自定义 AttributeModifier<ButtonAttribute> 实现类(正确用法:class implements,不是赋值覆盖方法) class MyButtonModifier implements AttributeModifier<ButtonAttribute> { fontSize: number = 16 bgColor: ResourceColor = '#2563eb' fontColor: ResourceColor = '#ffffff' // ✅ applyNormalAttribute 是方法声明(class implements AttributeModifier<T>,不是属性赋值) applyNormalAttribute(instance: ButtonAttribute): void { // ✅ instance 是 ButtonAttribute 实例,改属性用同名 setter 方法 instance.fontSize(this.fontSize) instance.backgroundColor(this.bgColor) instance.fontColor(this.fontColor) } // ✅ applyPressedAttribute 按下态(可选方法,状态化节点修改器多状态) applyPressedAttribute(instance: ButtonAttribute): void { instance.backgroundColor('#dc3545') instance.fontSize(22) } // ✅ applyFocusedAttribute 聚焦态(可选方法,状态化节点修改器多状态) applyFocusedAttribute(instance: ButtonAttribute): void { instance.backgroundColor('#ff6600') instance.fontSize(18) } } // ✅ 自定义 AttributeModifier<TextAttribute> 实现类(文本装饰器) class MyTextModifier implements AttributeModifier<TextAttribute> { fontSize: number = 14 fontColor: ResourceColor = '#333333' applyNormalAttribute(instance: TextAttribute): void { instance.fontSize(this.fontSize) instance.fontColor(this.fontColor) } } // ✅ 全局 Modifier 实例(attributeModifier 绑定用) const myButtonModifier: MyButtonModifier = new MyButtonModifier() const myTextModifier: MyTextModifier = new MyTextModifier() @Entry @Component struct Index { @State log: string = '(未操作)' @State modifierStatus: string = '(未用)' @State toggleState: boolean = false @State pressedCount: number = 0 @State focusedCount: number = 0 @State normalCount: number = 0 @State currentButtonFontSize: number = 16 @State currentButtonBgColor: string = '#2563eb' aboutToAppear() { this.log = '鸿蒙 6.1 ArkUI.modifier 装饰器坑:74 个 Modifier 类,attributeModifier + AttributeModifier<T> 状态化节点修改器' } // ✅ 场景 1:切换 MyButtonModifier 状态(改实例属性后刷新绑定) toggleButtonState() { this.toggleState = !this.toggleState if (this.toggleState) { myButtonModifier.fontSize = 20 myButtonModifier.bgColor = '#28a745' myButtonModifier.fontColor = '#ffffff' this.currentButtonFontSize = 20 this.currentButtonBgColor = '#28a745' } else { myButtonModifier.fontSize = 16 myButtonModifier.bgColor = '#2563eb' myButtonModifier.fontColor = '#ffffff' this.currentButtonFontSize = 16 this.currentButtonBgColor = '#2563eb' } this.modifierStatus = '✅ MyButtonModifier 状态切换:toggle=' + this.toggleState + ' fontSize=' + myButtonModifier.fontSize + ' bgColor=' + this.currentButtonBgColor this.log = '✅ MyButtonModifier 实例属性切换成功(applyNormalAttribute 下次渲染按新属性改节点)' this.normalCount++ } // ✅ 场景 2:切换 MyTextModifier 状态 toggleTextState() { if (myTextModifier.fontSize === 14) { myTextModifier.fontSize = 18 myTextModifier.fontColor = '#dc3545' } else { myTextModifier.fontSize = 14 myTextModifier.fontColor = '#333333' } this.modifierStatus = '✅ MyTextModifier 状态切换:fontSize=' + myTextModifier.fontSize this.log = '✅ MyTextModifier 实例属性切换成功(applyNormalAttribute 下次渲染按新属性改节点)' } build() { Column({ space: 8 }) { Text('鸿蒙 6.1 ArkUI.modifier 装饰器坑') .fontSize(18).fontWeight(FontWeight.Bold).margin({ top: 16, bottom: 4 }) Text('attributeModifier + AttributeModifier<T> 状态化节点修改器根因') .fontSize(11).fontColor('#888').margin({ bottom: 8 }) // ✅ 场景 1:attributeModifier 绑定 MyButtonModifier(正确用法) Column({ space: 6 }) { Text('场景 1:attributeModifier 绑定 MyButtonModifier(API 12,class implements AttributeModifier<T>)') .fontSize(12).fontColor('#2563eb').fontWeight(FontWeight.Bold) Text('class MyButtonModifier implements AttributeModifier<ButtonAttribute>,applyNormalAttribute(instance) 改属性') .fontSize(9).fontColor('#888') // ✅ attributeModifier 绑定装饰器实例到组件(鸿蒙坑:attributeModifier 绑定 AttributeModifier<T> 实例) Button('受 MyButtonModifier 装饰器控制的按钮') .attributeModifier(myButtonModifier) .height(40) .margin({ top: 4 }) .onClick(() => { this.pressedCount++ this.log = '✅ 装饰器控制的按钮点击成功(pressedCount=' + this.pressedCount + ')' }) Button('① toggle MyButtonModifier 状态').height(30).fontSize(9).backgroundColor('#2563eb20') .onClick(() => this.toggleButtonState()) Text(this.modifierStatus).fontSize(9).fontColor('#2563eb').margin({ top: 4 }) Text(`当前按钮状态:fontSize=${this.currentButtonFontSize} bgColor=${this.currentButtonBgColor}`) .fontSize(8).fontColor('#2563eb').margin({ top: 2 }) } .width('92%').padding(8).backgroundColor('#e0f0ff').borderRadius(8) // ✅ 场景 2:attributeModifier 绑定 MyTextModifier Column({ space: 6 }) { Text('场景 2:attributeModifier 绑定 MyTextModifier(API 12,文本装饰器)') .fontSize(12).fontColor('#ff6600').fontWeight(FontWeight.Bold) Text('class MyTextModifier implements AttributeModifier<TextAttribute>,applyNormalAttribute(instance) 改属性') .fontSize(9).fontColor('#888') // ✅ attributeModifier 绑定文本装饰器 Text('受 MyTextModifier 装饰器控制的文本') .attributeModifier(myTextModifier) .margin({ top: 4 }) Button('② toggle MyTextModifier 状态').height(30).fontSize(9).backgroundColor('#ff660020') .onClick(() => this.toggleTextState()) } .width('92%').padding(8).backgroundColor('#fff3e0').borderRadius(8) // ✅ 鸿蒙坑:arkts-no-method-reassignment 错误演示(注释说明) Column({ space: 6 }) { Text('鸿蒙坑:arkts-no-method-reassignment 编译错(applyNormalAttribute 是方法不是属性)') .fontSize(12).fontColor('#dc3545').fontWeight(FontWeight.Bold) Text('❌ buttonModifier.applyNormalAttribute = fn → 编译错 arkts-no-method-reassignment') .fontSize(9).fontColor('#dc3545') Text('✅ 正确:class MyModifier implements AttributeModifier<T> { applyNormalAttribute(instance) {} }') .fontSize(9).fontColor('#28a745') Text('鸿蒙坑根因:applyNormalAttribute 是方法声明不是属性,ArkTS 禁止给对象方法重新赋值') .fontSize(8).fontColor('#6c757d').margin({ top: 4 }) } .width('92%').padding(8).backgroundColor('#f8d7da').borderRadius(8) // ✅ 鸿蒙 ArkUI.modifier 装饰器坑要点 Column({ space: 3 }) { Text('鸿蒙 6.1 ArkUI.modifier 装饰器坑要点') .fontSize(10).fontColor('#6c757d').fontWeight(FontWeight.Bold) Text('① @ohos.arkui.modifier namespace API 12+(鸿蒙 6.1 API 23 基座),74 个 Modifier 类') .fontSize(8).fontColor('#2563eb') Text('② 每个 Modifier 类 extends 对应 Attribute 类 implements AttributeModifier<XxxAttribute>') .fontSize(8).fontColor('#ff6600') Text('③ applyNormalAttribute(instance: XxxAttribute): void 改属性(状态化节点修改器根因)') .fontSize(8).fontColor('#28a745') Text('④ instance 是 XxxAttribute 实例,改属性用同名 setter 方法(instance.fontSize/backgroundColor/fontColor)') .fontSize(8).fontColor('#dc3545') Text('⑤ ❌ applyNormalAttribute 是方法不是属性:buttonModifier.applyNormalAttribute = fn 编译错') .fontSize(8).fontColor('#dc3545') Text('⑥ ✅ 正确用法:class MyModifier implements AttributeModifier<T> { applyNormalAttribute(instance) {} }') .fontSize(8).fontColor('#28a745') Text('⑦ attributeModifier(modifier) 绑定装饰器实例到组件(不是 attribute 是装饰器绑定)') .fontSize(8).fontColor('#ff6600') Text('⑧ applyXxxAttribute 多状态:applyNormalAttribute/applyPressedAttribute/applyFocusedAttribute 等可选') .fontSize(8).fontColor('#6c757d') Text('⑨ 装饰器是节点修改器不是 Component——通过 applyXxxAttribute 方法改节点属性,不是声明式 UI') .fontSize(8).fontColor('#ffc107') Text('⑩ React 对比:modifier 不是 React.useReducer——鸿蒙装饰器是节点属性修改器不是状态管理 hook') .fontSize(8).fontColor('#17a2b8') } .width('92%').padding(6).backgroundColor('#f8f9fa').borderRadius(8) // ✅ 统计 Row({ space: 12 }) { Text(`normal: ${this.normalCount}`).fontSize(9).fontColor('#28a745') Text(`pressed: ${this.pressedCount}`).fontSize(9).fontColor('#dc3545') Text(`focused: ${this.focusedCount}`).fontSize(9).fontColor('#ff6600') } .margin({ top: 6 }) Text(`日志:${this.log}`).fontSize(9).fontColor('#333').margin({ top: 6 }) Text('鸿蒙 6.1(API 12+)ArkUI.modifier:74 个 Modifier 类,attributeModifier + AttributeModifier<T> 状态化节点修改器') .fontSize(8).fontColor('#6c757d').margin({ top: 6 }) } .width('100%').height('100%').alignItems(HorizontalAlign.Center) } }

写鸿蒙 ArkUI 记住:modifier 不是 React.useReducer 是「节点属性修改器」——鸿蒙 6.1 API 23@ohos.arkui.modifiernamespace(API 12+,74 个 Modifier 装饰器类,extends XxxAttribute implements AttributeModifier,SysCap SystemCapability.ArkUI.ArkUI.Full,@crossplatform @atomicservice)。根因不是状态管理 hook 是节点属性修改器——applyNormalAttribute(instance: T): void是方法声明不是属性(❌buttonModifier.applyNormalAttribute = fn编译错arkts-no-method-reassignment,ArkTS 禁止给对象方法重新赋值;✅ 正确用法class MyModifier implements AttributeModifier<T> { applyNormalAttribute(instance) {} }),attributeModifier(modifier)绑定装饰器实例到组件(不是 attribute 是装饰器绑定,命令式 setter),applyXxxAttribute多状态(Normal/Pressed/Focused/Disabled/Selected/PointerOver 等可选方法,首字母大写驼峰命名,instance 改属性用同名 setterinstance.fontSize()/instance.backgroundColor()/instance.fontColor())。节点属性修改器 applyNormalAttribute 是方法不是属性是鸿蒙 6.1 ArkUI.modifier 装饰器坑核心!

返回列表