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

自定义组件:是使用@Component 装饰的 UI 单元,可以使用多个系统组件来封装可以复用的组件。

页面:就是应用的 UI 页面,可以由一个或者多个自定义组件构成,页面则是使用@Entry 装饰的自定义组件作为页面的入口组件,也就是页面的根节点。一个页面只能有一个@Entry 装饰器,只有被@Entry 装饰的组件,才可以调用页面的生命周期。

页面的生命周期,有这几个:

  • onPageShow:页面每次显示的时候触发一次。包括通过路由进入页面和应用进入前台等场景。
  • onPageHide:页面隐藏的时候触发一次,包括路由切换和应用进入后台等场景。
  • onBackPress:用户点击返回按钮的时候触发。

组件的生命周期函数:

  • aboutToAppear:组件即将出现的时候调用,在构建自定义组件的实例以后,在 build 函数之前执行。
  • onDidBuild:组件的 build 函数执行完成之后调用,不推荐在 onDidBuild 函数中更改状态变量、使用 animateTo 这些功能,否则会导致 UI 渲染不稳定。
  • aboutToDisappear:在自定义组件析构销毁之前执行,不允许在 aboutToDisappear 函数内修改状态变量,尤其是@Link 变量的修改,可能会导致应用程序行为不稳定。

自定义组件的渲染流程:

  1. 自定义组件的实例由 ArkUI 框架创建
  2. 初始化自定义组件内的成员变量
  3. 如果组件组件内定义了 aboutToAppear,那么就执行它
  4. 在首次渲染的时候,执行 build 方法 渲染系统组件,如果子组件是自定义组件,那就先创建自定义组件的实例。首次渲染的时候,ArkUI 框架会记录状态变量和组件的映射关系,在状态变量发生改变的时候,就触发对应的组件刷新。
  5. 如果组件内定义了 onDidBuild,那么就会执行它。

组件被删除的时候:

  1. 在删除组件之前,将调用其aboutToDisappear生命周期函数,标记着该节点将要被销毁。ArkUI的节点删除机制是:后端节点直接从组件树上摘下,后端节点被销毁,对前端节点解引用,前端节点已经没有引用时,将被JS虚拟机垃圾回收。
  2. 自定义组件和它的变量将被删除,如果其有同步的变量,比如@Link、@Prop、@StorageLink,将从同步源上取消注册。

完整的代码如下:

import CommonConstants from "../common/constants/Contants";
import { TODO_DATA } from "../common/data/SouresData"

@Entry
@Component
struct ToDoList {
  @State title: string = '';

  onPageShow() {
    console.info('Index onPageShow');
  }

  onPageHide() {
    console.info('Index onPageHide');
  }

  onBackPress() {
    console.info('Index onBackPress');
    return true // 返回true表示页面自己处理返回逻辑,不进行页面路由;返回false表示使用默认的路由返回逻辑,不设置返回值按照false处理
  }

  aboutToAppear() {
    console.info('MyComponent aboutToAppear');
  }

  onDidBuild() {
    console.info('MyComponent onDidBuild');
  }

  aboutToDisappear() {
    console.info('MyComponent aboutToDisappear');
  }
  build() {
    Column() {
      Text(CommonConstants.TODO_TITLE)
        .id('ToDoListHelloWorld')
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .margin({
          bottom: 20
        })

      ForEach(TODO_DATA, (item: string) => {
        ToDoItem({ contents: item })
      }, (item: string) => item)
    }
    .margin({
      left: 10,
      top: 10
    })
  }
}


/**
 * 自定义的 Item 组件
 */
@Preview
@Component
struct ToDoItem {
  private contents?: string

  build() {
    Row() {
      Image($r("app.media.startIcon"))
        .width(50)
        .height(50)
        .margin({
          right:50
        })
      Text(this.contents)
        .fontSize(20)
        .margin({
          top: 15
        })
    }
    .margin({
      bottom:30
    })
  }
}
  • 24
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ArkTS 是一种基于 TypeScript 的构建工具,用于自动化前端项目的任务管理、依赖管理和代码转换等操作。它结合了 Webpack 和 Babel 等其他工具的优点,提供了一个强大的配置系统,适用于构建复杂的现代前端应用程序。 当你提到“ArkTS,父组件获取子组件的状态”,实际上这个描述与 ArkTS 并无直接关联,因为 ArkTS 主要是作为构建过程中的工具来使用的,并不会直接处理组件间的通信。但是,如果你想了解如何在 React 这样的框架中,通过类似的概念来实现父组件获取子组件状态的功能,我可以为你提供一些建议: ### 使用 React React 提供了几种基本的方式来让父组件访问子组件的状态: #### 1. **stateless functional components (SFC) + props** 在这种模式下,子组件通常是无状态的函数组件,它们从 `props` 接收数据并将其显示出来。父组件可以直接将需要传递给子组件的数据作为 `props` 来传入。 ```javascript // 父组件 function ParentComponent() { return ( <ChildComponent name="John" /> ); } // 子组件 function ChildComponent(props) { return <div>{props.name}</div>; } ``` #### 2. **stateful component with state** 在这个模型中,子组件可以有自己的状态,通常通过类组件或状态化的函数组件来实现。然后父组件可以通过回调函数或生命周期方法来更新子组件的状态。 ```javascript class ChildComponent extends React.Component { constructor(props) { super(props); this.state = { myState: 'initial' }; } updateMyState(newState) { // 更新子组件状态 this.setState(newState); } render() { return ( <div> State: {this.state.myState} {/* 更新状态时调用父组件的函数 */} Update state: <button onClick={() => this.props.updateState(this.state)}>Update</button> </div> ); } } // 父组件 function ParentComponent() { const [childState, setChildState] = useState('initial'); return ( <> {/* 向子组件提供更新状态的方法 */} <ChildComponent updateState={setChildState} /> {/* 显示当前子组件的状态 */} Current state: {childState} </> ); } ``` #### 3. **useRef hook** 对于更现代的实践,可以使用 React Hooks 中的 `useRef` 来存储子组件的状态引用,然后在父组件中通过这个引用去修改子组件的状态。 ```javascript import { useRef } from 'react'; function ParentComponent() { const childRef = useRef(null); function setState(newState) { if (childRef.current) { childRef.current.setState(newState); } } return ( <ChildComponent ref={childRef} /> /* 在这里可以监听或使用来自子组件的状态 */ ); } function ChildComponent({ ref }) { const [myState, setMyState] = useState('initial'); useEffect(() => { // 直接在这里访问或更新子组件的状态 console.log(myState); }, [myState]); // 如果有状态改变,你可以在这里触发外部状态的变化 // setMyState(nextState); } ``` ### 关联问题: 1. **如何在 React 中管理组件间的状态共享**? 2. **React 组件的状态管理最佳实践是什么**? 3. **在 React 应用中引入 Redux 或 MobX 进行复杂状态管理的好处是什么**?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

读心悦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值