HarmonyOS NEXT-自定义组件和生命周期

自定义组件和生命周期

声明式开发范式

基于ArkTS的声明式开发范式的方舟开发框架是一套开发极简、高性能、支持跨设备的UI开发框架,提供饿了构建HarmonyOS应用UI所必需的能力
在这里插入图片描述

通过设计声明式接口,开发者无需关心底层实现逻辑,将更多注意力放在上层业务上。

声明式UI

特征:

  • 声明式描述
  • 状态驱动视图更新
声明式描述

在这里插入图片描述

在这里插入图片描述

状态驱动视图更新

应用界面是动态的,需要根据状态不同显示不同的内容

  • 状态:驱动应用变化的数据源
  • 视图:与状态相关联的UI内容

在这里插入图片描述

自定义组件

通过多种组件的组合,封装为可重用、可组合的UI单元
以待办列表为例:

在这里插入图片描述
在这里插入图片描述

可以将待办列表的每一项封装成一个自定义组件ToDoItem:

@Builder labelIcon(icon:Resource){...}
@Component
struct ToDoItem{

    @State isComplete:boolean=false
    @Prop content:string;

    build(){
       Row(){
        if(this.isComplete){
            this.labelIcon($r('app.media.ic_ok'))
        }else{
            this.labelIcon($r('app.media.ic_default'))
        }
        Text(this.content)
        ...
       }
       .onClick(()=>{
            this.isComplete=!this.isComplete;
       }) 
    }
}

待办列表页ToDoListPage由若干个ToDoItem组成

@Entry
@Compnent
struct ToDoListPage{
    private tasks:Array<string>=[
        '早起晨练',
        '准备早餐',
        '阅读名著',
        '学习ArkTS',
        '看剧放松'
    ]
    build(){
        Column(){
            Text('待办')
            ...
            ForEach(this.tasks,(item:string)=>{
                ToDoItem({content:item})
                //自定义组件通过.链式调用的形式设置通用样式
                .width(300)
                .height(50)
                .backgroundColor(Color.blue)
            },...)
        }
    }
}
  • @Component装饰器定义为自定义组件
  • struct声明自定义组件的数据结构
  • build()函数定义自定义组件的声明式UI描述,自定义组件必须定义build()函数。
  • @Entry装饰的自定义组件将作为UI页面的入口。在单个UI页面中,最多可以使用@Entry装饰一个自定义组件。
  • @Entry装饰的自定义组件,其build()函数下必须有一个容器组件作为根节点,其中ForEach禁止作为根节点
  • @Component装饰器定义为自定义组件,其build()函数下必须有根节点,可以为非容器组件,同样ForEach禁止作为根节点。

页面和自定义组件的生命周期

页面和自定义组件的关系

  • 自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期
  • 页面:即应用的UI页面,可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件作为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的组件才可以调用页面的生命周期。

页面的生命周期

即被@Entry装饰的组件生命周期:

  • onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景。
  • onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
  • onBackPress:当用户点击返回按钮或者侧滑返回时触发。

组件的生命周期

  • aboutToAppear:组件即将出现时调用该函数,即在创建自定义组件的新实例后,在其执行build()函数之前执行,在这个函数中可以对状态变量进行修改,这些修改会在后续执行build()函数时生效。
  • onDidBuild:组件build()函数执行完成之后调用该函数,不建议在此时更改状态变量,这可能会导致不稳定的UI表现。
  • aboutToDisappear:组件销毁之前执行,用户可以在这个函数回调中释放UI资源,不允许在此时改变状态变量。

组件(页面)生命周期流程图

在这里插入图片描述

