Lines Matching refs:Repeat

1 # Repeat:子组件复用
5 > Repeat从API version 12开始支持。
7 本文档仅为开发者指南。API参数说明见:[Repeat API参数说明](../reference/apis-arkui/arkui-ts/ts-rendering-control-repeat.m…
9 Repeat组件non-virtualScroll场景(不开启virtualScroll开关)中,Repeat基于数据源进行循环渲染,需要与容器组件配合使用,且接口返回的组件应当是允许包含在Repe…
11 Repeat组件virtualScroll场景中,Repeat将从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件,必须与滚动类容器组件配合使用。当在滚动类容器组件中使用了Repeat,…
15 - Repeat使用键值作为标识,因此键值生成函数`key()`必须针对每个数据生成唯一的值。
16 - Repeat virtualScroll场景必须在滚动类容器组件内使用,仅有[List](../reference/apis-arkui/arkui-ts/ts-container-list.m…
17 - Repeat开启virtualScroll后,在每次迭代中,必须创建且只允许创建一个子组件。不开启virtualScroll没有该限制。生成的子组件必须是允许包含在Repeat父容器组件中的子组…
18 - 当Repeat与自定义组件/@Builder函数混用时,必须将RepeatItem类型整体进行传参,组件才能监听到数据变化,如果只传递`RepeatItem.item`或`RepeatItem.…
19 - template模板目前只支持virtualScroll场景。当多个template type相同时,Repeat会覆盖旧的`template()`函数,仅生效最新的`template()`。
21 - 在容器组件内使用Repeat的时候,只能包含一个Repeat。以List为例,同时包含ListItem、ForEach、LazyForEach的场景是不推荐的;同时包含多个Repeat也是不推荐…
22 - Repeat组件的virtualScroll场景不支持V1装饰器,使用V1装饰器存在渲染异常,不建议开发者同时使用。
26 键值生成函数`key()`的目的是允许Repeat识别数组更改的细节:添加了哪些数据、删除了哪些数据,以及哪些数据改变了位置(索引)。
32 - `key()`中使用index是允许的,但不建议这样使用。原因是数据项移动时索引发生变化,即键值发生变化。因此Repeat会认为数据项发生了变化,并触发UI重新渲染,会降低性能表现;
37 `key()`可以缺省,Repeat会生成默认key值。
39 ![Repeat-NonVS-KeyGen](./figures/Repeat-NonVS-KeyGen.png)
45 ![Repeat-VS-KeyGen](./figures/Repeat-VS-KeyGen.png)
51 子组件在Repeat首次渲染时全部创建,在数据更新时会对原组件进行复用。
53Repeat组件进行数据更新时,它会依次对比上次的所有键值和本次更新之后的区别。若当前键值和上次的某一项键值相同,Repeat会直接复用子组件并对RepeatItem.index索引做对应的更新。
55Repeat将所有重复的键值对比完并做了相应的复用后,若上次的键值有不重复的且本次更新之后有新的键值生成需要新建子组件时,Repeat会复用上次多余的子组件并更新RepeatItem.item数据…
57 若上次的剩余>=本次新更新的数量,则组件完全复用并释放多余的未被复用的组件。若上次的剩余小于本次新更新的数量,将剩余的组件复用完后,Repeat会新建多出来的数据项对应的组件。
59 ![Repeat-NonVS-FuncGen](./figures/Repeat-NonVS-FuncGen.png)
63 子组件在Repeat首次渲染只生成当前需要的组件,在滑动和数据更新时会缓存下屏的节点,在需要生成新的组件时,对缓存里的组件进行复用。
69 ![Repeat-Start](./figures/Repeat-Start.PNG)
71 当前Repeat组件template type有a和b两种,template type等于a对应的缓存池,其最大缓存值为3,template type等于b对应的缓存池,其最大缓存值为4,其父组件默…
73 ![Repeat-Slide](./figures/Repeat-Slide.PNG)
75 index=18的数据进入屏幕及父组件预加载的范围内,此时计算出其template type等于b,这时Repeat会从template type等于b的缓存池中取出一个节点进行复用,更新它的key…
77 index=10的节点划出了屏幕及父组件预加载的范围。当UI主线程空闲时,会去检测template type等于a的缓存池是否还有空间,此时缓存池中有四个节点,超过了额定的3个,Repeat会释放掉…
79 ![Repeat-Slide-Done](./figures/Repeat-Slide-Done.PNG)
83 ![Repeat-Start](./figures/Repeat-Start.PNG)
87 ![Repeat-Update1](./figures/Repeat-Update1.PNG)
89 此时Repeat会通知父组件重新布局,逐一对比template type值,若和原节点template type值相同,则复用该节点,更新key、index和data,若template type值…
91 ![Repeat-Update2](./figures/Repeat-Update2.PNG)
95 ![Repeat-Update-Done](./figures/Repeat-Update-Done.PNG)
103 - totalCount > arr.length时,代表Repeat将渲染totalCount个数据,滚动条样式根据totalCount值变化。
111 cachedCount是当前模板在Repeat的缓存池中可缓存子节点的最大数量,仅在virtualScroll场景下生效。
113 首先需要明确滚动类容器组件 `.cachedCount()`属性方法和Repeat `cachedCount`的区别。这两者都是为了平衡性能和内存,但是其含义是不同的。
115 …)`:是指在可见范围外预加载的节点,这些节点会位于组件树上,但不是可见范围内,List/Grid等容器组件会额外渲染这些可见范围外的节点,从而达到其性能收益。Repeat会将这些节点视为“可见”的。
116 - Repeat `cachedCount`: 是指Repeat视为“不可见”的节点,这些节点是空闲的,框架会暂时保存,在需要使用的时候更新这些节点,从而实现复用。
118 将cachedCount设置为当前模板的节点在屏上可能出现的最大数量时,Repeat可以做到尽可能多的复用。但后果是当屏上没有当前模板的节点时,缓存池也不会释放,应用内存会增大。需要开发者依据具体情…
145 Repeat<string>(this.simpleList)
178 下方例子当交换数组项1和2时,若键值和上次保持一致,Repeat会复用之前的组件,仅对使用了index索引值的组件做数据刷新。
199 Repeat<string>(this.simpleList)
228 ![Repeat-Non-Initial-Render-Case-Exchange-Effect](./figures/Repeat-Non-Initial-Render-Case-Exchange…
232 本小节将展示virtualScroll场景下,Repeat的实际使用场景和组件节点的复用情况。根据复用规则可以衍生出大量的测试场景,篇幅原因,只对典型的数据变化进行解释。
236 下面的代码设计了Repeat组件的virtualScroll场景典型数据源操作,包括**插入数据、修改数据、删除数据、交换数据**。点击下拉框选择index值,点击相应的按钮即可进行数据修改操作。依…
330 Repeat<Repeat005Clazz>(this.simpleList)
366 ![Repeat-VirtualScroll-Demo](./figures/Repeat-VirtualScroll-Demo.gif)
462 Repeat<Repeat006Clazz>(this.simpleList)
508 ![Repeat-VirtualScroll-2T-Demo](./figures/Repeat-VirtualScroll-2T-Demo.gif)
510 ### Repeat嵌套
512 Repeat支持嵌套使用。示例代码:
515 // Repeat嵌套
531 Text('Repeat virtualScroll嵌套')
535 Repeat<string>(this.outerList)
542 Repeat<number>(this.innerList)
574 ![Repeat-Nest](./figures/Repeat-Nest.png)
580 在List容器组件中使用Repeat的virtualScroll模式,示例如下:
618 Text('List容器组件中包含Repeat组件')
623 Repeat<DemoListItemInfo>(this.videoList)
679 ![Repeat-Demo-List](./figures/Repeat-Demo-List.gif)
683 在Grid容器组件中使用Repeat的virtualScroll模式,示例如下:
719 Text('Grid容器组件中包含Repeat组件')
725 Repeat<DemoGridItemInfo>(this.itemList)
807 ![Repeat-Demo-Grid](./figures/Repeat-Demo-Grid.gif)
811 在Swiper容器组件中使用Repeat的virtualScroll模式,示例如下:
852 Text('Swiper容器组件中包含Repeat组件')
861 Repeat(this.pics)
890 ![Repeat-Demo-Swiper](./figures/Repeat-Demo-Swiper.gif)
896 在List组件中声明Repeat组件,实现key值生成逻辑和each逻辑(如下示例代码),点击按钮“insert”,在屏幕显示的第一个元素前面插入一个元素,屏幕出现向下滚动。
923 Repeat(this.arrayHolder.arr)
957 ![Repeat-case1-Error](./figures/Repeat-Case1-Error.gif)
979 Repeat(this.arrayHolder.arr)
1020 ![Repeat-case1-Succ](./figures/Repeat-Case1-Succ.gif)
1024 当数据源总长度很大时,会使用懒加载的方式先加载一部分数据,为了使Repeat显示正确的滚动条样式,需要将数据总长度赋值给totalCount,即数据源全部加载完成前,totalCount大于arra…
1065 Repeat(this.vehicleItems)
1116 ![Repeat-Case2-Succ](./figures/Repeat-Case2-Succ.gif)
1118 ### Repeat与@Builder混用的限制
1120Repeat与@Builder混用时,必须将RepeatItem类型整体进行传参,组件才能监听到数据变化,如果只传递`RepeatItem.item`或`RepeatItem.index`,将会出…
1140 Text('Repeat与@Builder混用,左边是异常场景,右边是正常场景,向下滑动一段距离可以看出差别')
1146 Repeat<number>(this.simpleList1)
1167 Repeat<number>(this.simpleList2)
1213 ![Repeat-Builder](./figures/Repeat-Builder.png)