当前位置: 首页 > news >正文

Vue3 父组件引用子组件并控制子组件显隐及数据传递

子组件 UserFormDialog.vue

<!-- 用户新增和修改组件 -->
<template><!-- 弹窗 --><el-dialog v-model="visible" :title="title" width="60%" @close="handleClose"><el-form ref="dataFormRef" :model="formData" :rules="rules" label-width="80px">      ......</el-form><template #footer><div class="dialog-footer"><el-button type="primary" :loading="loading" @click="handleSubmit">确 定</el-button><el-button @click="handleClose">取 消</el-button></div></template></el-dialog>
</template><script setup>
import {ref, reactive, watch, nextTick} from 'vue'
import { ElMessage } from 'element-plus'// 1.使用 Vue 3.4+ 的 defineModel 定义了一个名为 visible 的双向绑定变量。父组件通过 v-model 传入该值,子组件修改它会自动同步到父组件,常用于控制弹窗显示/隐藏
const visible = defineModel({type: Boolean,default: false
})// 定义属性
const props = defineProps({// 弹窗类型 add: 新增 edit: 修改title: {type: String,default: ''},// 表单数据initData: {type: Object,default: () => ({})}
})// 2.定义事件
const emit = defineEmits(['success'])const loading = ref(false)
const dataFormRef = ref()// 本地表单数据(用于双向绑定和验证)
const formData = reactive({});// 表单校验
const rules = {......
};
// 监听外部传入的显示状态,当 visible 为 true 时填充表单数据
watch(visible, (val) => {if (val) {// 打开时填充表单数据nextTick(() => {Object.assign(formData, props.initData || {})dataFormRef.value.clearValidate()})}
})// 关闭弹窗
const handleClose = () => {visible.value = false
}// 提交表单
const handleSubmit = () => {dataFormRef.value.validate(async (valid) => {if (valid) {try {loading.value = true;const submitData = {...formData}// 新增或修改if (submitData.userId) {await UserAPI.update(submitData)ElMessage.success("修改成功");} else {await UserAPI.add(submitData)ElMessage.success("新增成功");}// 3.通知父组件刷新列表emit('success') handleClose();} catch (error) {ElMessage.error(error?.message || '操作失败');} finally {loading.value = false;}}});
}
</script><style lang="scss" scoped></style>

父组件 index.vue

<template><div class="app-container-row"><el-button type="success" icon="plus" @click="handleAddOrUpdate(undefined)">新增</el-button><!-- 1.子组件 v-model="dialog.visible"  对应子组件的 const visible = defineModel({type: Boolean,  default: false})@success="handleQuery"    对应子组件的 const emit = defineEmits(['success']); emit('success') --><UserFormDialogv-model="dialog.visible":title="dialog.title":init-data="initFormData"@success="handleQuery"/></div>
</template><script setup>
import {onMounted, reactive, ref, toRaw} from 'vue'
import UserFormDialog from "@/views/system/user/UserFormDialog.vue";/*** 定义组件名称:在调试工具(如 Vue DevTools)中会显示为组件名称,便于识别和调试* 支持<keep-alive>缓存*/
defineOptions({name: 'User'
})//==============用户表单=================
// 2.初始化子组件标题和显隐
const dialog = reactive({title: "",visible: false,
});const defaultFormData = {userId: undefined,loginName: '',nickName: '',gender: 1,deptId: undefined,phone: '',email: '',remark: ''
}const initFormData = reactive({ ...defaultFormData })// 新增或修改页面
function handleAddOrUpdate(rowData) {......dialog.visible = true;
}// 查询
function handleQuery() {}
</script><style lang="scss" scoped></style>
http://www.jsqmd.com/news/1022837/

相关文章:

  • 2026合肥黄金回收上门报价行情 避坑实用干货 - 余生黄金回收
  • 上门回收靠谱吗?沈阳五家名包回收平台服务细节全面测评 - 开心测评
  • 2026 国内 GEO服务商深度测评:从权威合规认证到实战效果交付
  • 光学级CVD单晶金刚石的制备工艺与关键性能指标解析
  • Git Fetch与Pull本质区别:信息同步vs状态变更
  • GPT-4o国内不可用原因与OpenAI兼容替代方案
  • MPC860 MMU与TLB深度解析:从寄存器操作到性能优化实战
  • 如何用ViGEmBus虚拟手柄驱动解决Windows游戏兼容性问题:5个实用技巧指南
  • NLP工程师的Loss函数实战指南:从交叉熵到Focal Loss
  • 2026年上海别墅装修服务商深度横评:从闭口合同到工地管家的全链路选型指南 - 精选优质企业推荐官
  • 告别重复点击!明日方舟MAA自动化助手让你的游戏时间更有价值
  • 【雷达】调频连续波(FMCW)合成孔径雷达(SAR)模拟器附Matlab代码
  • 2026年浙江门窗改造全攻略:从选购到安装,杭州业主必读的隔音节能方案对比 - 企业名录优选推荐
  • 联发科设备底层调试与刷机工具MTKClient技术解析
  • 2026 年 6 月复合风管采购避坑指南:六大选型标准及靠谱厂家推荐 - 资讯报道
  • 2026保姆级教程:Excel转txt方法大全,Excel另存为文本文件详细操作步骤 - AI测评专家
  • 2026商洛本地防雷检测哪家专业?TOP 正规机构榜单 + 防雷装置 + 接地电阻 + SPD 检测 附电话地址 - 中安检测集团
  • 机器人多层陶瓷电容器(MLCC)
  • 从技术专家到行业标杆:打造个人深度影响力的实战方法论
  • 2026日喀则本地防雷检测哪家专业?TOP 正规机构榜单 + 防雷装置 + 接地电阻 + SPD 检测 附电话地址 - 中安检测集团
  • 航空常旅客计划:深度解析飞行活跃度暂停机制与权益保全策略
  • ComfyUI-Manager终极指南:如何快速实现自动化节点安装与管理
  • 24小时守护,不止于“站岗”
  • 探索ComfyUI-Manager扩展管理系统的架构设计与性能优化
  • 油气水系统压力开关H100-705
  • 2026年西安装修公司哪家靠谱?西安本地口碑榜单及避坑指南 - 小随科技
  • 深圳登报声明在哪里办理?深圳登报声明怎么收费?
  • 用r²决定系数做股票市场相关性分析的实战方法
  • 2026常德市黄金回收指南:实探6家正规门店,报价透明是关键 - 余生黄金回收
  • 人形机器人电路板和算法分析