<think>好的,我现在需要回答用户关于HarmonyOS NEXT中MVVM模式下viewpage的关系的问题。首先,我得回忆一下HarmonyOS的相关知识,特别是MVVM架构在其中的应用。用户提到的引用内容里,引用[3]提到了page是方舟开发框架最小的调度单位,每个页面单独管理,通过路由API进行调度。这可能view与page的关系有关。 MVVM模式通常分为Model、View、ViewModel三个部分。在HarmonyOS中,View可能对应UI组件,而Page可能是一个包含多个View的容器。我需要确定在HarmonyOS NEXT中,Page是否作为View的载体,负责管理视图的布局生命周期,而ViewModel则处理数据绑定业务逻辑。 用户提到的引用[2]中的AceAbility类,继承自Ability,用于JS FA的开发,可能涉及到页面初始化生命周期管理。这里可能Page与Ability有关联,而View则是Page中的UI元素。ViewModel可能作为桥梁,连接PageModel,实现数据驱动UI更新。 另外,引用[3]提到页面路由API,说明Page之间的导航管理是分开的,而每个Page可能包含多个View组件。需要解释在MVVM中,View如何通过数据绑定与ViewModel交互,而Page作为结构单元如何承载这些View,并处理路由状态。 还要注意HarmonyOS的ArkUI框架,可能使用声明式UI,类似SwiftUI或Jetpack Compose,其中View的结构通过代码声明,与ViewModel绑定。Page可能对应一个完整的界面,由多个自定义组件(View)构成,而ViewModel则提供数据方法,供View绑定。 需要确认在HarmonyOS NEXT中,是否推荐每个Page对应一个ViewModel,或者是否可以有多个ViewModel。可能每个Page关联一个ViewModel,管理该页面的所有数据逻辑,而View则是Page内的UI元素,通过状态管理自动更新。 总结:Page作为应用的基本调度单位,负责视图的容器导航;View是具体的UI组件,构成Page的内容;ViewModel处理业务逻辑数据绑定,连接ModelView。需要结构化地解释这三者的关系,并结合HarmonyOS的特性,比如ArkTS声明式UI,说明数据如何驱动视图更新,以及Page如何管理View的布局生命周期。</think>在HarmonyOS NEXT的MVVM架构中,View与Page的关系可通过以下四个层面理解: ### 一、角色定义 1. **Page**:应用调度最小单位,负责管理完整界面生命周期路由跳转[^3] - 通过`@Entry`装饰器声明为入口组件 - 示例代码: ```arkts @Entry @Component struct ArticlePage { build() { Column() { ArticleHeader() ArticleContent({ viewModel: articleVM }) CommentList() } } } ``` 2. **View**:UI原子组件或复合组件 - 通过`@Component`装饰器声明可复用组件 - 示例:按钮组件通过`@State`管理自身状态 ```arkts @Component struct SubmitButton { @State isActive: boolean = false build() { Button('提交') .stateStyle(this.isActive ? ButtonStyle.Primary : ButtonStyle.Normal) } } ``` ### 二、数据绑定机制 1. **双向绑定实现**: ```arkts @Observed class PageViewModel { @Track currentPage: number = 1 } @Component struct Pagination { @Link @Watch('onPageChange') page: number private onPageChange() { fetchData(this.page) } } ``` View通过`@Link`建立与ViewModel的双向绑定[^2] 2. **状态管理对比**: | 状态类型 | 作用范围 | 典型应用场景 | |------------|-----------|---------------------| | @State | 组件内 | 按钮激活状态 | | @Prop | 父子组件 | 分页器当前页码 | | @Link | 跨组件 | 主题色全局同步 | ### 三、生命周期交互 1. **Page生命周期事件**: ```typescript class ArticlePageViewModel { onPageShow() { this.loadArticleData() } onPageHide() { this.clearCache() } } ``` ViewModel通过Ability生命周期回调实现资源管理[^2] 2. **View更新触发条件**: - 数据变更:`@Observed`类属性修改 - 状态变化:`@State/@Prop`变量更新 - 事件触发:用户交互或系统事件 ### 四、开发实践建议 1. **组件拆分原则**: - 单一职责:每个View对应单一功能模块 - 高内聚:相关UI元素封装为复合组件 - 低耦合:通过接口定义交互协议 2. **性能优化策略**: - 使用`@Reusable`装饰器实现组件复用 - 通过`aboutToAppear`延迟加载非关键资源 - 采用`LazyForEach`优化长列表渲染
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值