【发布时间】:2020-07-04 15:19:17
【问题描述】:
我正在尝试在 Vue 组件中呈现现有的 HTMLElement,如下所示:
const someElement = document.createElement('p'); // for instance
Vue.component('my-component', {
data: () => ({ someElement }),
template: '<div>{{ someElement }}</div>',
// The above doesn't work; {{ moustache }} tags turn the element into a string.
});
有几种部分解决方案,但没有一个是完美的:
-
我可以使用
v-html,它适用于某些元素,但无法保留,例如事件监听器。Vue.component('my-component', { data: () => ({ someElement }), template: '<div v-html="someElement.outerHTML"></div>', }); -
我可以在
mounted()钩子上手动注入元素,这会起作用,但有点难看并且感觉不习惯。Vue.component('my-component', { data: () => ({ someElement }), template: '<div></div>', mounted() { this.$el.appendChild(someElement); }, }); -
如果我能以某种方式将元素包装在一个组件中,我就可以渲染该包装组件。但目前尚不清楚如何做到这一点。我可以使用manual
render()function,但render()似乎必须返回VNode实例,而且我看不到将HTMLElement对象转换为VNode实例的方法。鉴于VNode表示虚拟 DOM,而HTMLElement是实际 DOM 的一部分,因此不应期望存在一种方式。Vue.component('element-wrapper', { render() { return someElement; // can't, not a VNode }, }); Vue.component('my-component', { template: '<div><element-wrapper></element-wrapper></div>', }); -
我可以使用
:is,但:is需要一个组件选项对象,这意味着这个选项与#3 具有所有相同的困难。Vue.component('my-component', { template: '<div><component :is="elementAsComponent"></component></div>', data: () => ({ elementAsComponent: /* again need to wrap element in component */, }), });
有没有优雅的方法来做到这一点?
【问题讨论】:
标签: javascript vue.js