在 Vue 定义的 Web 组件(自定义元素)上公开函数
Exposing functions on a Vue-defined Web Component (Custom Element)
Per the Vue docs, it's possible to build components in Vue (v3) and package them as native Web Components 用于任何框架或 none。
正如我已经发现的那样,Vue 组件和 Web 组件的设计模型之间的差距可能会使这个想法变得复杂,有时甚至是一个直截了当的坏主意(在什么时候继续构建会更好、更易于维护完全原生的组件?)...但是让我们暂时假设它在这里是必要的。
我的问题 - 在 Vue 构建的 Web 组件上(向父节点)公开类似函数的界面的最佳方法是什么?
Vue 文档讨论了通过 props/slots 传递反应性数据,以及 从 组件发布自定义事件,但我没有看到提及
从外部接受函数调用(或一口气,事件)。据我所知,这是一个非常有力的假设,即 app/page 其余部分的数据和事件流以非常“类似 Vue 的方式”工作?
目前,我的解决方法是在 onMounted()
中查找主机元素(根据 ),然后只设置此时所需的任何额外属性(希望它们不应该在 Vue 组件安装之前不需要,因为我不知道 Vue 完成安装自定义元素时引发的任何外部事件。
这样,该函数仍然可以在设置函数的上下文中定义并从中访问 variables/etc - 但可以由页面上仅引用该元素的其他元素调用,不是 Vue 组件。
虽然不能说我很喜欢它:
<template>
<div ref="someElInTemplate">...</div>
</template>
<script lang="ts">
interface MyCoolHTMLElement extends HTMLElement {
myCoolFunction: () => void;
}
</script>
<script setup lang="ts">
const someElInTemplate = ref<HTMLElement>();
function myCoolFunction() { }
onMounted(() => {
const hostNode = (
somElInTemplate.value?.getRootNode() as ShadowRoot | undefined
)?.host as MyCoolHTMLElement;
hostNode.myCoolFunction = myCoolFunction;
});
</script>
Per the Vue docs, it's possible to build components in Vue (v3) and package them as native Web Components 用于任何框架或 none。
正如我已经发现的那样,Vue 组件和 Web 组件的设计模型之间的差距可能会使这个想法变得复杂,有时甚至是一个直截了当的坏主意(在什么时候继续构建会更好、更易于维护完全原生的组件?)...但是让我们暂时假设它在这里是必要的。
我的问题 - 在 Vue 构建的 Web 组件上(向父节点)公开类似函数的界面的最佳方法是什么?
Vue 文档讨论了通过 props/slots 传递反应性数据,以及 从 组件发布自定义事件,但我没有看到提及 从外部接受函数调用(或一口气,事件)。据我所知,这是一个非常有力的假设,即 app/page 其余部分的数据和事件流以非常“类似 Vue 的方式”工作?
目前,我的解决方法是在 onMounted()
中查找主机元素(根据
这样,该函数仍然可以在设置函数的上下文中定义并从中访问 variables/etc - 但可以由页面上仅引用该元素的其他元素调用,不是 Vue 组件。
虽然不能说我很喜欢它:
<template>
<div ref="someElInTemplate">...</div>
</template>
<script lang="ts">
interface MyCoolHTMLElement extends HTMLElement {
myCoolFunction: () => void;
}
</script>
<script setup lang="ts">
const someElInTemplate = ref<HTMLElement>();
function myCoolFunction() { }
onMounted(() => {
const hostNode = (
somElInTemplate.value?.getRootNode() as ShadowRoot | undefined
)?.host as MyCoolHTMLElement;
hostNode.myCoolFunction = myCoolFunction;
});
</script>