• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 设置自定义节点跨语言属性
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @xiang-shouxing-->
5<!--Designer: @xiang-shouxing-->
6<!--Tester: @sally__-->
7<!--Adviser: @HelloCrease-->
8
9## 概述
10
11ArkUI支持在前端使用ArkTS语言创建命令式节点,即[FrameNode](../reference/apis-arkui/js-apis-arkui-frameNode.md)节点,也可以在Native侧使用C语言创建命令式节点,并且可以混合使用两类节点构建页面。
12
13针对上述场景,ArkUI提供命令式节点跨语言属性设置功能,即使用ArkTS语言创建的命令式节点,可以在Native侧进行属性设置。使用C语言创建的节点,可以在ArkTS侧进行属性设置。
14
15> **说明:**
16>
17> 下述示例中,需要先进行Native侧配置,请参考[接入ArkTS页面](./ndk-access-the-arkts-page.md)完成。
18
19## 设置和获取跨语言配置
20
21跨语言指的是跨越ArkTS语言和C语言。跨语言配置指的是命令式节点上对于跨语言操作的权限配置。
22
23可以通过[setCrossLanguageOptions](../reference/apis-arkui/js-apis-arkui-frameNode.md#setcrosslanguageoptions15)与[OH_ArkUI_NodeUtils_SetCrossLanguageOption](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_nodeutils_setcrosslanguageoption)接口设置当前节点的跨语言配置。如果当前节点无法修改或设置跨语言配置,则会抛出异常信息。
24
25可以使用[getCrossLanguageOptions](../reference/apis-arkui/js-apis-arkui-frameNode.md#getcrosslanguageoptions15)与[OH_ArkUI_NodeUtils_GetCrossLanguageOption](../reference/apis-arkui/capi-native-node-h.md#oh_arkui_nodeutils_getcrosslanguageoption)接口获取当前节点的跨语言配置。
26
27以下示例描述了如何设置和获取ArkTS命令式节点的跨语言配置。
28
29```ts
30import { NodeController, UIContext, FrameNode, typeNode, BuilderNode } from '@kit.ArkUI';
31
32@Builder
33function insideScroll() {
34  Column() {
35    ForEach([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], (item: number) => {
36      Text(item.toString())
37        .width("75%")
38        .height(50)
39        .backgroundColor(0xFFFFFF)
40        .borderRadius(15)
41        .fontSize(30)
42        .textAlign(TextAlign.Center)
43        .margin({ top: 10 })
44    }, (item: string) => item)
45  }
46  .width("100%")
47}
48
49class MyNodeController extends NodeController {
50  uiContext: UIContext | null = null;
51  rootNode: FrameNode | null = null;
52  scrollNode: FrameNode | null = null;
53  scroller: Scroller = new Scroller();
54
55  makeNode(uiContext: UIContext): FrameNode | null {
56    this.uiContext = uiContext;
57    this.rootNode = new FrameNode(uiContext);
58    this.rootNode.commonAttribute.width("80%").height("50%").borderWidth(2).margin(15);
59    const scroll = typeNode.createNode(uiContext, 'Scroll');
60    scroll.initialize(this.scroller).id("scroll");
61    this.scrollNode = scroll;
62    this.rootNode.appendChild(this.scrollNode);
63    const builderNode = new BuilderNode(uiContext);
64    builderNode.build(wrapBuilder(insideScroll));
65    this.scrollNode?.appendChild(builderNode.getFrameNode());
66    return this.rootNode;
67  }
68}
69
70@Entry
71@Component
72struct CrossLanguage {
73  myNodeController: MyNodeController = new MyNodeController()
74  @State attributeSetting: boolean = false;
75  @State getCrossLanguageOptions: string = '{"attributeSetting": false}';
76
77  build() {
78    Scroll() {
79      Column({ space: 15 }) {
80        Column() {
81          Scroll() {
82            Column() {
83              NodeContainer(this.myNodeController)
84              Button("setCrossLanguageOptions").margin({ bottom: 15})
85                .onClick(() => {
86                  this.attributeSetting = !this.attributeSetting;
87                  this.myNodeController.scrollNode?.setCrossLanguageOptions({
88                    attributeSetting: this.attributeSetting
89                  });
90                  // 若attributeSetting为true,表示scrollNode支持通过非ArkTS语言进行属性设置,否则为不支持
91                  this.getCrossLanguageOptions = JSON.stringify(this.myNodeController.scrollNode?.getCrossLanguageOptions());
92                })
93              Text("CrossLanguageOptions: " + this.getCrossLanguageOptions)
94            }
95          }.scrollBarColor(Color.Transparent)
96        }
97        .width('100%')
98        .height(350)
99        .backgroundColor(0xeeeeee)
100        .id('Part_TS')
101      }
102      .width('100%')
103    }.scrollBarColor(Color.Transparent)
104  }
105}
106```
107
108## 跨语言设置节点属性
109
110获取节点后,若节点的跨语言配置设置为允许属性设置,ArkTS侧可利用getAttribute接口获取修改Native节点属性的对象,Native侧可利用[setAttribute](../reference/apis-arkui/capi-arkui-nativemodule-arkui-nativenodeapi-1.md#setattribute)接口修改ArkTS节点属性。
111
112以下示例创建了ArkTS的[Scroll](../reference/apis-arkui/js-apis-arkui-frameNode.md#scroll12)类型节点,并在Native侧修改了Scroll的属性。
113
1141. 在ArkTS侧创建组件类型为Scroll的命令式节点。
115    ```ts
116    import nativeNode from 'libentry.so';
117    import { NodeController, UIContext, FrameNode, typeNode, BuilderNode, NodeContent } from '@kit.ArkUI';
118
119    @Builder
120    function insideScroll() {
121      Column() {
122        ForEach([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], (item: number) => {
123          Text(item.toString())
124            .width("75%")
125            .height(50)
126            .backgroundColor(0xFFFFFF)
127            .borderRadius(15)
128            .fontSize(30)
129            .textAlign(TextAlign.Center)
130            .margin({ top: 10 })
131        }, (item: string) => item)
132      }
133      .width("100%")
134    }
135
136    class MyNodeController extends NodeController {
137      uiContext: UIContext | null = null;
138      rootNode: FrameNode | null = null;
139      scrollNode: FrameNode | null = null;
140      scroller: Scroller = new Scroller();
141
142      makeNode(uiContext: UIContext): FrameNode | null {
143        this.uiContext = uiContext;
144        this.rootNode = new FrameNode(uiContext);
145        this.rootNode.commonAttribute.width("80%").height("50%").borderWidth(2).margin(15);
146        const scroll = typeNode.createNode(uiContext, 'Scroll');
147        scroll.initialize(this.scroller).id("scroll");
148        this.scrollNode = scroll;
149        this.rootNode.appendChild(this.scrollNode);
150        const builderNode = new BuilderNode(uiContext);
151        builderNode.build(wrapBuilder(insideScroll));
152        this.scrollNode?.appendChild(builderNode.getFrameNode());
153        return this.rootNode;
154      }
155    }
156
157    @Entry
158    @Component
159    struct CrossLanguage {
160      private myNodeController: MyNodeController = new MyNodeController();
161      @State attributeSetting: boolean = false;
162      @State getCrossLanguageOptions: string = '{"attributeSetting": false}';
163      private rootSlot = new NodeContent();
164
165      aboutToAppear(): void {
166        nativeNode.createNativeRoot(this.rootSlot);
167      }
168
169      build() {
170        Scroll() {
171          Column({ space: 15 }) {
172            Column() {
173              Scroll() {
174                Column() {
175                  NodeContainer(this.myNodeController)
176                  Button("setCrossLanguageOptions").margin({ bottom: 15})
177                    .onClick(() => {
178                      this.attributeSetting = !this.attributeSetting;
179                      this.myNodeController.scrollNode?.setCrossLanguageOptions({
180                        attributeSetting: this.attributeSetting
181                      });
182                      // 若attributeSetting为true,表示scrollNode支持通过非ArkTS语言进行属性设置,否则为不支持
183                      this.getCrossLanguageOptions = JSON.stringify(this.myNodeController.scrollNode?.getCrossLanguageOptions());
184                    })
185                  Text("CrossLanguageOptions: " + this.getCrossLanguageOptions)
186                }
187              }.scrollBarColor(Color.Transparent)
188            }
189            .width('100%')
190            .height(350)
191            .backgroundColor(0xeeeeee)
192            .id('Part_TS')
193
194            Column() {
195              ContentSlot(this.rootSlot)
196            }
197            .width(500)
198            .height(400)
199            .id('Part_C')
200          }
201          .width('100%')
202        }.scrollBarColor(Color.Transparent)
203      }
204    }
205    ```
206
2072. 新建`CrossLanguageExample.h`文件,在其中获取到目标节点(该节点在ArkTS侧创建),并设置属性。
208    ```c
209    #ifndef MYAPPLICATION_CROSSLANGUAGEEXAMPLE_H
210    #define MYAPPLICATION_CROSSLANGUAGEEXAMPLE_H
211
212    #include "ArkUINode.h"
213    #include <hilog/log.h>
214
215    namespace NativeModule {
216
217    std::shared_ptr<ArkUIBaseNode> CreateCrossLanguageExample() {
218        auto nodeAPI = NativeModuleInstance::GetInstance()->GetNativeNodeAPI();
219
220        // 创建根节点Scroll
221        ArkUI_NodeHandle scroll = nodeAPI->createNode(ARKUI_NODE_SCROLL);
222        ArkUI_NumberValue length_value[] = {{.f32 = 480}};
223        ArkUI_AttributeItem length_item = {length_value, sizeof(length_value) / sizeof(ArkUI_NumberValue)};
224        nodeAPI->setAttribute(scroll, NODE_WIDTH, &length_item);
225        ArkUI_NumberValue length_value1[] = {{.f32 = 650}};
226        ArkUI_AttributeItem length_item1 = {length_value1, sizeof(length_value1) / sizeof(ArkUI_NumberValue)};
227        nodeAPI->setAttribute(scroll, NODE_HEIGHT, &length_item1);
228        ArkUI_AttributeItem scroll_id = {.string = "Scroll_CAPI"};
229        nodeAPI->setAttribute(scroll, NODE_ID, &scroll_id);
230
231        // 创建Column
232        ArkUI_NodeHandle column = nodeAPI->createNode(ARKUI_NODE_COLUMN);
233        ArkUI_NumberValue value[] = {480};
234        ArkUI_AttributeItem item = {value, sizeof(value) / sizeof(ArkUI_NumberValue)};
235        nodeAPI->setAttribute(column, NODE_WIDTH, &item);
236        ArkUI_NumberValue column_bc[] = {{.u32 = 0xFFF00BB}};
237        ArkUI_AttributeItem column_item = {column_bc, 1};
238        nodeAPI->setAttribute(column, NODE_BACKGROUND_COLOR, &column_item);
239        ArkUI_AttributeItem column_id = {.string = "Column_CAPI"};
240        nodeAPI->setAttribute(column, NODE_ID, &column_id);
241
242        // 创建Text
243        ArkUI_NodeHandle text0 = nodeAPI->createNode(ARKUI_NODE_TEXT);
244        ArkUI_NumberValue text_width[] = {300};
245        ArkUI_AttributeItem text_item0 = {text_width, sizeof(text_width) / sizeof(ArkUI_NumberValue)};
246        nodeAPI->setAttribute(text0, NODE_WIDTH, &text_item0);
247        ArkUI_NumberValue text_height[] = {50};
248        ArkUI_AttributeItem text_item1 = {text_height, sizeof(text_height) / sizeof(ArkUI_NumberValue)};
249        nodeAPI->setAttribute(text0, NODE_HEIGHT, &text_item1);
250        ArkUI_AttributeItem text_item = {.string = "C设置TS创建的节点属性"};
251        nodeAPI->setAttribute(text0, NODE_TEXT_CONTENT, &text_item);
252        ArkUI_NumberValue margin[] = {10};
253        ArkUI_AttributeItem item_margin = {margin, sizeof(margin) / sizeof(ArkUI_NumberValue)};
254        nodeAPI->setAttribute(text0, NODE_MARGIN, &item_margin);
255
256        // 创建Row
257        ArkUI_NodeHandle row0 = nodeAPI->createNode(ARKUI_NODE_ROW);
258        ArkUI_NumberValue width_value[] = {{.f32=330}};
259        ArkUI_AttributeItem width_item = {width_value, sizeof(width_value) / sizeof(ArkUI_NumberValue)};
260        nodeAPI->setAttribute(row0, NODE_WIDTH, &width_item);
261        nodeAPI->setAttribute(row0, NODE_HEIGHT, &text_item1);
262        nodeAPI->setAttribute(row0, NODE_MARGIN, &item_margin);
263
264        // 创建Button
265        ArkUI_NodeHandle bt0 = nodeAPI->createNode(ARKUI_NODE_BUTTON);
266        ArkUI_NumberValue btn_width[] = {150};
267        ArkUI_AttributeItem btn_item0 = {btn_width, sizeof(btn_width) / sizeof(ArkUI_NumberValue)};
268        nodeAPI->setAttribute(bt0, NODE_WIDTH, &btn_item0);
269        nodeAPI->setAttribute(bt0, NODE_HEIGHT, &text_item1);
270        nodeAPI->setAttribute(bt0, NODE_MARGIN, &item_margin);
271        ArkUI_AttributeItem bt0_item = {.string = "scrollBarColor"};
272        nodeAPI->setAttribute(bt0, NODE_BUTTON_LABEL, &bt0_item);
273        nodeAPI->registerNodeEvent(bt0, NODE_ON_CLICK, 0, nullptr);
274
275        ArkUI_NodeHandle bt1 = nodeAPI->createNode(ARKUI_NODE_BUTTON);
276        nodeAPI->setAttribute(bt1, NODE_WIDTH, &btn_item0);
277        nodeAPI->setAttribute(bt1, NODE_HEIGHT, &text_item1);
278        nodeAPI->setAttribute(bt1, NODE_MARGIN, &item_margin);
279        ArkUI_AttributeItem bt1_item = {.string = "scrollBarWidth"};
280        nodeAPI->setAttribute(bt1, NODE_BUTTON_LABEL, &bt1_item);
281        nodeAPI->registerNodeEvent(bt1, NODE_ON_CLICK, 1, nullptr);
282
283        // 注册事件
284        auto onClick = [](ArkUI_NodeEvent *event) {
285            ArkUI_NodeHandle node = OH_ArkUI_NodeEvent_GetNodeHandle(event);
286            auto nodeAPI = NativeModuleInstance::GetInstance()->GetNativeNodeAPI();
287
288            if (OH_ArkUI_NodeEvent_GetTargetId(event) == 0) {  // scrollBarColor
289                ArkUI_NodeHandle node_ptr = nullptr;
290                OH_ArkUI_NodeUtils_GetAttachedNodeHandleById("scroll", &node_ptr);
291                try {
292                    ArkUI_NumberValue scroll_color_value[] = {{.u32 = 0xff00ff00}};
293                    ArkUI_AttributeItem scroll_color_item = {scroll_color_value, sizeof(scroll_color_value) / sizeof(ArkUI_NumberValue)};
294                    nodeAPI->setAttribute(node_ptr, NODE_SCROLL_BAR_COLOR, &scroll_color_item);
295                } catch (...) {
296                    OH_LOG_Print(LOG_APP, LOG_ERROR, 0xFF00, "CrossLanguageExample", "crossLanguage setAttribute error");
297                }
298            }
299
300            if (OH_ArkUI_NodeEvent_GetTargetId(event) == 1) {  // scrollBarWidth
301                ArkUI_NodeHandle node_ptr = nullptr;
302                OH_ArkUI_NodeUtils_GetAttachedNodeHandleById("scroll", &node_ptr);
303                try {
304                    ArkUI_NumberValue scroll_width_value[] = {{20}};
305                    ArkUI_AttributeItem scroll_width_item = {scroll_width_value, sizeof(scroll_width_value) / sizeof(ArkUI_NumberValue)};
306                    nodeAPI->setAttribute(node_ptr, NODE_SCROLL_BAR_WIDTH, &scroll_width_item);
307                } catch (...) {
308                    OH_LOG_Print(LOG_APP, LOG_ERROR, 0xFF00, "CrossLanguageExample", "crossLanguage setAttribute error");
309                }
310            }
311        };
312        nodeAPI->registerNodeEventReceiver(onClick);
313
314        // 节点添加
315        nodeAPI->addChild(scroll, column);
316        nodeAPI->addChild(column, text0);
317        nodeAPI->addChild(column, row0);
318        nodeAPI->addChild(row0, bt0);
319        nodeAPI->addChild(row0, bt1);
320
321        return std::make_shared<ArkUINode>(scroll);
322    }
323    } // namespace NativeModule
324
325    #endif //MYAPPLICATION_CROSSLANGUAGEEXAMPLE_H
326    ```
327
3283. 在`NativeEntry.cpp`中,挂载Native节点。
329    ```c
330    // NativeEntry.cpp
331
332
333    #include <arkui/native_node_napi.h>
334    #include <hilog/log.h>
335    #include <js_native_api.h>
336    #include "NativeEntry.h"
337    #include "CrossLanguageExample.h"
338
339
340    namespace NativeModule {
341
342
343    napi_value CreateNativeRoot(napi_env env, napi_callback_info info) {
344        size_t argc = 1;
345        napi_value args[1] = {nullptr};
346
347
348        napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
349
350
351        // 获取NodeContent
352        ArkUI_NodeContentHandle contentHandle;
353        OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &contentHandle);
354        NativeEntry::GetInstance()->SetContentHandle(contentHandle);
355
356
357        // 创建节点
358        auto node = CreateCrossLanguageExample();
359
360
361        // 保持Native侧对象到管理类中,维护生命周期。
362        NativeEntry::GetInstance()->SetRootNode(node);
363        return nullptr;
364    }
365
366
367    napi_value DestroyNativeRoot(napi_env env, napi_callback_info info) {
368        // 从管理类中释放Native侧对象。
369        NativeEntry::GetInstance()->DisposeRootNode();
370        return nullptr;
371    }
372
373
374    } // namespace NativeModule
375    ```
376
3774. 运行程序,在ArkTS侧点击按钮,设置当前attributeSetting为true,在Native侧点击按钮,设置ArkTS侧Scroll组件滚动条的颜色和粗细属性。
378
379![crossLanguageDemo](figures/crossLanguageDemo.gif)
380
381## 支持跨语言设置属性的节点类型
382
383仅以下节点类型支持跨语言设置节点属性。
384
385| ArkTS侧[TypedFrameNode](../reference/apis-arkui/js-apis-arkui-frameNode.md#typedframenode12)类型 | Native侧[ArkUI_NodeType](../reference/apis-arkui/capi-native-node-h.md#arkui_nodetype)类型 | ArkTS属性获取接口 | ArkTS控制器获取/绑定接口 |
386| -------- | -------- | -------- | -------- |
387| [Button](../reference/apis-arkui/js-apis-arkui-frameNode.md#button12) | ARKUI_NODE_BUTTON | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributebutton20) | NA |
388| [Checkbox](../reference/apis-arkui/js-apis-arkui-frameNode.md#checkbox18) | ARKUI_NODE_CHECKBOX | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributecheckbox20) | NA |
389| [Radio](../reference/apis-arkui/js-apis-arkui-frameNode.md#radio18) | ARKUI_NODE_RADIO | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributeradio20) | NA |
390| [Slider](../reference/apis-arkui/js-apis-arkui-frameNode.md#slider18) | ARKUI_NODE_SLIDER | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributeslider20) | NA |
391| [Toggle](../reference/apis-arkui/js-apis-arkui-frameNode.md#toggle18) | ARKUI_NODE_TOGGLE | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributetoggle20) | NA |
392| [Progress](../reference/apis-arkui/js-apis-arkui-frameNode.md#progress12) | ARKUI_NODE_PROGRESS | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributeprogress20) | NA |
393| [LoadingProgress](../reference/apis-arkui/js-apis-arkui-frameNode.md#loadingprogress12) | ARKUI_NODE_LOADING_PROGRESS | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributeloadingprogress20) | NA |
394| [Image](../reference/apis-arkui/js-apis-arkui-frameNode.md#image12) | ARKUI_NODE_IMAGE | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributeimage20) | NA |
395| [XComponent](../reference/apis-arkui/js-apis-arkui-frameNode.md#xcomponent12) | ARKUI_NODE_XCOMPONENT | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributexcomponent20) | getController |
396| [Column](../reference/apis-arkui/js-apis-arkui-frameNode.md#column12) | ARKUI_NODE_COLUMN | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributecolumn20) | NA |
397| [Row](../reference/apis-arkui/js-apis-arkui-frameNode.md#row12) | ARKUI_NODE_ROW | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributerow20) | NA |
398| [Stack](../reference/apis-arkui/js-apis-arkui-frameNode.md#stack12) | ARKUI_NODE_STACK | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributestack20) | NA |
399| [Flex](../reference/apis-arkui/js-apis-arkui-frameNode.md#flex12) | ARKUI_NODE_FLEX | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributeflex20) | NA |
400| [RelativeContainer](../reference/apis-arkui/js-apis-arkui-frameNode.md#relativecontainer12) | ARKUI_NODE_RELATIVE_CONTAINER | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributerelativecontainer20) | NA |
401| [Swiper](../reference/apis-arkui/js-apis-arkui-frameNode.md#swiper12) | ARKUI_NODE_SWIPER | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributeswiper20) | [bindController](../reference/apis-arkui/js-apis-arkui-frameNode.md#bindcontrollerswiper20) |
402| [Scroll](../reference/apis-arkui/js-apis-arkui-frameNode.md#scroll12) | ARKUI_NODE_SCROLL | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributescroll15) | [bindController](../reference/apis-arkui/js-apis-arkui-frameNode.md#bindcontrollerscroll15) |
403| [List](../reference/apis-arkui/js-apis-arkui-frameNode.md#list12) | ARKUI_NODE_LIST | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributelist20) | [bindController](../reference/apis-arkui/js-apis-arkui-frameNode.md#bindcontrollerlist20) |
404| [ListItem](../reference/apis-arkui/js-apis-arkui-frameNode.md#listitem12) | ARKUI_NODE_LIST_ITEM | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributelistitem20) | NA |
405| [ListItemGroup](../reference/apis-arkui/js-apis-arkui-frameNode.md#listitemgroup12) | ARKUI_NODE_LIST_ITEM_GROUP | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributelistitemgroup20) | NA |
406| [WaterFlow](../reference/apis-arkui/js-apis-arkui-frameNode.md#waterflow12) | ARKUI_NODE_WATER_FLOW | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributewaterflow20) | [bindController](../reference/apis-arkui/js-apis-arkui-frameNode.md#bindcontrollerwaterflow20) |
407| [FlowItem](../reference/apis-arkui/js-apis-arkui-frameNode.md#flowitem12) | ARKUI_NODE_FLOW_ITEM | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributeflowitem20) | NA |
408| [Grid](../reference/apis-arkui/js-apis-arkui-frameNode.md#grid14) | ARKUI_NODE_GRID | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributegrid20) | [bindController](../reference/apis-arkui/js-apis-arkui-frameNode.md#bindcontrollergrid20) |
409| [GridItem](../reference/apis-arkui/js-apis-arkui-frameNode.md#griditem14) | ARKUI_NODE_GRID_ITEM | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributegriditem20) | NA |
410| [Text](../reference/apis-arkui/js-apis-arkui-frameNode.md#text12) | ARKUI_NODE_TEXT | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributetext20) | [bindController](../reference/apis-arkui/js-apis-arkui-frameNode.md#bindcontrollertext20) |
411| [TextInput](../reference/apis-arkui/js-apis-arkui-frameNode.md#textinput12) | ARKUI_NODE_TEXT_INPUT | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributetextinput20) | [bindController](../reference/apis-arkui/js-apis-arkui-frameNode.md#bindcontrollertextinput20) |
412| [TextArea](../reference/apis-arkui/js-apis-arkui-frameNode.md#textarea14) | ARKUI_NODE_TEXT_AREA | [getAttribute](../reference/apis-arkui/js-apis-arkui-frameNode.md#getattributetextarea20) | [bindController](../reference/apis-arkui/js-apis-arkui-frameNode.md#bindcontrollertextarea20) |