javascript vaadin读取组件在dom中创建新元素

ryoqjall  于 2023-01-16  发布在  Java
关注(0)|答案(1)|浏览(102)

在Vaadin中,当重新读取之前删除的组件时,将在DOM中创建一个新元素。
让我们详细了解一下

Button button = new Button("test");
button.getElement().executeJs("""
                this.addEventListener("click", event => {
                    alert("hello");
                });
                """);
add(button);

现在,在服务器上的一些事件之后,我们决定从视图中删除组件。2因此,DOM中相应的元素也被删除。
然后在另一个事件之后,我们再次添加按钮组件。因此vaadin在客户端上创建了一个新元素,并将其添加到DOM中。(新元素缺少eventlistener)
我希望vaadin重用之前存在的相同元素,但事实并非如此。通常这并不重要,但在我们的例子中,我们用js添加了一个eventlistener。(是的,我们可以在javaside上添加eventlistener,但让我们假设我们真的需要在js中这样做,因为我们想在客户端上执行一些代码)
为什么vaadin要这么做?2有没有一个选项可以让vaadin总是使用相同的元素?3在纯JS中我可以很容易地创建一个查找表,其中包含我删除的元素,然后稍后使用查找表中的元素将它们再次添加到DOM中。4这样做可以保留该元素的所有事件侦听器。
真正让我困惑的是,即使DOM中的元素每次都不同,但我用component.getElement()得到的元素总是相同的,这个元素不应该代表客户端的元素吗?
当然,我们可以在每次将元素添加到视图中时都对该元素运行相同的js,但这非常麻烦。
vaadin这样做是因为性能的原因吗?你对这种行为有什么解释?

crcmnpdw

crcmnpdw1#

这确实是一种避免内存泄漏的机制。基于服务器端引用跟踪的机制会明显更复杂,工作时会有延迟(因为引用只有在GC运行时才被清除),并且使开发人员更难控制发生了什么。当前的设计使开发人员更容易选择应该发生什么:隐藏以将其保留在浏览器中,分离以使其成为垃圾回收。
我还可以说明,如果组件被分离,然后在同一次服务器访问期间又被附加回去,那么将重用同一个DOM元素。

相关问题