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: 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通过NodeController挂载BuilderNode节点。
43
44```ts
45import { NodeController, BuilderNode, FrameNode, UIContext } from '@kit.ArkUI';
46
47declare class Params {
48  text: string
49}
50
51@Builder
52function buttonBuilder(params: Params) {
53  Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceEvenly }) {
54    Text(params.text)
55      .fontSize(12)
56    Button(`This is a Button`, { type: ButtonType.Normal, stateEffect: true })
57      .fontSize(12)
58      .borderRadius(8)
59      .backgroundColor(0x317aff)
60  }
61  .height(100)
62  .width(200)
63}
64
65class MyNodeController extends NodeController {
66  private rootNode: BuilderNode<[Params]> | null = null;
67  private wrapBuilder: WrappedBuilder<[Params]> = wrapBuilder(buttonBuilder);
68
69  makeNode(uiContext: UIContext): FrameNode | null {
70    if (this.rootNode === null) {
71      this.rootNode = new BuilderNode(uiContext);
72      this.rootNode.build(this.wrapBuilder, { text: "This is a Text" })
73    }
74    return this.rootNode.getFrameNode();
75  }
76}
77
78
79@Entry
80@Component
81struct Index {
82  private baseNode: MyNodeController = new MyNodeController()
83
84  build() {
85    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Start, justifyContent: FlexAlign.SpaceEvenly }) {
86      Text("This is a NodeContainer contains a text and a button ")
87        .fontSize(9)
88        .fontColor(0xCCCCCC)
89      NodeContainer(this.baseNode)
90        .borderWidth(1)
91        .onClick(() => {
92          console.log("click event");
93        })
94    }
95    .padding({ left: 35, right: 35, top: 35 })
96    .height(200)
97    .width(300)
98  }
99}
100```
101![patternlock](figures/nodeContainer_sample.jpg)