本页介绍了 Vue 对自定义元素(Web Components)的实现,以及如何将 Vue 组件转换为原生 Web Component。Vue 中的自定义元素允许您在标准 HTML 中使用 Vue 的响应式系统和组件模型,从而实现与其他框架或原生 JavaScript 应用程序的互操作性。
有关特定组件功能的更多信息,请参阅组件系统。
Vue 自定义元素是由 Vue 组件系统驱动的原生浏览器自定义元素。它们将 Vue 的响应式和组件模型与 Web Components 标准集成,允许 Vue 组件在任何 Web 应用程序中使用,无论其框架如何。
来源: packages/runtime-dom/src/apiCustomElement.ts63-184 packages/runtime-dom/src/index.ts253-262
Vue 提供了几个用于处理自定义元素的 API
| API | 描述 |
|---|---|
defineCustomElement | 将 Vue 组件转换为自定义元素构造函数 |
defineSSRCustomElement | 创建用于 SSR 水化的自定义元素构造函数 |
VueElement | Vue 驱动的自定义元素基类 |
useHost | 组件钩子,用于访问自定义元素实例 |
useShadowRoot | 组件钩子,用于访问自定义元素的 shadow root |
来源: packages/runtime-dom/src/apiCustomElement.ts64-184 packages/runtime-dom/src/apiCustomElement.ts685-712
defineCustomElement 函数将 Vue 组件定义转换为自定义元素构造函数。它接受与 defineComponent 相同的选项,以及额外的自定义元素特定选项。
来源: packages/runtime-dom/src/apiCustomElement.ts53-58 packages/runtime-dom/src/apiCustomElement.ts167-185
来源: packages/runtime-dom/__tests__/customElement.spec.ts34-46
VueElement 类是 Vue 自定义元素实现的基础。它扩展了 HTMLElement,并管理自定义元素内的 Vue 组件生命周期。
来源: packages/runtime-dom/src/apiCustomElement.ts202-683
自定义元素的生命周期钩子映射到 Vue 组件的生命周期如下
初始化:
连接:
connectedCallback → 创建并挂载 Vue 组件更新:
断开连接:
disconnectedCallback → 卸载 Vue 组件来源: packages/runtime-dom/src/apiCustomElement.ts279-337 packages/runtime-dom/src/apiCustomElement.ts466-520
Vue 自定义元素会自动在组件 props 和 DOM 属性之间同步
my-prop)映射到 camelCase 属性(例如 myProp)来源: packages/runtime-dom/src/apiCustomElement.ts442-463 packages/runtime-dom/src/apiCustomElement.ts487-520 packages/runtime-dom/__tests__/customElement.spec.ts150-238
从 Vue 组件发出的事件会被调度为原生的 DOM CustomEvents
emit 发出事件detail 属性中来源: packages/runtime-dom/src/apiCustomElement.ts552-571 packages/runtime-dom/__tests__/customElement.spec.ts476-584
Vue 自定义元素默认支持原生 shadow DOM slots
<slot> 元素,映射到原生 slots可以通过将 shadowRoot 选项设置为 false 来禁用 shadow DOM 的使用。在这种情况下:
来源: packages/runtime-dom/src/apiCustomElement.ts264-271 packages/runtime-dom/src/apiCustomElement.ts617-657 packages/runtime-dom/__tests__/customElement.spec.ts588-664 packages/runtime-dom/__tests__/customElement.spec.ts957-1025
组件中定义的样式将被注入到 shadow DOM 中
styles 数组选项定义样式<style> 元素注入到 shadow root 中可以使用 nonce 选项配合 nonce 值来应用样式,以兼容内容安全策略 (CSP)。
来源: packages/runtime-dom/src/apiCustomElement.ts579-612 packages/runtime-dom/__tests__/customElement.spec.ts714-809
Vue 支持自定义元素的 SSR
defineSSRCustomElement 代替 defineCustomElement来源: packages/runtime-dom/src/apiCustomElement.ts188-194 packages/vue/__tests__/e2e/ssr-custom-element.spec.ts18-79
自定义元素可以与异步组件一起定义
来源: packages/runtime-dom/src/apiCustomElement.ts404-411 packages/runtime-dom/__tests__/customElement.spec.ts812-904
自定义元素支持 Vue 的 provide/inject 功能
来源: packages/runtime-dom/src/apiCustomElement.ts316-321 packages/runtime-dom/__tests__/customElement.spec.ts614-710
自定义元素支持 HMR (热模块替换) 用于开发
来源: packages/runtime-dom/src/apiCustomElement.ts539-551 packages/runtime-core/src/hmr.ts137-141
Vue 自定义元素的主要优势之一是框架互操作性
| 框架 | 用途 |
|---|---|
| 原生 JavaScript | document.createElement('my-element') |
| React | <my-element message="hello" /> |
| Angular | <my-element [message]="data" /> |
| Svelte | <my-element message={data} /> |
| Vue | <my-element :message="data" /> |
在非 Vue 应用中使用 Vue 自定义元素时
虽然 Vue 自定义元素提供了丰富的功能,但也存在一些限制
<Transition>` 这样的某些 Vue 特有功能需要特殊处理shadowRoot: false` 时,组件样式不会被应用刷新此 Wiki
最后索引时间2025 年 4 月 18 日(4f7925)