推荐使用 Element Plus + Vue.js,可以结合使用拖拽库如 vue-draggable-resizable 和 vue-grid-layout。
Element Plus 是一款基于 Vue.js 2.0 的 UI 组件库,提供了丰富的组件和功能。而 vue-draggable-resizable 是一款基于 Vue.js 的可拖拽和可调整大小的组件库,可以快速实现拖拽和调整元素大小的功能。vue-grid-layout 则是一个响应式的网格布局系统,可以帮助我们更好地管理和布局页面元素。
具体实现步骤如下:
1. 首先安装 Element Plus 和 vue-draggable-resizable。
```bash
npm install element-plus vue-draggable-resizable
```
2. 引入 Element Plus 和 vue-draggable-resizable。
```javascript
import ElementPlus from 'element-plus';
import 'element-plus/lib/theme-chalk/index.css';
import VueDraggableResizable from 'vue-draggable-resizable';
import 'vue-draggable-resizable/dist/VueDraggableResizable.css';
```
3. 注册 Element Plus 组件和 vue-draggable-resizable 组件。
```javascript
Vue.use(ElementPlus);
Vue.component('vue-draggable-resizable', VueDraggableResizable);
```
4. 创建一个页面布局组件,使用 vue-draggable-resizable 实现元素拖拽和调整大小。
```html
<template>
<div class="page-layout">
<vue-draggable-resizable
v-for="(item, index) in items"
:key="index"
:x="item.x"
:y="item.y"
:w="item.w"
:h="item.h"
:min-w="item.minW"
:min-h="item.minH"
:max-w="item.maxW"
:max-h="item.maxH"
:z="item.z"
:isDraggable="item.isDraggable"
:isResizable="item.isResizable"
:onDragStart="onDragStart"
:onDrag="onDrag"
:onDragStop="onDragStop"
:onResizeStart="onResizeStart"
:onResize="onResize"
:onResizeStop="onResizeStop"
>
<div class="inner">{{ item.content }}</div>
</vue-draggable-resizable>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{
x: 0,
y: 0,
w: 2,
h: 2,
minW: 1,
minH: 1,
maxW: 6,
maxH: 6,
z: 1,
isDraggable: true,
isResizable: true,
content: 'Element 1',
},
{
x: 2,
y: 0,
w: 2,
h: 4,
minW: 1,
minH: 1,
maxW: 6,
maxH: 6,
z: 2,
isDraggable: true,
isResizable: true,
content: 'Element 2',
},
// ...
],
};
},
methods: {
onDragStart(event, ui) {
console.log('onDragStart', event, ui);
},
onDrag(event, ui) {
console.log('onDrag', event, ui);
},
onDragStop(event, ui) {
console.log('onDragStop', event, ui);
},
onResizeStart(event, ui) {
console.log('onResizeStart', event, ui);
},
onResize(event, ui) {
console.log('onResize', event, ui);
},
onResizeStop(event, ui) {
console.log('onResizeStop', event, ui);
},
},
};
</script>
<style scoped>
.page-layout {
position: relative;
height: 500px;
border: 1px solid #ccc;
}
.inner {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
</style>
```
5. 使用 vue-grid-layout 实现响应式布局。
```html
<template>
<div class="page-layout">
<vue-grid-layout
:layout="layout"
:rowHeight="30"
:cols="12"
:isDraggable="true"
:isResizable="true"
:verticalCompact="false"
:margin="[10, 10]"
@layout-update="onLayoutUpdate"
>
<div
v-for="(item, index) in items"
:key="index"
:data-grid="{x: item.x, y: item.y, w: item.w, h: item.h, i: item.i}"
>
<div class="inner">{{ item.content }}</div>
</div>
</vue-grid-layout>
</div>
</template>
<script>
import VueGridLayout from 'vue-grid-layout';
export default {
data() {
return {
layout: [
{ x: 0, y: 0, w: 2, h: 2, i: '1' },
{ x: 2, y: 0, w: 2, h: 4, i: '2' },
// ...
],
items: [
{
x: 0,
y: 0,
w: 2,
h: 2,
content: 'Element 1',
},
{
x: 2,
y: 0,
w: 2,
h: 4,
content: 'Element 2',
},
// ...
],
};
},
components: {
VueGridLayout,
},
methods: {
onLayoutUpdate(layout) {
this.layout = layout;
this.items = layout.map((item) => {
const { x, y, w, h } = item;
const index = parseInt(item.i) - 1;
return {
x,
y,
w,
h,
content: `Element ${index + 1}`,
};
});
},
},
};
</script>
<style scoped>
.page-layout {
position: relative;
height: 500px;
border: 1px solid #ccc;
}
.inner {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
</style>
```
以上是基于 vue 的可视化拖拽页面生成工具的实现方法,可以根据自己的需求进行选择和调整。