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
当前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才有,
能示例下删除时想得到什么样的动画效果吗?
在HarmonyOS鸿蒙Next中使用Repeat
组件实现列表时,若遇到数据添加或删除后动画无法正常显示的问题,可能是由于Repeat
组件的更新机制和动画处理不完全匹配所致。Repeat
组件根据数据源的变化动态生成子组件,但在数据变化时,可能未正确触发动画的重新渲染。
确保数据更新时,Repeat
组件能够正确识别变化并重新渲染子组件。可以通过@State
或@Link
装饰器管理数据源,确保数据变化时Repeat
组件能够感知并更新。此外,检查动画的绑定方式,确保动画与数据变化同步。
如果问题仍未解决,可以尝试使用ForEach
替代Repeat
,ForEach
在处理动态列表时具有更好的性能和数据更新机制。确保在数据变化时,ForEach
能够正确触发动画的重新渲染。
在HarmonyOS鸿蒙Next中使用Repeat
实现列表时,若数据添加或删除时动画无法正常显示,可能是由于以下原因:
-
未正确绑定动画:确保在
Repeat
组件中为每个项绑定了动画效果,并使用animateTo
或Transition
组件来触发动画。 -
数据更新方式:直接修改数据源可能导致UI未及时更新。建议使用
@State
或@Observed
装饰器管理数据,并通过setState
或@Observed
的更新机制触发UI刷新。 -
动画类型不匹配:检查动画类型是否适合列表项的添加或删除操作,例如使用
opacity
或translate
动画来平滑过渡。 -
性能问题:确保动画在UI线程上执行,避免阻塞UI更新。
通过以上步骤排查问题,确保动画在数据变化时正常显示。