首页 > 建站教程 > APP开发,混合APP >  探索HarmonyOS的自定义组件内置方法正文

探索HarmonyOS的自定义组件内置方法

ArkUI开发框架里的自定义组件内置方法,这些可是应用开发者的超级帮手,能让你轻松获取组件实例的各种信息,比如上下文、唯一ID啥的。文档里介绍了几个关键方法,我会用大白话总结每个的重点,配上实际代码示例,让你一看就懂。


1. getUIContext() 方法

重点总结: 这个方法超级实用,它能帮你拿到当前组件的UIContext对象,简单说就是组件的“环境信息”,比如屏幕尺寸、主题设置等。你可以在组件的生命周期里调用它,比如在aboutToAppear函数中。它支持Phone、PC、平板等设备,从API 12起还能在元服务里用。返回值直接是个UIContext实例,用起来超方便。下面代码里,我在MyComponent的aboutToAppear里调用了它,把UIContext存到变量里,后续就能用来干各种事,比如调整UI布局。


代码示例:

import { UIContext } from '@kit.ArkUI';
@Entry
@Component
struct MyComponent {
  aboutToAppear() {
    let uiContext: UIContext = this.getUIContext(); // 获取UIContext对象
    // 现在可以用uiContext做操作了,比如查询设备信息
  }
 
  build() {
    // 构建UI的代码放这里
    Column() {
      Text('Hello, ArkUI!')
    }
  }
}

2. getUniqueId() 方法

重点总结: 这个方法专治“组件身份识别”问题!它能返回当前组件的UniqueId,也就是系统分配的独一无二的ID,保证整个应用里不重复。超有用在调试或跟踪组件状态时。注意:如果组件节点还没创建或已销毁,它会返回-1(无效ID)。支持设备同上,从API 12起元服务也能用。返回值是个数字,直接拿来用就行。代码里,我在aboutToAppear里调用它,把ID存起来,方便后续日志输出或状态管理。

代码示例:

@Entry
@Component
struct MyComponent {
  aboutToAppear() {
    let uniqueId: number = this.getUniqueId(); // 获取组件的UniqueId
    console.log('My Unique ID is: ' + uniqueId); // 输出到控制台
  }
 
  build() {
    // 构建UI
    Column() {
      Button('Click Me')
    }
  }
}

3. queryNavDestinationInfo() 方法(无参数版本)

重点总结: 这个方法帮你查导航信息,特别适合用在NavDestination组件里。它能返回NavDestinationInfo对象,包含导航目标的详情,比如页面名称。但有个前提:你的自定义组件必须在NavDestination内部才生效,否则返回undefined。从API 12起支持元服务。返回值是NavDestinationInfo或undefined,记得检查空值。代码示例中,我在MyComponent的aboutToAppear里调用它,向上查找最近的NavDestination父节点,并把信息打印出来,超适合做页面路由跟踪。

代码示例:

import { uiObserver } from '@kit.ArkUI';
 
@Component
export struct NavDestinationExample {
  build() {
    NavDestination() {
      MyComponent() // 自定义组件在NavDestination内部
    }
  }
}
 
@Component
struct MyComponent {
  navDesInfo: uiObserver.NavDestinationInfo | undefined;
 
  aboutToAppear() {
    this.navDesInfo = this.queryNavDestinationInfo(); // 查询NavDestination信息
    console.log('NavDestination Info: ' + JSON.stringify(this.navDesInfo));
  }
 
  build() {
    Column() {
      Text('Check Nav Info')
    }
  }
}

4. queryNavDestinationInfo(isInner: Optional<boolean>) 方法(有参数版本)

重点总结: 这是上个方法的升级版,从API 18开始,加了isInner参数,让你更灵活地查导航栈。参数isInner是必填的boolean:true表示“向内”查最近的NavDestination(在栈内),false表示“向外”查。同样,只在组件在NavDestination内有效,支持元服务。返回值还是NavDestinationInfo或undefined。代码里展示了完整场景:在PageOneComponent中,按钮点击时根据isInner值查询导航信息,并更新UI显示。这方法超适合动态路由应用,比如单页面App的导航控制。

代码示例:

// PageOne.ets
import { uiObserver } from '@kit.ArkUI';
 
@Builder
export function PageOneBuilder() {
  PageOneComponent()
}
 
@Component
export struct PageOneComponent {
  navDesInfo: uiObserver.NavDestinationInfo | undefined;
  @State text: string = '';
 
  build() {
    NavDestination() {
      Column() {
        Button('点击向内查找')
          .onClick(() => {
            this.navDesInfo = this.queryNavDestinationInfo(true); // 向内查询
            this.text = JSON.stringify(this.navDesInfo?.name).toString();
          })
        Text('向内查找的NavDestination是:' + this.text)
        MyComponent()
      }
    }
    .title('pageOne')
  }
}
 
@Component
struct MyComponent {
  navDesInfo: uiObserver.NavDestinationInfo | undefined;
  @State text: string = '';
 
  build() {
    Column() {
      Button('点击向外查找')
        .onClick(() => {
          this.navDesInfo = this.queryNavDestinationInfo(false); // 向外查询
          this.text = JSON.stringify(this.navDesInfo?.name).toString();
        })
      Text('向外查找的NavDestination是:' + this.text)
    }
  }
}
 
