我尝试用Vue 3创建一个gridstack.js Jmeter 板,我希望网格堆栈项目包含React性的VUE 3组件。
问题是这些网格堆栈项只能通过HTML传递。文档说明你应该能够添加Vue组件作为内容,但示例是针对Vue 2的,我正在努力在Vue 3中实现这一点。
下面的代码:
<template>
<div class="p-6 h-full flex flex-col">
<header class="flex flex-row items-center justify-between mb-6">
<div>
<h1 class="text-3xl font-bold">
Workbench
</h1>
<p class="leading-6 text-gray-600 text-sm mt-2">
{{ info }}
</p>
</div>
<div class="flex flex-row items-center">
<button type="button" @click="addPanel()">Add Panel</button>
</div>
</header>
<div class="flex-1">
<section class="grid-stack"></section>
</div>
</div>
</template>
<script setup>
import { ref, onMounted, defineComponent, createApp } from "vue"
import TestPanel from "./../components/panels/TestPanel.vue"
let grid = null;
const items = [
{ x: 0, y: 0, h: 4, w: 6 },
{ x: 7, y: 0, h: 4, w: 6 },
{ x: 0, y: 5, h: 4, w: 4 },
{ x: 4, y: 5, h: 4, w: 4 },
{ x: 8, y: 5, h: 4, w: 4 },
];
onMounted(() => {
grid = GridStack.init({
// float: true,
cellHeight: "70px",
minRow: 1,
});
grid.load(items)
});
function addPanel() {
const div = document.createElement("div")
div.id = Math.random().toString(24).substring(8)
const componentInstance = defineComponent({
extends: TestPanel, data() {
return {
test: "this is a test"
}
}
})
const app = createApp(componentInstance)
app.mount(div)
let widget = grid.addWidget({
x: 0,
y: 0,
w: 6,
h: 3,
content: div.outerHTML,
})
app.mount(div.id)
}
</script>
<style>
.grid-stack-item-content {
background-color: #18BC9C;
}
</style>
这将在堆栈网格项中加载vue组件,但该组件不再是React性的。
任何帮助将不胜感激,提前感谢!
2条答案
按热度按时间yc0p9oo01#
这可能不是网格堆栈创建者所想的,但你可以这样做:
在我的例子中,缺少了一个div,其中
grid-stack-item-content
类 Package 了组件,这使得小部件无法移动。我还添加了一个add-new-widget函数,演示如何向网格添加新的小部件。关键是使用reactive()
,这样Vue将重新呈现页面。重新呈现后,组件需要使用grid.makeWidget
注册为网格元素。为此,我们需要组件的Dom元素,该元素是在Vue使用nextTick
重新渲染后获得的。mzmfm0qo2#
您可以像这样在Vue3中使用自己的组件
导入组件
添加要导出的组件
就这样。结果可以是这样的