diff --git a/zh-cn/application-dev/ui/state-management/arkts-rendering-control-foreach.md b/zh-cn/application-dev/ui/state-management/arkts-rendering-control-foreach.md index f28d2ecce051b647cdea0b0656dd5ec388457185..78aa1bfb62b80b3a2311e0f7b36ecb9dd43a46a0 100644 --- a/zh-cn/application-dev/ui/state-management/arkts-rendering-control-foreach.md +++ b/zh-cn/application-dev/ui/state-management/arkts-rendering-control-foreach.md @@ -815,7 +815,7 @@ struct Parent { Text(item.key) } } - // 如果不定义下面的`keyGenerator`函数,则ArkUI框架会使用默认的键值生成函数 + // 如果不定义下面的keyGenerator函数,则ArkUI框架会使用默认的键值生成函数 , (item: Data) => { return item.key; } @@ -832,4 +832,62 @@ struct Parent { ![ForEach-StateVarNoRender](figures/ForEach-default-keyGenerator.PNG) **图15** 自定义键值生成函数下的内存占用 -![ForEach-StateVarNoRender](figures/ForEach-defined-keyGenerator.PNG) \ No newline at end of file +![ForEach-StateVarNoRender](figures/ForEach-defined-keyGenerator.PNG) + +### 键值生成失败 +如果开发者没有定义`keyGenerator`函数,则ArkUI框架会使用默认的键值生成函数,即`(item: Object, index: number) => { return index + '__' + JSON.stringify(item); }`。然而,`JSON.stringify`序列化在某些数据结构上会失败,导致应用发生jscrash并退出。例如,`bigint`无法被`JSON.stringify`序列化: + +```ts +class Data { + content: bigint; + + constructor(content: bigint) { + this.content = content; + } +} + +@Entry +@Component +struct Parent { + @State simpleList: Array = [new Data(1234567890123456789n), new Data(2345678910987654321n)]; + + build() { + Row() { + Column() { + ForEach(this.simpleList, (item: Data) => { + ChildItem({ item: item.content.toString() }) + } + // 如果不定义下面的keyGenerator函数,则ArkUI框架会使用默认的键值生成函数 + // Data中的content: bigint在JSON序列化时失败 + , (item: Data) => item.content.toString() + ) + } + .width('100%') + .height('100%') + } + .height('100%') + .backgroundColor(0xF1F3F5) + } +} + +@Component +struct ChildItem { + @Prop item: string; + + build() { + Text(this.item) + .fontSize(50) + } +} +``` + +开发者定义`keyGenerator`函数,应用正常启动: +![ForEach-StateVarNoRender](figures/ForEach-defined-keyGenerator2.PNG) + +使用默认的键值生成函数,应用发生jscrash: +``` +Error message:@Component 'Parent'[4]: ForEach id 7: use of default id generator function not possible on provided data structure. Need to specify id generator function (ForEach 3rd parameter). Application Error! +Stacktrace: + ... + at anonymous (entry/src/main/ets/pages/Index.ets:18:52) +``` \ No newline at end of file diff --git a/zh-cn/application-dev/ui/state-management/figures/ForEach-defined-keyGenerator2.PNG b/zh-cn/application-dev/ui/state-management/figures/ForEach-defined-keyGenerator2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..d968324b43a187a3fa9c2b2890d40ed93ca927ad Binary files /dev/null and b/zh-cn/application-dev/ui/state-management/figures/ForEach-defined-keyGenerator2.PNG differ