Vue使用ref结合ElementUI中的Dialog实现弹框的封装使用

本文详细介绍了如何在Vue中利用ref和ElementUI的Dialog组件进行弹框封装,包括父组件引入子组件、子组件的创建与编辑,以及两种方式通知父组件:通过$emit传递参数和直接调用父组件方法。文中强调了ref的使用时机以及父子组件通信的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:父组件中引入子组件

import AAA  from "@/components/AAA"       //其中AAA为子组件名称

在components 中注册组件AAA

父页面中引入创建子组件

<!-- 新增编辑组件 -->
<AAA v-if="showDialog" ref="dataDialog" @btnDialogFun="btnDialogFun"></AAA>

v-if=“showDialog” 为是否显示该组件,注意这是父组件中的方法,目的是用来清除缓存带来的问题。
@btnDialogFun 这是用来父子传参使用
ref=“dataDialog” 为ref的方法是用来控制组件的,dataDialog为自定义的组件实例名,

使用ref

可以使用 this.$refs.dataDialog 获取到的是组件实例,可以使用组件的所有方法

注意:

ref 需要在dom渲染完成后才会有,在使用的时候确保dom已经渲染完成。比如在生命周期 mounted(){} 钩子中调用,或者在 this.$nextTick(()=>{}) 中调用。

具体案列如下:

<el-button type="primary" @click="addEdit()">新增</el-button>
<AAA v-if="showDialog" ref="dataDialog"></AAA>
<script>
import AAA  from "@/components/AAA" 
data(){
showDialog: false,// 是否显示弹框控件
},
components: {
   AAA  
 },
methods:{
   // 调用弹框的方法
   addEdit(row) {
     this.showDialog= true; // 显示弹框
     //等待页面加载完成后执行
     this.$nextTick(() => { 
       this.$refs.dataDialog.showDialog(row)	//showDialog为子组件中的方法,这里直接调用方法了
     });
}
</script>

第二步:编辑子组件内容如下

<el-dialog title="title" :visible.sync="dialogVisible"">
        ...//弹框内容
        <span slot="footer" class="dialog-footer">
            <el-button @click="dialogVisible = false">取 消</el-button>
            <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
        </span>
    </el-dialog>


<script>
export default {
data: function() {
    return {
      dialogVisible: false,
      title: ""
    };
  },
  created() {},
  methods: {
    // 定义的方法可供父组件调用
    showDialog(formData) {
      console.log(formData,'我被调用了')
      this.dialogVisible = true;
      this.title = "新增"
      ...
      //其他事件
    },
  }
};
</script>

其他子组件的方法正常使用

第三步:子组件提交后如何通知父组件(方法一 调用函数有参数需求)

这就是子组件给父组件传参的问题了
1,父组件中添加接受的方法如下 @btnDialogFun=“btnDialogFun”

<!-- 新增编辑组件 -->
<AAA v-if="showDialog" ref="dataDialog" @btnDialogFun="btnDialogFun"></AAA>
...
data(){
	searchList: {
          user: '',
          region: ''
        },
},
 methods:{
	//弹框中按钮触发事件
	 btnDialogFun(type){
	     if(type == "XXX"){//确认
	         // 更新数据
	         this.getInit(this.searchList)
	     }
	 },
 }

2,子组件中使用 this.$emit(‘btnDialogFun’,val) 来实现

btnFun(val){
	this.$emit('btnDialogFun',val)
}

第三步:子组件提交后如何通知父组件(方法二,直接调用的方法)

直接使用 this.$parent.getInit() 这个父级方法简单粗暴

btnFun(val){
	//this.$emit('btnDialogFun',val)
	this.$parent.getInit() 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值