使用 @Tag(Tag.DIV) 注释和从 Div class 扩展的区别

Difference between annotating with @Tag(Tag.DIV) and extending from Div class

我正在学习 Vaadin 11,我有一个问题。这有什么区别:

public class MyClass extends Div { /... }

...还有这个?:

@Tag(Tag.DIV)
public class MyClass { /** }

根据文档:

Div class: Component representing a <div> element.

Tag annotation: Defines the tag to use for the root element for a component created using the default Component constructor.

看起来他们在做同样的事情:制作一个 class 来表示根元素。是吗?

这两种方式都会在浏览器中为您提供一个 <div> 元素(除了您需要将 extends Component 添加到 @Tag(Tag.DIV) 示例中)。

区别在于 Div class 还专门为 <div> 元素定义了一些额外的 API,而您可以完全控制 public API 组件的 Component subclass 和 @Tag(Tag.DIV).

区别在于服务器端API。 Div class 本身确实很简单,但它确实通过其父类实现了一些有用的 mixin 接口,如 HasSizeHasStyle。这意味着您可以,例如如果要扩展 Div,请调用 myClass.setHeight("500px")

另一方面,如果您使用 @Tag 注释来表明您的 MyComponent class 在客户端具有 div 标记,则您不会除了您决定自己提供的内容之外,还公开任何服务器端方法。这是好事还是坏事取决于您想为 class 的用户提供什么样的功能。