• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# TreeView
2
3
4树视图作为一种分层显示的列表,适合显示嵌套结构。拥有父列表项和子列表项,可展开或折叠。
5
6
7用于效率型应用,如备忘录、电子邮件、图库中的侧边导航栏中。
8
9
10> **说明:**
11>
12> 该组件从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
13>
14> 该组件不支持在Wearable设备上使用。
15
16
17## 导入模块
18
19```
20import { TreeView } from "@kit.ArkUI";
21```
22
23
24## 子组件
25
2627
28## 属性
29不支持[通用属性](ts-component-general-attributes.md)。
30
31## TreeView
32
33TreeView({ treeController: TreeController })
34
35**装饰器类型:**\@Component
36
37**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
38
39**系统能力:** SystemCapability.ArkUI.ArkUI.Full
40
41
42| 名称 | 类型 | 必填 | 说明 |
43| -------- | -------- | -------- | -------- |
44| treeController | [TreeController](#treecontroller) | 是 | 树视图节点信息。 |
45
46
47## TreeController
48
49树视图组件的控制器,可以将此对象绑定至树视图组件,然后通过它控制树的节点信息,同一个控制器不可以控制多个树视图组件。
50
51**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
52
53**系统能力:** SystemCapability.ArkUI.ArkUI.Full
54
55
56### addNode
57
58
59addNode(nodeParam?: NodeParam): TreeController
60
61点击某个节点后,调用该方法可以触发新增孩子节点。
62
63**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
64
65**系统能力:** SystemCapability.ArkUI.ArkUI.Full
66
67
68| 名称 | 类型 | 必填 | 说明 |
69| -------- | -------- | -------- | -------- |
70| nodeParam | [NodeParam](#nodeparam) | 否 | 节点信息。 |
71
72**返回值:**
73
74| 类型                              | 说明                 |
75| --------------------------------- | -------------------- |
76| [TreeController](#treecontroller) | 树视图组件的控制器。 |
77
78### removeNode
79
80removeNode(): void
81
82点击某个节点后,调用该方法可以触发删除该节点。
83
84**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
85
86**系统能力:** SystemCapability.ArkUI.ArkUI.Full
87
88
89### modifyNode
90
91
92modifyNode(): void
93
94点击某个节点后,调用该方法可以触发修改该节点。
95
96**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
97
98**系统能力:** SystemCapability.ArkUI.ArkUI.Full
99
100
101### buildDone
102
103buildDone(): void
104
105建立树视图。节点增加完毕后,必须调用该方法,触发树信息的保存。
106
107**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
108
109**系统能力:** SystemCapability.ArkUI.ArkUI.Full
110
111
112### refreshNode
113
114refreshNode(parentId: number, parentSubTitle: ResourceStr, currentSubtitle: ResourceStr): void
115
116更新树视图。调用该方法,更新当前节点的信息。
117
118**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
119
120**系统能力:** SystemCapability.ArkUI.ArkUI.Full
121
122| 名称 | 类型 | 必填 | 说明 |
123| -------- | -------- | -------- | -------- |
124| parentId | number | 是 | 父节点Id。 |
125| parentSubTitle | [ResourceStr](ts-types.md#resourcestr) | 是 | 父节点副文本。 |
126| currentSubtitle | [ResourceStr](ts-types.md#resourcestr) | 是 | 当前节点副文本。 |
127
128## NodeParam
129
130**系统能力:** SystemCapability.ArkUI.ArkUI.Full
131
132| 名称 | 类型 | 必填 | 说明                                                                                                                                               |
133| -------- | -------- | -------- |--------------------------------------------------------------------------------------------------------------------------------------------------|
134| parentNodeId | number | 否 | 父节点。<br />取值范围:大于等于-1。<br />默认值:-1,根节点id值为-1。若设置数值小于-1,做不生效处理。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                               |
135| currentNodeId | number | 否 | 当前子节点。<br />取值范围:大于等于-1。<br />不能为根节点id,不能为null,否则会抛出异常。且不能设置两个相同的currentNodeId。<br />默认值:-1 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
136| isFolder | boolean | 否 | 是否是目录。默认值:false。true:是目录,false:不是目录。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                                         |
137| icon | [ResourceStr](ts-types.md#resourcestr) | 否 | 图标。<br/>默认值:空字符串  <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                                                           |
138| symbolIconStyle<sup>18+</sup> | [SymbolGlyphModifier](ts-universal-attributes-attribute-modifier.md) | 否 | Symbol图标,优先级大于icon。<br/>默认值:undefined <br/>**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。                                                       |
139| selectedIcon | [ResourceStr](ts-types.md#resourcestr) | 否 | 选中图标。<br/>默认值:空字符串  <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                                                         |
140| symbolSelectedIconStyle<sup>18+</sup> | [SymbolGlyphModifier](ts-universal-attributes-attribute-modifier.md) | 否 | Symbol选中图标,优先级大于selectedIcon。<br/>默认值:undefined <br/>**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。                                             |
141| editIcon | [ResourceStr](ts-types.md#resourcestr) | 否 | 编辑图标。<br/>默认值:空字符串  <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                                                         |
142| symbolEditIconStyle<sup>18+</sup> | [SymbolGlyphModifier](ts-universal-attributes-attribute-modifier.md) | 否 | Symbol编辑图标,优先级大于editIcon。<br/>默认值:undefined <br/>**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。                                                 |
143| primaryTitle | [ResourceStr](ts-types.md#resourcestr) | 否 | 主标题。<br/>默认值:空字符串  <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                                                          |
144| secondaryTitle | [ResourceStr](ts-types.md#resourcestr) | 否 | 副标题。<br/>默认值:空字符串 <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                                                           |
145| container | ()&nbsp;=&gt;&nbsp;void | 否 | 绑定在节点上的右键子组件,子组件由@Builder修饰。<br/>默认值:()&nbsp;=&gt;&nbsp;void <br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                |
146
147
148## TreeListenerManager
149
150树视图组件的监听器,可以将此对象绑定至树视图组件,然后通过它监听树的节点的变化,同一个监听器不可以控制多个树视图组件。
151
152
153### getInstance
154
155static getInstance(): TreeListenerManager
156
157获取监听管理器单例对象。
158
159**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
160
161**系统能力:** SystemCapability.ArkUI.ArkUI.Full
162
163**返回值**:
164
165| 类型              | 说明               |
166| --------------- |------------------|
167| [TreeListenerManager](#treelistenermanager) | 返回获取到的监听管理器单例对象。 |
168
169
170### getTreeListener
171
172getTreeListener(): TreeListener
173
174获取监听器。
175
176**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
177
178**系统能力:** SystemCapability.ArkUI.ArkUI.Full
179
180**返回值**:
181
182| 类型           | 说明         |
183| ------------ |------------|
184| [TreeListener](#treelistener) | 返回获取到的监听器。 |
185
186
187## TreeListener
188
189树视图组件的监听器,可以将此对象绑定至树视图组件,然后通过它监听树的节点的变化,同一个监听器不可以控制多个树视图组件。
190
191
192### on
193
194on(type: TreeListenType, callback: (callbackParam: CallbackParam) =&gt; void): void;
195
196注册监听。
197
198**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
199
200**系统能力:** SystemCapability.ArkUI.ArkUI.Full
201
202| 名称 | 类型 | 必填 | 说明 |
203| -------- | -------- | -------- | -------- |
204| type | [TreeListenType](#treelistentype) | 是 | 监听类型。 |
205| callback | (callbackParam: [CallbackParam](#callbackparam)) =&gt; void | 是 | 节点信息。 |
206
207
208### once
209
210once(type: TreeListenType, callback: (callbackParam: CallbackParam) =&gt; void): void;
211
212注册一次监听。
213
214**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
215
216**系统能力:** SystemCapability.ArkUI.ArkUI.Full
217
218| 名称 | 类型 | 必填 | 说明 |
219| -------- | -------- | -------- | -------- |
220| type | [TreeListenType](#treelistentype) | 是 | 监听类型。 |
221| callback | (callbackParam: [CallbackParam](#callbackparam)) =&gt; void | 是 | 节点信息。 |
222
223
224### off
225
226
227off(type: TreeListenType, callback?: (callbackParam: CallbackParam) =&gt; void): void;
228
229取消监听。
230
231**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
232
233**系统能力:** SystemCapability.ArkUI.ArkUI.Full
234
235
236| 名称 | 类型 | 必填 | 说明 |
237| -------- | -------- | -------- | -------- |
238| type | [TreeListenType](#treelistentype) | 是 | 监听类型。 |
239| callback | (callbackParam: [CallbackParam](#callbackparam)) =&gt; void | 否 | 节点信息。 |
240
241## TreeListenType
242
243**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
244
245**系统能力:** SystemCapability.ArkUI.ArkUI.Full
246
247| 名称 | 值 | 说明 |
248| -------- | -------- | -------- |
249| NODE_CLICK | "NodeClick" | 监听节点点击事件。 |
250| NODE_ADD | "NodeAdd" | 监听节点增加事件。 |
251| NODE_DELETE | "NodeDelete" | 监听节点删除事件。 |
252| NODE_MODIFY | "NodeModify" | 监听节点修改事件。 |
253| NODE_MOVE | "NodeMove" | 监听节点移动事件。 |
254
255## CallbackParam
256
257**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
258
259**系统能力:** SystemCapability.ArkUI.ArkUI.Full
260
261| 名称 | 类型 | 必填 | 说明                                       |
262| -------- | -------- | -------- |------------------------------------------|
263| currentNodeId | number | 是 | 返回当前子节点id。<br />取值范围:大于等于0。              |
264| parentNodeId | number | 否 | 返回当前父节点id。<br />取值范围:大于等于-1。<br />默认值:-1 |
265| childIndex | number | 否 | 返回子索引。<br />取值范围:大于等于-1。<br />默认值:-1     |
266
267## 事件
268不支持[通用事件](ts-component-general-events.md)。
269
270## 示例
271
272### 示例1(设置简单树视图)
273
274通过树视图组件的控制器对树的节点进行新增、删除、重命名,展示新增不同参数节点的实现效果。
275
276```ts
277import { TreeController, TreeListener, TreeListenerManager, TreeListenType, NodeParam, TreeView, CallbackParam } from '@kit.ArkUI';
278
279@Entry
280@Component
281struct TreeViewDemo {
282  private treeController: TreeController = new TreeController();
283  private treeListener: TreeListener = TreeListenerManager.getInstance().getTreeListener();
284  @State clickId: number = 0;
285
286  aboutToDisappear(): void {
287    this.treeListener.off(TreeListenType.NODE_CLICK, undefined);
288    this.treeListener.off(TreeListenType.NODE_ADD, undefined);
289    this.treeListener.off(TreeListenType.NODE_DELETE, undefined);
290    this.treeListener.off(TreeListenType.NODE_MOVE, undefined);
291  }
292
293  @Builder menuBuilder1() {
294    Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
295      Text('新增').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
296        .onClick((event: ClickEvent) => {
297          this.treeController.addNode();
298        })
299      Divider()
300      Text('删除').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
301        .onClick((event: ClickEvent) => {
302          this.treeController.removeNode();
303        })
304      Divider()
305      Text('重命名').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
306        .onClick((event: ClickEvent) => {
307          this.treeController.modifyNode();
308        })
309    }.width(100).border({width: 1, color: 0x80808a, radius: '16dp'})
310  }
311
312  aboutToAppear(): void {
313    this.treeListener.on(TreeListenType.NODE_CLICK, (callbackParam: CallbackParam) => {
314      this.clickId = callbackParam.currentNodeId;
315    })
316    this.treeListener.on(TreeListenType.NODE_ADD, (callbackParam: CallbackParam) => {
317      this.clickId = callbackParam.currentNodeId;
318    })
319    this.treeListener.on(TreeListenType.NODE_DELETE, (callbackParam: CallbackParam) => {
320      this.clickId = callbackParam.currentNodeId;
321    })
322    this.treeListener.once(TreeListenType.NODE_MOVE, (callbackParam: CallbackParam) => {
323      this.clickId = callbackParam.currentNodeId;
324    })
325
326    let normalResource: Resource = $r('sys.media.ohos_ic_normal_white_grid_folder');
327    let selectedResource: Resource = $r('sys.media.ohos_ic_public_select_all');
328    let editResource: Resource = $r('sys.media.ohos_ic_public_edit');
329    let nodeParam: NodeParam = { parentNodeId:-1, currentNodeId: 1, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
330      editIcon: editResource, primaryTitle: "目录1验证悬浮框自适应效果是否OK",
331      secondaryTitle: "6" };
332    this.treeController
333      .addNode(nodeParam)
334      .addNode({parentNodeId:1, currentNodeId: 2, isFolder: false, primaryTitle: "项目1_1" })
335      .addNode({ parentNodeId:-1, currentNodeId: 7, isFolder: true, primaryTitle: "目录2" })
336      .addNode({ parentNodeId:-1, currentNodeId: 23, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
337        editIcon: editResource, primaryTitle: "目录3" })
338      .addNode({ parentNodeId:-1, currentNodeId: 24, isFolder: false, primaryTitle: "项目4" })
339      .addNode({ parentNodeId:-1, currentNodeId: 31, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
340        editIcon: editResource, primaryTitle: "目录5", secondaryTitle: "0" })
341      .addNode({ parentNodeId:-1, currentNodeId: 32, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
342        editIcon: editResource, primaryTitle: "目录6", secondaryTitle: "0" })
343      .addNode({ parentNodeId:32, currentNodeId: 35, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
344        editIcon: editResource, primaryTitle: "目录6-1", secondaryTitle: "0" })
345      .addNode({ parentNodeId:-1, currentNodeId: 33, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
346        editIcon: editResource, primaryTitle: "目录7", secondaryTitle: "0" })
347      .addNode({ parentNodeId:33, currentNodeId: 34, isFolder: false, primaryTitle: "项目8" })
348      .addNode({ parentNodeId:-1, currentNodeId: 36, isFolder: false, primaryTitle: "项目9" })
349      .buildDone();
350    this.treeController.refreshNode(-1, "父节点", "子节点");
351  }
352
353  build() {
354    Column(){
355      SideBarContainer(SideBarContainerType.Embed)
356      {
357        TreeView({ treeController: this.treeController })
358        Row() {
359          Divider().vertical(true).strokeWidth(2).color(0x000000).lineCap(LineCapStyle.Round)
360          Column({ space: 30 }) {
361            Text('ClickId=' + this.clickId).fontSize('16fp')
362            Button('Add', { type: ButtonType.Normal, stateEffect: true })
363              .borderRadius(8).backgroundColor(0x317aff).width(90)
364              .onClick((event: ClickEvent) => {
365                this.treeController.addNode();
366              })
367            Button('Modify', { type: ButtonType.Normal, stateEffect: true })
368              .borderRadius(8).backgroundColor(0x317aff).width(90)
369              .onClick((event: ClickEvent) => {
370                this.treeController.modifyNode();
371              })
372            Button('Remove', { type: ButtonType.Normal, stateEffect: true })
373              .borderRadius(8).backgroundColor(0x317aff).width(120)
374              .onClick((event: ClickEvent) => {
375                this.treeController.removeNode();
376              })
377          }.height('100%').width('70%').alignItems(HorizontalAlign.Start).margin(10)
378        }
379      }
380      .focusable(true)
381      .showControlButton(false)
382      .showSideBar(true)
383    }
384  }}
385```
386
387![zh-cn_image_0000001664822257](figures/zh-cn_image_0000001664822257.png)
388
389### 示例2(设置Symbol类型图标)
390
391该示例通过设置NodeParam的属性symbolIconStyle、symbolEditIconStyle、symbolSelectedIconStyle,展示了自定义Symbol类型图标。
392
393```ts
394import { TreeController, TreeListener, TreeListenerManager, TreeListenType, NodeParam, TreeView, CallbackParam,
395  SymbolGlyphModifier } from '@kit.ArkUI';
396
397@Entry
398@Component
399struct TreeViewDemo {
400  private treeController: TreeController = new TreeController();
401  private treeListener: TreeListener = TreeListenerManager.getInstance().getTreeListener();
402  @State clickNodeId: number = 0;
403
404  aboutToDisappear(): void {
405    this.treeListener.off(TreeListenType.NODE_CLICK, undefined);
406    this.treeListener.off(TreeListenType.NODE_ADD, undefined);
407    this.treeListener.off(TreeListenType.NODE_DELETE, undefined);
408    this.treeListener.off(TreeListenType.NODE_MOVE, undefined);
409  }
410
411  @Builder menuBuilder1() {
412    Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
413      Text('新增').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
414        .onClick((event: ClickEvent) => {
415          this.treeController.addNode();
416        })
417      Divider()
418      Text('删除').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
419        .onClick((event: ClickEvent) => {
420          this.treeController.removeNode();
421        })
422      Divider()
423      Text('重命名').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
424        .onClick((event: ClickEvent) => {
425          this.treeController.modifyNode();
426        })
427    }.width(100).border({width: 1, color: 0x80808a, radius: '16dp'})
428  }
429
430  aboutToAppear(): void {
431    this.treeListener.on(TreeListenType.NODE_CLICK, (callbackParam: CallbackParam) => {
432      this.clickNodeId = callbackParam.currentNodeId;
433    })
434    this.treeListener.on(TreeListenType.NODE_ADD, (callbackParam: CallbackParam) => {
435      this.clickNodeId = callbackParam.currentNodeId;
436    })
437    this.treeListener.on(TreeListenType.NODE_DELETE, (callbackParam: CallbackParam) => {
438      this.clickNodeId = callbackParam.currentNodeId;
439    })
440    this.treeListener.once(TreeListenType.NODE_MOVE, (callbackParam: CallbackParam) => {
441      this.clickNodeId = callbackParam.currentNodeId;
442    })
443
444    let normalResource: Resource = $r('sys.symbol.house');
445    let selectedResource: Resource = $r('sys.symbol.car');
446    let editResource: Resource = $r('sys.symbol.calendar');
447    let normalSymbolResource: SymbolGlyphModifier = new SymbolGlyphModifier($r('sys.symbol.bell')).fontColor([Color.Red]);
448    let selectedSymbolResource: SymbolGlyphModifier = new SymbolGlyphModifier($r('sys.symbol.heart')).fontColor([Color.Blue]);
449    let editSymbolResource: SymbolGlyphModifier = new SymbolGlyphModifier($r('sys.symbol.cake')).fontColor([Color.Pink]);
450    let nodeParam: NodeParam = { parentNodeId:-1, currentNodeId: 1, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
451      editIcon: editResource, primaryTitle: "目录1",
452      secondaryTitle: "6" };
453    this.treeController
454      .addNode(nodeParam)
455      .addNode({parentNodeId:1, currentNodeId: 2, isFolder: false, primaryTitle: "项目1_1" })
456      .addNode({ parentNodeId:-1, currentNodeId: 7, isFolder: true, primaryTitle: "目录2" })
457      .addNode({ parentNodeId:-1, currentNodeId: 23, isFolder: true, icon: normalResource, symbolIconStyle: normalSymbolResource,
458        selectedIcon: selectedResource, symbolSelectedIconStyle: selectedSymbolResource, editIcon: editResource,
459        symbolEditIconStyle: editSymbolResource, primaryTitle: "目录3" })
460      .addNode({ parentNodeId:-1, currentNodeId: 24, isFolder: false, primaryTitle: "项目4" })
461      .addNode({ parentNodeId:-1, currentNodeId: 31, isFolder: true, icon: normalResource, symbolIconStyle: normalSymbolResource,
462        selectedIcon: selectedResource, symbolSelectedIconStyle: selectedSymbolResource, editIcon: editResource,
463        symbolEditIconStyle: editSymbolResource, primaryTitle: "目录5", secondaryTitle: "0" })
464      .addNode({ parentNodeId:-1, currentNodeId: 32, isFolder: true, icon: normalResource, symbolIconStyle: normalSymbolResource,
465        selectedIcon: selectedResource, symbolSelectedIconStyle: selectedSymbolResource, editIcon: editResource,
466        symbolEditIconStyle: editSymbolResource, primaryTitle: "目录6", secondaryTitle: "0" })
467      .addNode({ parentNodeId:32, currentNodeId: 35, isFolder: true, icon: normalResource, symbolIconStyle: normalSymbolResource,
468        selectedIcon: selectedResource, symbolSelectedIconStyle: selectedSymbolResource, editIcon: editResource,
469        symbolEditIconStyle: editSymbolResource, primaryTitle: "目录6-1", secondaryTitle: "0" })
470      .addNode({ parentNodeId:-1, currentNodeId: 33, isFolder: true, icon: normalResource, symbolIconStyle: normalSymbolResource,
471        selectedIcon: selectedResource, symbolSelectedIconStyle: selectedSymbolResource, editIcon: editResource,
472        symbolEditIconStyle: editSymbolResource, primaryTitle: "目录7", secondaryTitle: "0" })
473      .addNode({ parentNodeId:33, currentNodeId: 34, isFolder: false, primaryTitle: "项目8" })
474      .addNode({ parentNodeId:-1, currentNodeId: 36, isFolder: false, primaryTitle: "项目9" })
475      .buildDone();
476    this.treeController.refreshNode(-1, "父节点", "子节点");
477  }
478
479  build() {
480    Column(){
481      SideBarContainer(SideBarContainerType.Embed)
482      {
483        TreeView({ treeController: this.treeController })
484        Row() {
485          Divider().vertical(true).strokeWidth(2).color(0x000000).lineCap(LineCapStyle.Round)
486          Column({ space: 30 }) {
487            Text('ClickNodeId=' + this.clickNodeId).fontSize('16fp')
488            Button('Add', { type: ButtonType.Normal, stateEffect: true })
489              .borderRadius(8).backgroundColor(0x317aff).width(90)
490              .onClick((event: ClickEvent) => {
491                this.treeController.addNode();
492              })
493            Button('Modify', { type: ButtonType.Normal, stateEffect: true })
494              .borderRadius(8).backgroundColor(0x317aff).width(90)
495              .onClick((event: ClickEvent) => {
496                this.treeController.modifyNode();
497              })
498            Button('Remove', { type: ButtonType.Normal, stateEffect: true })
499              .borderRadius(8).backgroundColor(0x317aff).width(120)
500              .onClick((event: ClickEvent) => {
501                this.treeController.removeNode();
502              })
503          }.height('100%').width('80%').alignItems(HorizontalAlign.Start).margin(10)
504        }
505      }
506      .focusable(true)
507      .showControlButton(false)
508      .showSideBar(true)
509    }
510  }}
511```
512
513![示例2-TreeView示例2 设置Symbol类型图标](figures/zh-cn_image_treeview_demo_02.png)