用途:指导在 Vaadin 25 Flow 应用中集成来自 npm 的第三方 Web Components 与 React 组件。资料建议在不确定 API 细节时使用 Vaadin MCP 工具(search_vaadin_docs、get_component_java_api)查询最新文档,vaadin_version 设为 "25",ui_language 设为 "java";查 Java API 签名或源码可用 javadoc MCP 从 Maven Central 读取。
两条集成路径按 npm 包导出内容选择:若导出自定义元素(customElements.define()),走 Web Component 路径,Java 基类为 Component 或 AbstractSinglePropertyField,通常无需客户端代码,状态同步用元素属性加 @Synchronize / @DomEvent;若只导出 React 组件,走 React 路径,Java 基类为 ReactAdapterComponent,需要一层薄 .tsx 适配文件,状态同步用 setState() / getState() / hooks.useState()。若两者都导出,优先 Web Component 路径以避免额外适配层。
Web Component 路径核心:用 @Tag(须与注册的标签名一致)、@NpmPackage(触发 npm 安装并固定版本)、@JsModule(导入注册自定义元素的模块)三个注解;属性读写用 getElement().setProperty/getProperty 或 PropertyDescriptor;属性同步可用 @Synchronize(仅限根元素事件)或 Element.addPropertyChangeListener();DOM 事件用 @DomEvent 与 @EventData 映射为 Java 事件,构造函数前两个参数 source、fromClient 自动填充;调用元素方法用 callJsFunction;子元素可实现 HasComponents 或用 Element API;作为输入字段可继承 AbstractSinglePropertyField 以配合 Binder。
React 路径核心:Java 侧继承 ReactAdapterComponent,用 setState/getState/addStateChangeListener 同步状态,构造函数中须先 setState 初始化以支持 @PreserveOnRefresh;复杂类型用 record 或 bean,按 JSON 序列化;客户端 .tsx 继承 ReactAdapterElement,实现 render(hooks),用 hooks.useState、hooks.useCustomEvent、hooks.useContent,并用 customElements.define() 注册与 @Tag 一致的标签名;作为 Binder 字段时继承 AbstractSinglePropertyField 并派发 value-changed 自定义事件;还可用 getContentElement 与 hooks.useContent 在 React 中嵌入 Flow 组件。
限制:资料未提供具体收费、价格、平台支持范围或效果数据;示例中的 npm 包为假设或示例性质,实际 API 细节需查阅对应包文档。