我有以下代码...
<html>
<head></head>
<body>
<div id="app">
{{ message }}
<jrg-element></jrg-element>
</div>
<script type="module">
import Vue from "//unpkg.com/vue/dist/vue.esm.browser.js";
import {ShadowElement, CREATE_ELEMENT} from "//unpkg.com/@jrg/ui/target/jrg-ui.esm.mjs";
class JrgElement extends ShadowElement {
constructor() {
super("<h1>CustomElement</h1>");
this.render();
}
}
CREATE_ELEMENT("jrg-element", JrgElement, {});
const app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
</body>
</html>
但是当我跑步时我得到......
如果我注释掉 Vue 部分,一切都会正常。如何在 Vue 中使用自定义元素?
更新
我尝试更新到...
CREATE_ELEMENT("jrg-element", JrgElement, {});
Vue.config.ignoredElements = ['jrg-element']
const app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
});
但我还是明白...
结果是 Vue 元素渲染,但自定义元素不渲染。
更新2
我尝试等待 dom 加载,就像......
document.addEventListener("DOMContentLoaded", function() {
new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
});
});
但结果是一样的
Vite 2 是这样的:
plugins: [
vue({
template: {
compilerOptions: {
isCustomElement: tag => tag === 'jrg-element'
}
}
})
],
Vue 模板(在您的情况下为
app
div
的内容)由 Vue 模板编译器编译,并期望所有自定义元素都是 Vue 组件并正确注册。为了告诉 Vue 您正在使用一些非 Vue 自定义元素(Web Components API),您需要配置编译器。
Vue 2.x
Vue.config.ignoredElements = ['jrg-element']
Vue 3
const app = Vue.createApp({})
app.config.isCustomElement = tag => tag === 'jrg-element'
我也有同样的问题。然而,我发现我试图通过修改属性(例如 HTMLElement className)在构造函数中做太多事情。
将不仅仅是变量初始化的任何无关代码从 constructor() 移出并移至 attributeChangedCallback() 或connectedCallback() 中。这为我解决了。