好的,下面是一个实现以上需求的 Vue.js 组件:
<template>
<div class="container">
<div class="menu">
<el-tree :data="menuData" @node-click="handleMenuClick"></el-tree>
</div>
<div class="content">
<component :is="currentComponent"></component>
</div>
<div class="submit">
<el-button type="primary" @click="handleSubmit">提交</el-button>
</div>
</div>
</template>
<script>
import Component1 from './Component1.vue'
import Component2 from './Component2.vue'
import Component3 from './Component3.vue'
export default {
name: 'MyComponent',
components: {
Component1,
Component2,
Component3,
},
data() {
return {
menuData: [
{
label: '组件1',
name: 'component1',
},
{
label: '组件2',
name: 'component2',
},
{
label: '组件3',
name: 'component3',
},
],
currentComponent: '',
componentData: {
},
};
},
methods: {
handleMenuClick(data) {
this.currentComponent = data.name;
},
handleSubmit() {
console.log(this.componentData);
},
},
};
</script>
<style>
.container {
display: flex;
height: 100%;
}
.menu {
width: 200px;
}
.content {
flex-grow: 1;
}
.submit {
width: 100%;
text-align: center;
margin-top: 20px;
}
</style>
在这个组件中,左侧菜单使用了 Element UI 的 el-tree 组件,右侧内容区域使用了 Vue.js 的动态组件,根据当前选中的菜单项来动态加载不同的子组件。父组件中定义了一个 componentData 对象,用于保存各个子组件的表单数据。当点击提交按钮时,可以通过 console.log(this.componentData) 来获取所有子组件输入的数据。
注意,上面的代码中并没有实现子组件的表单,因为每个子组件的表单结构可能不同,具体的表单结构需要根据需求自行实现。不过,这个组件已经提供了一个框架,可以方便地进行扩展和修改。
好的,下面是针对之前提供的代码的一些完善:
在父组件中加入一个变量 selectedData,用于保存当前选中的菜单项的数据,以便在子组件中获取。
在子组件中加入表单,绑定表单数据和父组件中的 selectedData 变量。
在父组件中实现 handleSubmit 方法,遍历子组件中的表单数据,将数据保存到 componentData 对象中。
在父组件中通过 $refs 获取所有子组件的实例,以便在 handleSubmit 方法中调用子组件中的方法获取表单数据。
完善后的代码如下:
<template>
<div class="container">
<div class="menu">
<el-tree :data="menuData" @node-click="handleMenuClick"></el-tree>
</div>
<div class="content">
<component :is="currentComponent" ref="currentComponentRef"></component>
</div>
<div class="submit">
<el-button type="primary" @click="handleSubmit">提交</el-button>
</div>
</div>
</template>
<script>
import Component1 from './Component1.vue'
import Component2 from './Component2.vue'
import Component3 from './Component3.vue'
export default {
name: 'MyComponent',
components: {
Component1,
Component2,
Component3,
},
data() {
return {
menuData: [
{
label: '组件1',
name: 'component1'