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.12k stars 1.44k forks source link

[Bug Report] void 类型的节点 visible 是 false,它的 properties 的字段值并没有被清除 #3948

Closed Xianerrrrr closed 11 months ago

Xianerrrrr commented 11 months ago

Reproduction link

Edit on CodeSandbox

Steps to reproduce

What is expected?

预期 input 字段的值应该被清除,因为 visible 是 false

What is actually happening?

input 字段的值没有被清除

Package

@formily/core@2.2.25


janryWang commented 11 months ago

问题本质: 这里 Formily 清除值的原理是字段渲染的前提来清除的,但是父组件在一开始就隐藏了,子组件完全没机会渲染也就没有建模,所以也无法响应 visible 去删值。

顺便提一下: 这个其实是一个洗数据诉求,本身就不合理,如果上一次表单提交的数据是按照 FormVoid 隐藏的时候提交的,那数据库里面是不会存在这个值的,回显编辑的时候也不会有任何问题,除非是说存在脏数据,那脏数据问题,建议走处理脏数据的流程,而不是表单这一层来处理

Xianerrrrr commented 11 months ago

本质是知道的,这里有些行为不统一。 如果一开始父组件是显示的,子组件的field就会被创建,后面父组件再被隐藏 ,子组件的值就会被清除。 所以同一份 schema,子组件的值会不会被清除,和原始数据还有交互路径有关系,我感觉这样不太好,逻辑应该是统一的才对。

我理解一开始如果父组件被隐藏,子组件的filed就不被创建,是一种懒加载的优化?因为如果一开始父组件是显示的情况下,子组件 filed 被创建了,父组件再隐藏,子组件的 field 是不会被删除的。这种懒加载能否有个开关?

janryWang commented 11 months ago

@Xianerrrrr 这倒不是懒加载,是一开始设计就是这么设计的,没法改的,因为要支持动态片段,比如某个自定义组件内部动态渲染局部片段 schema ,这种其实没法提前建模的,完全未知