HarmonyOS鸿蒙Next中使用Repeat实现列表, 数据添加删除,动画无法正常显示

HarmonyOS鸿蒙Next中使用Repeat实现列表, 数据添加删除,动画无法正常显示

class DataModel2 { id: number = -1; text: string = ‘’; type: string = typeA;

constructor(id: number, text: string, type: string) { this.id = id; this.text = text; this.type = type; } }

@Entry @ComponentV2 struct RepeatPage2 { indexA: string = ``; dragStartIndex: number = 0; @Local dataArr: Array<DataModel2> = []; // 数据源

aboutToAppear(): void { for (let i = 0; i < 20; i++) { this.dataArr.push(new DataModel2(i, ‘item_’ + i, type)); // 为数组添加一些数据 } }

build() { Column() { List() { Repeat<DataModel2>(this.dataArr) .virtualScroll({ totalCount: this.dataArr.length }) .key((item: DataModel2, index: number): string => { return item.id.toString() // 键值生成函数 }) .each((repeatItem: RepeatItem<DataModel2>) => { // 默认模板 ListItem() { ChildPage2({ dataModel: repeatItem.item, index: repeatItem.index, color: Color.Red }) }.transition(TransitionEffect.SLIDE.combine(TransitionEffect.scale({ x: 0.2, y: 0.2 }))) .animation({ duration: 1000 }) }) } .cachedCount(2) .height(‘70%’) .border({ width: 1 }) // 边框 TextInput({ placeholder: ‘输入数字’ }).width(‘50%’).height(40).margin(4) .onChange((value: string) => { this.indexA = value; }) Button(点击删除item).onClick(() => { animateTo({ duration: 1000, curve: Curve.EaseInOut }, () => { const index = Number(this.indexA); if (index > -1 && index < this.dataArr.length) { this.dataArr.splice(index, 1); } }); }) Button(头部添加数据 value=${this.dataArr.length}) .onClick(() => { animateTo({ duration: 1000 }, () => { const spliceIndex = 0; const newData = this.dataArr.length; this.dataArr.splice(spliceIndex, 0, new DataModel2(newData, ‘item_’ + newData, typeA)); }); }) } } }

@ComponentV2 // 推荐使用V2装饰器 struct ChildPage2 { @Require @Param dataModel: DataModel2; //@Require标记的变量可以不赋值 @Require @Param index: number; @Require @Param color: ResourceColor;

build() { Text(this.dataModel.text + ’ index=’ + this.index).fontSize(30).fontColor(this.color) // 文本颜色为红色 } }


删除数据时,item是瞬间消失的,添加数据的动画是正常显示的

更多关于HarmonyOS鸿蒙Next中使用Repeat实现列表, 数据添加删除,动画无法正常显示的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

当前animateTo与V2在刷新机制上暂不兼容,在状态管理V2中使用animateTo动画前存在额外的修改导致动效异常,可参考链接中的案例修改:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-new-local#%E5%9C%A8%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86v2%E4%B8%AD%E4%BD%BF%E7%94%A8animateto%E5%8A%A8%E7%94%BB%E6%95%88%E6%9E%9C%E5%BC%82%E5%B8%B8

更多关于HarmonyOS鸿蒙Next中使用Repeat实现列表, 数据添加删除,动画无法正常显示的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


华为回复我也是这个原因, 文档我看了, 但是没明白, 文档里说的是使用animateTo动画前存在额外的修改, 我并没有额外的修改啊,

尝试了一下用@Component替换@ComponentV2,发现效果是一样的。当前需要删除的item_num在列表显示中没有重复的时候,动画显示为删除项消失,其他项位置替补上移(该方式本身就是一种动效)。有重复的时候会出现和视频中添加时同样的动画效果。animationto的官方文档里有提到“指定动效的闭包函数,在闭包函数中导致的状态变化系统会自动插入过渡动画”。同样添加时,添加项item_num与当前显示的项没有重复,且当前所有item没有溢出显示区,系统判定不需要额外提示,也是第一行出现要添加项,其他项位置下移。所以当前实现删除和添加都是有动效的,只是场景不一样动效不一样。

Repeat哪里能用@Component啊,这东西只有V2才有,

能示例下删除时想得到什么样的动画效果吗?

删除和添加是一个动画效果,只有一个地方使用了.transition()

在HarmonyOS鸿蒙Next中使用Repeat组件实现列表时,若遇到数据添加或删除后动画无法正常显示的问题,可能是由于Repeat组件的更新机制和动画处理不完全匹配所致。Repeat组件根据数据源的变化动态生成子组件,但在数据变化时,可能未正确触发动画的重新渲染。

确保数据更新时,Repeat组件能够正确识别变化并重新渲染子组件。可以通过@State@Link装饰器管理数据源,确保数据变化时Repeat组件能够感知并更新。此外,检查动画的绑定方式,确保动画与数据变化同步。

如果问题仍未解决,可以尝试使用ForEach替代RepeatForEach在处理动态列表时具有更好的性能和数据更新机制。确保在数据变化时,ForEach能够正确触发动画的重新渲染。

在HarmonyOS鸿蒙Next中使用Repeat实现列表时,若数据添加或删除时动画无法正常显示,可能是由于以下原因:

  1. 未正确绑定动画:确保在Repeat组件中为每个项绑定了动画效果,并使用animateToTransition组件来触发动画。

  2. 数据更新方式:直接修改数据源可能导致UI未及时更新。建议使用@State@Observed装饰器管理数据,并通过setState@Observed的更新机制触发UI刷新。

  3. 动画类型不匹配:检查动画类型是否适合列表项的添加或删除操作,例如使用opacitytranslate动画来平滑过渡。

  4. 性能问题:确保动画在UI线程上执行,避免阻塞UI更新。

通过以上步骤排查问题,确保动画在数据变化时正常显示。

回到顶部