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.26k stars 1.46k forks source link

[Bug Report] FormDialog组件 每次调用FormDialog函数创建新的Dialog,关闭销毁时,并没有把创建的Dialog元素从body中移除 #3931

Closed SorrowX closed 11 months ago

SorrowX commented 1 year ago

Reproduction link

Edit on CodeSandbox

Steps to reproduce

1.打开官网链接 https://element.formilyjs.org/guide/form-dialog.html#markup-schema-%E6%A1%88%E4%BE%8B 或者上面的链接

  1. 点击3次打开表单按钮

  2. f12进入调试控制台,会发现body下会插入3个类名el-dialog__wrapper formily-element-form-dialog的div块元素

What is expected?

  1. 关闭dialog弹窗时,希望把多余的dom元素从body下移除

What is actually happening?

  1. 每次打开关闭弹窗后,body下多一个dialog弹窗dom

Package

@formily/element@2.2.22


原因: 部分源代码

env.instance.$mount(env.root)

env.root 是创建的空div元素,instance实例安装到env.root后,仅仅把env.instance的$el元素挂载到body下,最后关闭时

onClosed: () => {
      props.onClosed?.()
      env.instance.$destroy()
      env.instance = null
      env.root?.parentNode?.removeChild(env.root)
      env.root = undefined
    },

移除的仅仅是当时创建的空div元素。

解决方案:

env.instance.$mount(env.root)
env.root = env.instance.$el

可以加一句赋值语句,关闭时就能移除弹窗dom元素。

以上想法,仅供参考,希望官网可以关注下,虽然不是什么bug,但是每次打开关闭,就会有多余的dom,还是很不愉快。

janryWang commented 1 year ago

可以提一个 PR 吗?真的感谢🙏