目录如下

1、App.vue
<template>
<div id="app">
<Render/>
<JSX/>
<LowCode/>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
import Render from './components/01_Render.vue'
import JSX from './components/02_JSX.vue'
import LowCode from './components/03_LowCode.vue'
export default {
name: 'App',
components: {
Render,JSX,LowCode
}
}
</script>
2、Render.vue
<script>
export default {
methods: {
getDomAttr() {
return { style: { background: 'yellowgreen' }, attrs: { mytest: 'abc' },on: { click: function () { alert(1) } } };
}
},
render(h) {
return h('div', this.getDomAttr(), [
h('h2', {}, '1'),
h('h2', {}, '2'),
h('h2', {}, '3'),
h('button',{},'4'),
]);
}
}
</script>
3、JSx.vue
<script>
function renderDemo1(h,num1) {
return num1 === 1 && <div>111</div>
}
function renderDemo(h,num, num1) {
switch (num) {
case 1:
return <div>一的内容 {renderDemo1(h,num1)} </div>;
case 2:
return <div>二的内容</div>
}
}
function renderForm(h,form){
return <input value={ form.username } onInput={ val => form.username = val.target.value } />
}
export default {
methods: {
doClick() {
console.log('开始点击了...')
},
renderTest() {
return (
<div style={{ background: 'yellowgreen' }} test={'abc'} onClick={this.doClick} >
<h2>1</h2>
<h2>2</h2>
<h2>3</h2>
</div>
)
},
},
data() {
return {
num: 1,
num1: 1,
form:{ username:'123' }
}
},
render(h) {
const { num, num1,form } = this;
return renderForm(h,form)
}
}
</script>
<style>
</style>
3、03_LowCode.vue
<template>
<div class="box">
<div class="aside">
<button compName="A" draggable="true" @dragstart="recordData">A组件</button>
<button compName="B" draggable="true" @dragstart="recordData">B组件</button>
<button compName="C" draggable="true" @dragstart="recordData">C组件</button>
<button compName="D" draggable="true" @dragstart="recordData">D组件</button>
</div>
<div class="viewport" @dragover.prevent @drop="addComp">
<div :id="item.id" v-for="item in comps"></div>
</div>
</div>
</template>
<script>
import A from './A';
import B from './B';
import C from './C';
import D from './D';
import Vue from 'vue';
export default {
components: {
A, B, C, D
},
data() {
return {
comps: []
}
},
methods: {
addComp(e) {
let compName = e.dataTransfer.getData('compName');
console.log('组件名称:', compName);
const Comp = this.$options.components[compName];
this.comps.push({
id: compName
});
this.$nextTick(() => {
new Vue({
render: Comp.render,
}).$mount('#' + compName)
})
},
recordData(e) {
console.log('开始拖动了')
let compName = e.target.getAttribute('compName');
e.dataTransfer.setData('compName', compName);
}
}
}
</script>
<style scoped>
.box {
width: 1000px;
display: flex;
}
.box,
.aside,
.viewport {
height: 800px;
}
.aside {
width: 300px;
background: yellowgreen;
}
.viewport {
flex: 1;
background: grey;
}
</style>
4、A、B、C组件可自行定义
5、动画效果如下

6、总结
拖拽真方便,效率好高,一键三连,💖💖💖