// route_map.json
{
  "routerMap": [
    {
      "name": "pageOne",
      "pageSourceFile": "src/main/ets/pages/PageOne.ets",
      "buildFunction": "PageOneBuilder",
      "data": { "description": "this is pageOne" }
    }
  ]
}


5. queryNavigationInfo() 方法

重点总结: 这个方法聚焦在Navigation组件上,能返回NavigationInfo对象,包含整个导航栈的信息,比如路径堆栈。它要求组件在Navigation内部调用,否则返回undefined。从API 12起支持元服务。返回值是NavigationInfo或undefined,适合用在页面初始化时获取导航状态。代码示例里,我在PageOne组件的aboutToAppear里调用它,向上查Navigation父节点,并更新路径堆栈。这招在管理多级导航时超省心,比如电商App的页面跳转。

代码示例:

// index.ets
import { uiObserver } from '@kit.ArkUI';
 
@Entry
@Component
struct MainPage {
  pathStack: NavPathStack = new NavPathStack();
 
  build() {
    Navigation(this.pathStack) {
      // 导航内容
    }
    .id("NavigationId")
  }
}
 
@Component
export struct PageOne {
  pathStack: NavPathStack = new NavPathStack();
 
  aboutToAppear() {
    let navigationInfo: uiObserver.NavigationInfo | undefined = this.queryNavigationInfo(); // 查询Navigation信息
    console.log('Navigation Info: ' + JSON.stringify(navigationInfo));
    if (navigationInfo != undefined) {
      this.pathStack = navigationInfo.pathStack; // 更新路径堆栈
    }
  }
 
  build() {
    NavDestination() {
      Column() {
        Text('Navigation Page')
      }
    }
    .title('PageOne')
  }
}

6. queryRouterPageInfo() 方法

重点总结: 这个方法专攻路由页面信息,返回RouterPageInfo对象,包含页面源文件、构建函数等细节。从API 12起支持元服务,返回值是RouterPageInfo或undefined。调用时机最好在组件生命周期早期,比如aboutToAppear。它帮你动态获取页面配置,不用硬编码。代码里,我在MyComponent初始化时调用它,把信息存起来,后续可用于日志或路由优化。这在大型应用中超实用,比如根据页面信息加载不同资源。

代码示例:

import { uiObserver } from '@kit.ArkUI';
 
@Entry
@Component
struct MyComponent {
  aboutToAppear() {
    let info: uiObserver.RouterPageInfo | undefined = this.queryRouterPageInfo(); // 获取路由页面信息
    if (info) {
      console.log('Page Source: ' + info.pageSourceFile);
    }
  }
 
  build() {
    Column() {
      Button('Get Page Info')
    }
  }
}

7. getDialogController() 方法

重点总结: 这个方法处理自定义弹窗控制,返回PromptActionDialogController对象,让你能关弹窗或管理状态。从API 18开始,支持元服务。返回值是PromptActionDialogController或undefined,记得检查空值。它常和弹窗组件配合使用,比如在按钮点击事件里调用。代码示例展示了完整流程:在MyComponent里,按钮点击时获取控制器并关弹窗;在Index里,用openCustomDialog打开弹窗。这方法让弹窗交互变得超灵活,适合表单确认或消息提示。

代码示例:

import { BusinessError } from '@kit.BasicServicesKit';
import { ComponentContent } from '@kit.ArkUI';
 
class Params {
  text: string = "";
  constructor(text: string) {
    this.text = text;
  }
}
 
@ComponentV2
struct MyComponent {
  build() {
    Column() {
      Button('Close Dialog')
        .onClick(() => {
          let ctrl: PromptActionDialogController | undefined = this.getDialogController(); // 获取弹窗控制器
          if (ctrl != undefined) {
            ctrl.close(); // 关闭弹窗
          }
        })
    }
  }
}
 
@Builder
function buildText(params: Params) {
  Column() {
    Text(params.text)
      .fontSize(50)
      .fontWeight(FontWeight.Bold)
      .margin({ bottom: 36 })
    MyComponent()
  }
  .backgroundColor('#FFF0F0F0')
}
 
@Entry
@ComponentV2
struct Index {
  @Local message: string = "hello";
 
  build() {
    Row() {
      Column({ space: 10 }) {
        Button('click me')
          .fontSize(20)
          .onClick(() => {
            let ctx = this.getUIContext();
            let promptAction = ctx.getPromptAction();
            promptAction.openCustomDialog(new ComponentContent(ctx, wrapBuilder(buildText), new Params(this.message)))
              .catch((err: BusinessError) => {
                console.error("openCustomDialog error: " + err.code + " " + err.message);
              })
          })
      }
      .width('100%')
      .height('100%')
    }
    .height('100%')
  }
}

总结一下

这些自定义组件内置方法真是开发利器!getUIContext帮你拿环境信息,getUniqueId确保组件唯一性,queryNavDestinationInfo和queryNavigationInfo处理导航细节,queryRouterPageInfo管理路由,getDialogController控制弹窗。每个都带代码示例,上手超快。记住,从API 11起支持,新功能在后续版本添加。多用这些方法,你的ArkUI应用会更高效、更稳定。