父组件
<template>
<div class="table-box">
<MenuForm ref="menuForm"/>
<el-button type="primary" @click="menuForm.open('create', '新增菜单')">新增菜单 </el-button>
</div>
</template>
<script setup lang="ts" name="SystemMenu">
import { ref } from "vue"
const menuForm = ref()
</script>
子组件
<template>
<el-dialog v-model="dialogVisible" :title="dialogTitle" v-bind="options.dialog">
<component :is="'el-form'" v-bind="options.formConfig" ref="proFormRef" :model="model">
<template v-for="item in options.columns" :key="item.prop">
<component is="el-form-item" v-bind="item.formItem">
<component v-if="item.attrs?.typeName == 'radio-group'" is="el-radio-group" v-model="model[item.formItem.prop]">
<template v-for="radioItem in item.attrs.data" :key="radioItem.value">
<component is="el-radio" :label="radioItem.label" :value="radioItem.value"></component>
</template>
</component>
<component v-else :is="(item.attrs?.typeName)?`el-${item.attrs.typeName}`:'el-input'" v-bind="item.attrs" v-model="model[item.formItem.prop]"></component>
</component>
</template>
<el-form-item>
<slot name="operation">
<el-button type="button">提交</el-button>
<el-button type="button">取消</el-button>
</slot>
</el-form-item>
</component>
</el-dialog>
</template>
<script setup lang="ts" name="MenuForm">
import { ref } from "vue"
import { CloseBold } from "@element-plus/icons-vue"
import { useAuthStore } from "@/stores/modules/auth";
let model = ref<any>({})
const dialogTitle = ref("未设置标题")
const formType = ref("")
const dialogVisible = ref(false)
const authStore = useAuthStore()
const options:any = ref({
formConfig: {
inline: false,
labelPosition: "right",
labelWidth: "80px",
size: "default",
disabled: false,
labelSuffix: " :"
},
columns: [
{
formItem: {
label: "上级菜单",
prop: "parentId"
},
attrs: {
typeName: "tree-select",
data: authStore.authMenuList,
props: { children: "children", label: "name" },
nodeKey: "id",
}
},
{ formItem: { label: "权限标识", prop: "permission"} },
{ formItem: { label: "菜单类型", prop: "name"},
attrs:{
typeName:"radio-group",
data:[{label:"目录",value:1},{label:"菜单",value:2},{label:"按钮",value:3}]
}
},
],
dialog: {
draggable: true,
alignCenter: true,
closeIcon: CloseBold
}
})
const open = async (type: string, title: string) => {
dialogVisible.value = true
dialogTitle.value = title
formType.value = type
}
defineExpose({ open })
</script>
<style scoped></style>