1# Repeat
2
3> **说明:**
4>
5> 本模块首批接口从API version 12开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
6
7本文档仅为API参数说明。开发者指南见:[Repeat开发者指南](../../../quick-start/arkts-new-rendering-control-repeat.md)
8
9## 接口
10
11Repeat: \<T\>(arr: Array\<T\>)
12
13Repeat组件non-virtualScroll场景(不开启virtualScroll开关)中,Repeat基于数据源进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在Repeat父容器组件中的子组件。Repeat循环渲染和ForEach相比有两个区别,一是优化了部分更新场景下的渲染性能,二是组件生成函数的索引index由框架侧来维护。
14
15Repeat组件virtualScroll场景中,Repeat将从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件,必须与滚动类容器组件配合使用。当在滚动类容器组件中使用了Repeat,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会缓存组件,并在下一次迭代中使用。
16
17**卡片能力:** 从API version 12开始,该接口支持在ArkTS卡片中使用。
18
19**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
20
21**系统能力:** SystemCapability.ArkUI.ArkUI.Full
22
23**参数:**
24
25| 参数名 | 类型       | 必填 | 说明      |
26| ------ | ---------- | -------- | -------- |
27| arr    | Array\<T\> | 是 | 数据源,为`Array<T>`类型的数组,由开发者决定数据类型。 |
28
29**示例:**
30```ts
31// arr是Array<string>类型的数组,以arr为数据源创建Repeat组件
32Repeat<string>(this.arr)
33```
34
35## 事件
36
37**卡片能力:** 从API version 12开始,该接口支持在ArkTS卡片中使用。
38
39**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
40
41**系统能力:** SystemCapability.ArkUI.ArkUI.Full
42
43### each
44
45each(itemGenerator: (repeatItem: RepeatItem\<T\>) => void): RepeatAttribute\<T\>
46
47组件生成函数。template和templateId匹配不上的数据项走默认生成函数each。
48
49> **说明**
50>
51> `each`属性必须有,否则运行时会报错。
52> `itemGenerator`的参数为`RepeatItem`,该参数将`item`和`index`结合到了一起,请勿将`RepeatItem`参数拆开使用。
53
54**卡片能力:** 从API version 12开始,该接口支持在ArkTS卡片中使用。
55
56**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
57
58**系统能力:** SystemCapability.ArkUI.ArkUI.Full
59
60**参数:**
61
62| 参数名 | 类型   | 必填 | 说明 |
63| ------ | ---------- | -------- | -------- |
64| repeatItem  | [RepeatItem](#repeatitemt)\<T\> | 是 | repeat数据项 |
65
66**示例:**
67```ts
68// arr是Array<string>类型的数组,为每个数据创建一个Text组件
69Repeat<string>(this.arr)
70  .each((obj: RepeatItem<string>) => { Text(obj.item) })
71```
72
73### key
74
75key(keyGenerator: (item: T, index: number) => string): RepeatAttribute\<T\>
76
77键值生成函数。
78
79**卡片能力:** 从API version 12开始,该接口支持在ArkTS卡片中使用。
80
81**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
82
83**系统能力:** SystemCapability.ArkUI.ArkUI.Full
84
85**参数:**
86
87| 参数名 | 类型   | 必填 | 说明  |
88| ------ | ---------- | -------- | -------- |
89| item  | T | 是 | `arr`数组中的数据项 |
90| index  | number | 是 | `arr`数组中的数据项索引 |
91
92**示例:**
93```ts
94// arr是Array<string>类型的数组,为每个数据创建一个Text组件
95// 并将字符串的值作为其键值
96Repeat<string>(this.arr)
97  .each((obj: RepeatItem<string>) => { Text(obj.item) })
98  .key((obj: string) => obj)
99```
100
101### virtualScroll
102
103virtualScroll(virtualScrollOptions?: VirtualScrollOptions): RepeatAttribute\<T\>
104
105`Repeat`开启虚拟滚动。
106
107**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
108
109**系统能力:** SystemCapability.ArkUI.ArkUI.Full
110
111**参数:**
112
113| 参数名 | 类型   | 必填 | 说明  |
114| ------ | ---------- | -------- | -------- |
115| virtualScrollOptions  | [VirtualScrollOptions](#virtualscrolloptions对象说明)  | 否 | 虚拟滚动配置项 |
116
117**示例:**
118```ts
119// arr是Array<string>类型的数组,为每个数据创建一个Text组件
120// 在List容器组件中使用Repeat,并打开virtualScroll
121List() {
122  Repeat<string>(this.arr)
123    .each((obj: RepeatItem<string>) => { ListItem() { Text(obj.item) }})
124    .virtualScroll()
125}
126```
127
128### template
129
130template(type: string, itemBuilder: RepeatItemBuilder\<T\>, templateOptions?: TemplateOptions): RepeatAttribute\<T\>
131
132复用模板。
133
134**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
135
136**系统能力:** SystemCapability.ArkUI.ArkUI.Full
137
138**参数:**
139
140| 参数名 | 类型   | 必填 | 说明  |
141| ------ | ---------- | -------- | -------- |
142| type | string | 是 | 当前模板类型 |
143| itemBuilder  | [RepeatItemBuilder](#repeatitembuildert)\<T\> | 是 | 组件生成函数 |
144| templateOptions | [TemplateOptions](#templateoptions对象说明) | 否 | 当前模板配置项 |
145
146**示例:**
147```ts
148// arr是Array<string>类型的数组
149// 在List容器组件中使用Repeat,并打开virtualScroll
150// 创建模板temp,该模板为数据创建Text组件
151List() {
152  Repeat<string>(this.arr)
153    .each((obj: RepeatItem<string>) => {})
154    .virtualScroll()
155    .template('temp', (obj: RepeatItem<string>) => { ListItem() { Text(obj.item) }})
156}
157```
158
159### templateId
160
161templateId(typedFunc: TemplateTypedFunc\<T\>): RepeatAttribute\<T\>
162
163为当前数据项分配templateId。
164
165**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
166
167**系统能力:** SystemCapability.ArkUI.ArkUI.Full
168
169**参数:**
170
171| 参数名 | 类型   | 必填 | 说明  |
172| ------ | ---------- | -------- | -------- |
173| typedFunc | [TemplateTypedFunc](#templatetypedfunct)\<T\> | 是 | 生成当前数据项对应的templateId |
174
175**示例:**
176```ts
177// arr是Array<string>类型的数组
178// 在List容器组件中使用Repeat,并打开virtualScroll
179// 创建模板temp,该模板为数据创建Text组件
180// 所有数据项都使用temp模板
181List() {
182  Repeat<string>(this.arr)
183    .each((obj: RepeatItem<string>) => {})
184    .virtualScroll()
185    .template('temp', (obj: RepeatItem<string>) => { ListItem() { Text(obj.item) }})
186    .templateId((item: string, index: number) => { return 'temp' })
187}
188```
189
190## RepeatItem\<T\>
191
192**卡片能力:** 从API version 12开始,该接口支持在ArkTS卡片中使用。
193
194**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
195
196**系统能力:** SystemCapability.ArkUI.ArkUI.Full
197
198| 名称 | 类型   | 必填 | 说明                                         |
199| ------ | ------ | ---- | -------------------------------------------- |
200| item   | T      | 是   | arr中每一个数据项。T为开发者传入的数据类型。 |
201| index  | number | 是   | 当前数据项对应的索引。                       |
202
203## VirtualScrollOptions对象说明
204
205**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
206
207**系统能力:** SystemCapability.ArkUI.ArkUI.Full
208
209| 名称     | 类型   | 必填 | 说明                                                         |
210| ---------- | ------ | ---- | ------------------------------------------------------------ |
211| totalCount | number | 否   | 加载的数据项总数,可以大于/小于数据源长度 |
212
213**示例:**
214```ts
215// arr是Array<string>类型的数组,在List容器组件中使用Repeat,并打开virtualScroll
216// 将加载的数据项总数设为数据源的长度
217List() {
218  Repeat<string>(this.arr)
219    .each((obj: RepeatItem<string>) => { ListItem() { Text(obj.item) }})
220    .virtualScroll( { totalCount: this.arr.length } )
221}
222```
223
224## RepeatItemBuilder\<T\>
225
226type RepeatItemBuilder\<T\> = (repeatItem: RepeatItem\<T\>) => void
227
228**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
229
230**系统能力:** SystemCapability.ArkUI.ArkUI.Full
231
232**参数:**
233
234| 参数名     | 类型          | 必填      | 说明                                    |
235| ---------- | ------------- | --------------------------------------- | --------------------------------------- |
236| repeatItem | [RepeatItem](#repeatitemt)\<T\> | 是 | 将item和index结合到一起的一个状态变量。 |
237
238## TemplateOptions对象说明
239
240**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
241
242**系统能力:** SystemCapability.ArkUI.ArkUI.Full
243
244| 名称      | 类型   | 必填 | 说明                                                         |
245| ----------- | ------ | ---- | ------------------------------------------------------------ |
246| cachedCount | number | 否   | 当前模板在Repeat的缓存池中可缓存子节点的最大数量,仅在开启virtualScroll后生效。 |
247
248**示例:**
249```ts
250// arr是Array<string>类型的数组,在List容器组件中使用Repeat,并打开virtualScroll
251// 创建模板temp,该模板为数据创建Text组件,所有数据项都使用temp模板
252// 将temp模板的最大缓存节点数量设为2
253List() {
254  Repeat<string>(this.arr)
255    .each((obj: RepeatItem<string>) => {})
256    .virtualScroll()
257    .template('temp', (obj: RepeatItem<string>) => { ListItem() { Text(obj.item) }}, { cachedCount: 2 })
258    .templateId((item: string, index: number) => { return 'temp' })
259}
260```
261
262## TemplateTypedFunc\<T\>
263
264type TemplateTypedFunc\<T\> = (item : T, index : number) => string
265
266**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
267
268**系统能力:** SystemCapability.ArkUI.ArkUI.Full
269
270**参数:**
271
272| 参数名 | 类型   | 必填 | 说明                                         |
273| ------ | ------ | ---- | -------------------------------------------- |
274| item   | T      | 是   | arr中每一个数据项。T为开发者传入的数据类型。 |
275| index  | number | 是   | 当前数据项对应的索引。                       |