1# NodeContainer
2
3基础组件,不支持尾随添加子节点。组件接受一个[NodeController](../js-apis-arkui-nodeController.md)的实例接口。需要NodeController组合使用。
4
5> **说明:**
6>
7> 该组件从API Version 11开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8>
9> 该组件下仅支持挂载自定义节点[FrameNode](../js-apis-arkui-frameNode.md)或者是[BuilderNode](../js-apis-arkui-builderNode.md)中获取的根节点FrameNode。
10> 不支持挂载查询获得的原生系统组件[代理节点](../js-apis-arkui-frameNode.md#ismodifiable12)。
11>
12> 当前不支持使用[动态属性设置](./ts-universal-attributes-attribute-modifier.md)
13## 子组件
14
15不支持子组件。
16
17## 接口
18
19### NodeContainer
20
21NodeContainer(controller: import('../api/@ohos.arkui.node').NodeController)
22
23**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
24
25**系统能力:** SystemCapability.ArkUI.ArkUI.Full
26
27**参数:**
28
29| 参数名     | 类型                                                 | 必填 | 说明                                                         |
30| ---------- | ---------------------------------------------------- | ---- | ------------------------------------------------------------ |
31| controller | [NodeController](../js-apis-arkui-nodeController.md) | 是   | NodeController用于控制NodeContainer中的节点的上树和下树,反映NodeContainer容器的生命周期。 |
32## 属性
33
34支持[通用属性](ts-universal-attributes-size.md)
35
36## 事件
37
38支持[通用事件](ts-universal-events-click.md)。
39
40## 示例
41
42```ts
43import { NodeController, BuilderNode, FrameNode, UIContext } from '@kit.ArkUI';
44
45declare class Params {
46  text: string
47}
48
49@Builder
50function buttonBuilder(params: Params) {
51  Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceEvenly }) {
52    Text(params.text)
53      .fontSize(12)
54    Button(`This is a Button`, { type: ButtonType.Normal, stateEffect: true })
55      .fontSize(12)
56      .borderRadius(8)
57      .backgroundColor(0x317aff)
58  }
59  .height(100)
60  .width(200)
61}
62
63class MyNodeController extends NodeController {
64  private rootNode: BuilderNode<[Params]> | null = null;
65  private wrapBuilder: WrappedBuilder<[Params]> = wrapBuilder(buttonBuilder);
66
67  makeNode(uiContext: UIContext): FrameNode | null {
68    if (this.rootNode === null) {
69      this.rootNode = new BuilderNode(uiContext);
70      this.rootNode.build(this.wrapBuilder, { text: "This is a Text" })
71    }
72    return this.rootNode.getFrameNode();
73  }
74}
75
76
77@Entry
78@Component
79struct Index {
80  private baseNode: MyNodeController = new MyNodeController()
81
82  build() {
83    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceEvenly }) {
84      Text("This is a NodeContainer contains a text and a button ")
85        .fontSize(9)
86        .fontColor(0xCCCCCC)
87      NodeContainer(this.baseNode)
88        .borderWidth(1)
89        .onClick(() => {
90          console.log("click event");
91        })
92    }
93    .padding({ left: 35, right: 35, top: 35 })
94    .height(200)
95    .width(300)
96  }
97}
98```
99![patternlock](figures/nodeContainer_sample.jpg)