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] 表单在初始化时,scope 内的函数被多次执行 #4000

Closed shengbenqiang closed 11 months ago

shengbenqiang commented 11 months ago

Reproduction link

Edit on CodeSandbox

Steps to reproduce

进入例子链接,查看 console.log 打印内容就可以发现 handleSearchCountry,handleSearchCity,handleSearchTimeZone,handleSearchSpaceLocation被多次调用

What is expected?

在初始化时 handleSearchCountry,handleSearchTimeZone,handleSearchAdpCorp 这种一次性函数只被调用一次,handleSearchCity,handleSearchSpaceLocation在联动时再被调用

What is actually happening?

在初始化时,handleSearchCountry,handleSearchCity,handleSearchTimeZone,handleSearchSpaceLocation 等函数似乎被循环调用了

Package

@formily/react@2.2.24


我不确定这是否是个 bug ,还是我的使用出现了问题,但我查阅了相关 issue 和 discussions 没有找到问题,也查阅了我所使用的 api 的相关文档,几番测试都查找不到原因,希望得到解答,谢谢

lumdzeehol commented 11 months ago

你的effect中对将form.values 引用改变了,造成了每个field的更新。 使用form.setValues 或者Object.assign的方式去设置值就不会触发多次执行了

"x-reactions": [
            {
              dependencies: ["spaceLocationNo"],
              fulfill: {
                run:
                  "\n          const defaultValue = {\n            array: [],\n          };\n          $form.values = {\n            ...($form.values || {}),\n            'locationEnName': $deps[0]  ? ($deps[0]['spaceLocationEnName'] || '') : (defaultValue['undefined'] || '')\n          };\n          "
              }
            }
          ]
shengbenqiang commented 11 months ago

你的effect中对将form.values 引用改变了,造成了每个field的更新。 使用form.setValues 或者Object.assign的方式去设置值就不会触发多次执行了

"x-reactions": [
            {
              dependencies: ["spaceLocationNo"],
              fulfill: {
                run:
                  "\n          const defaultValue = {\n            array: [],\n          };\n          $form.values = {\n            ...($form.values || {}),\n            'locationEnName': $deps[0]  ? ($deps[0]['spaceLocationEnName'] || '') : (defaultValue['undefined'] || '')\n          };\n          "
              }
            }
          ]

非常感谢,我这边试了一下成功了,我这里可以问下这里这样设计是为什么呢?或者有这样设计介绍文档链接吗,如果我可以看的话,我想要了解一下这样设计原因和概念,谢谢

lumdzeehol commented 11 months ago
  • [ ] I have searched the issues of this repository and believe that this is not a duplicate.

Reproduction link

Edit on CodeSandbox

Steps to reproduce

进入例子链接,查看 console.log 打印内容就可以发现 handleSearchCountry,handleSearchCity,handleSearchTimeZone,handleSearchSpaceLocation被多次调用

What is expected?

在初始化时 handleSearchCountry,handleSearchTimeZone,handleSearchAdpCorp 这种一次性函数只被调用一次,handleSearchCity,handleSearchSpaceLocation在联动时再被调用

What is actually happening?

在初始化时,handleSearchCountry,handleSearchCity,handleSearchTimeZone,handleSearchSpaceLocation 等函数似乎被循环调用了

Package

@formily/react@2.2.24


我不确定这是否是个 bug ,还是我的使用出现了问题,但我查阅了相关 issue 和 discussions 没有找到问题,也查阅了我所使用的 api 的相关文档,几番测试都查找不到原因,希望得到解答,谢谢

这个就是引用的问题。 直接改form.values的引用相当于改了所有的值。你只更新values的某个值就只会通知对应的观察者