vue3中使用element-plus的弹窗组件,引用复选框组件双向绑定值不生效?
代码如下:
<template>
<el-dialog v-model="dialogVisible" title="新增角色" width="600px">
<el-form ref="roleRef" :rules="roleRules" :model="roleForm" label-width="120px">
<el-form-item label="角色名称" prop="roleName">
<el-input v-model="roleForm.roleName" placeholder="请输入角色名称" />
</el-form-item>
<el-form-item label="权限字符" prop="rolePerm">
<el-input v-model="roleForm.rolePerm" placeholder="请输入权限字符" />
</el-form-item>
<el-form-item label="状态" prop="enabled">
<el-radio-group v-model="roleForm.enabled">
<el-radio :label="item.v" v-for="item in statusCheck" :key="item.v">{{ item.name }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="菜单权限">
<div class="tree-menu">
<el-checkbox label="展开/折叠" v-model="permission.openAll" @change="toggleOpenAll" />
<el-checkbox label="全选/全不选" v-model="permission.selectAll" @change="toggleSelectAll" />
<el-checkbox label="父子(联动/不联动)" v-model="permission.linkage" />
<el-tree class="tree-box mt10" ref="menuTreeRef" :props="permission.treeProps"
:data="permission.treeList" :check-strictly="!permission.linkage"
:default-expand-all="permission.openAll" show-checkbox node-key="id"
@check-change="handleCheckChange" />
</div>
</el-form-item>
<el-form-item label="备注">
<el-input type="textarea" maxlength="200" v-model="roleForm.descript" placeholder="请输入内容" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submit">
确认
</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup>
import { ref, reactive, onBeforeMount } from 'vue'
import { roleAdd } from '@/api/system/role'
import { menuTree } from "@/api/system/menu";
const roleForm = reactive({
roleName: "",//角色名称
rolePerm: "",//角色权限编码
enabled: '1',//是否启用(0:禁用;1:启用)
descript: '',//描述
permissionIds: []//菜单ID
})
const roleRules = {
roleName: [{ required: true, trigger: "blur", message: "请输入角色名称" }],
rolePerm: [{ required: true, trigger: "blur", message: "请输入角色权限编码" }],
};
// 展开
const toggleOpenAll = (e) => {
permission.openAll = e
console.log('展开', permission.openAll);
}
// 全选
const toggleSelectAll = (e) => {
console.log('全选', e);
permission.selectAll = e;
}
// 权限树dom
const menuTreeRef = ref();
// 控制菜单树
const permission = reactive({
openAll: false,
selectAll: false,
linkage: true,
treeList: [],
treeProps: {
label: 'name'
}
})
const handleCheckChange = (data,
checked,
indeterminate) => {
console.log('选择一项', data, checked, indeterminate)
}
onBeforeMount(async () => {
let res = await menuTree()
permission.treeList = res.data
console.log('菜单树', res.data);
})
const statusCheck = reactive([{ name: '启用', v: '1' }, { name: '禁用', v: '0' }])
// console.log(roleForm.enabled);
const checkList = ref(['Option A'])
const dialogVisible = ref(true)
const show = () => {
dialogVisible.value = true
}
const roleRef = ref(null);
const emit = defineEmits(['myclick'])
const submit = () => {
roleRef.value.validate(async (valid) => {
if (valid) {
let res = await roleAdd(roleForm)
console.log('新增成功', res);
dialogVisible.value = false
ElMessage.success('新增成功')
emit('myclick')
} else {
console.log('error submit!')
return false
}
})
}
// 向外暴露属性和方法
defineExpose({
dialogVisible,
show,
});
</script>
<style lang="scss" scoped>
.tree-menu {
width: 100%;
}
.tree-box {
border: 1px solid #dcdfe6;
}
</style>