alibaba / formily

📱🚀 🧩 Cross Device & High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3
https://formilyjs.org/
MIT License
11.32k stars 1.48k forks source link

[Bug Report] ArrayField删除行时,多次删除同一行,由于field顺序导致对字段的操作顺序不对 #4130

Open johnwojtek opened 5 months ago

johnwojtek commented 5 months ago

Reproduction link

Edit on CodeSandbox

Steps to reproduce

ArrayField name为array,其中一行为Input,其name为a2,用onFieldValueChange建立对array.*.a2的依赖。

添加5行数据,在a2那一列每行填入数据。然后持续删除index 为0的那一行。

What is expected?

直到删除所有行,也不会触发onFieldValueChange的回调。

What is actually happening?

第一次删除,不会触发onFieldValueChange的回调。第二次删除就会触发,之后每次删除这一行都会触发。

在spliceArrayState中对需要删除的行的字段进行操作,在each函数里,第一次删除后,所有字段在form.fields中的顺序有问题,导致生成的对field得操作也不对。比如删除array.0. ,删除后,新的array.0. 会被挪到最后,第二次删除array.0. ,生成的操作就是先将array.1. update 到array.0. ,最后才是remove array.0. 的操作。

Package

@formily/core@2.3.1