VUE 父组件调用子组件弹窗

本文介绍了一个Vue.js项目中实现父组件调用子组件弹窗功能的示例。通过按钮点击事件展示和关闭弹窗,展示了如何通过props传递显示状态及如何使用$emit进行父子组件间的通信。

VUE 父组件调用子组件弹窗

想搞一个新增编辑弹窗,和列表页面分开

先来一个父组件调用子组件弹窗的demo

父组件

<template>
    <div>
        <el-button @click="show">按钮</el-button>
        
        <!-- 新增编辑弹框子组件 -->
        <add-or-update :addOrUpdateVisible="addOrUpdateVisible" @changeShow="showAddOrUpdate" ref="addOrUpdateRef"></add-or-update>
    </div>
</template>

<script>
// 引入子组件
import AddOrUpdate from './Edit'
export default {
    data(){
        return{
            // 控制新增编辑弹窗的显示与隐藏
            addOrUpdateVisible: false
        }
    },
    // 使用子组件
    components:{
        AddOrUpdate
    },
    methods:{
        // 按钮点击事件 显示新增编辑弹窗组件
        show(){
            this.addOrUpdateVisible = true
        },
        // 监听 子组件弹窗关闭后触发,有子组件调用
        showAddOrUpdate(data){
            if(data === 'false'){
                this.addOrUpdateVisible = false
            }else{
                this.addOrUpdateVisible = true
            }
        }
    }
}
</script>

子组件

<template>
    <el-dialog
        title="提示"
        :visible.sync="showDialog"
        width="50%"
        @close="handleClose">

        <span>这是一段信息</span>
        <span slot="footer" class="dialog-footer">
            <el-button @click="showDialog = false">取 消</el-button>
            <el-button type="primary" @click="showDialog = false">确 定</el-button>
        </span>

    </el-dialog>
</template>

<script>
export default {    
    // 接受父组件传递的值
    props:{
        addOrUpdateVisible:{
            type: Boolean,         
            default: false
        }
    },
    data(){
        return{
            // 控制弹出框显示隐藏
            showDialog:false
        }
    },
    methods:{
        // 弹出框关闭后触发
        handleClose(){
            // 子组件调用父组件方法,并传递参数
            this.$emit('changeShow','false')
        }
    },
    watch:{
        // 监听 addOrUpdateVisible 改变
        addOrUpdateVisible(oldVal,newVal){
            this.showDialog = this.addOrUpdateVisible
        },
    }
}
</script>

<style lang="less" scoped>

</style>

👉👍

转载自https://www.cnblogs.com/shuaichao/p/12661312.html

Vue 3 中,父组件可以通过 `ref` 直接调用子组件的方法来打开弹窗。这种做法利用了 Composition API 提供的 `defineExpose` 来暴露子组件中的方法,使得父组件可以访问执行这些方法。 ### 使用 `ref` 调用子组件弹窗方法 父组件通过定义一个与子组件同名的 `ref` 变量,将其绑定到模板中的子组件上。当用户触发某个事件(如点击按钮)时,父组件可以直接调用该 `ref` 上的方法,从而控制子组件的行为,例如打开弹窗。 #### 父组件代码 ```vue <template> <div class="father"> <Son ref="Son" /> <button @click="fnCallChild">点我调用子组件方法</button> </div> </template> <script setup> import { ref } from &#39;vue&#39;; import Son from &#39;../components/Son.vue&#39;; const Son = ref(); const fnCallChild = () => { Son.value.sonFn(); // 调用子组件的方法 }; </script> ``` #### 子组件代码 ```vue <template> <el-dialog v-model="dialogVisible" title="提示" width="50%"> <span>这是一段信息</span> <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> </template> <script setup> import { ref } from &#39;vue&#39;; const dialogVisible = ref(false); const sonFn = () => { dialogVisible.value = true; }; defineExpose({ sonFn }); </script> ``` 通过这种方式,父组件可以直接控制子组件内部的状态变化,例如打开关闭弹窗[^2]。 ### 弹窗状态管理与通信 除了直接调用方法外,还可以通过 `props` 和 `emit` 的组合方式实现更灵活的父通信。例如,父组件可以传递一个布尔值 `visible` 控制弹窗显示状态,同时监听子组件发出的 `close` 事件来更新状态。 #### 子组件代码 ```vue <template> <el-dialog :v-model="showDialog" title="添加课程" top="10vh" width="640px" @close="handleClose"> <!-- 弹窗内容 --> </el-dialog> </template> <script setup> import { ref, defineProps, defineEmits } from &#39;vue&#39;; const props = defineProps({ visible: { type: Boolean, default: false } }); const emit = defineEmits([&#39;update:visible&#39;, &#39;close&#39;]); const showDialog = ref(props.visible); const handleOpen = () => { showDialog.value = true; }; const handleClose = () => { emit(&#39;update:visible&#39;, false); emit(&#39;close&#39;); }; defineExpose({ handleOpen, handleClose }); </script> ``` #### 父组件使用示例 ```vue <template> <div> <Child :ref="childRef" :visible="isModalVisible" @update:visible="val => isModalVisible = val" /> <button @click="openModal">打开弹窗</button> </div> </template> <script setup> import { ref } from &#39;vue&#39;; import Child from &#39;./Child.vue&#39;; const isModalVisible = ref(false); const childRef = ref(); const openModal = () => { childRef.value.handleOpen(); }; </script> ``` 上述方案结合了 `ref`、`props` 和 `emit`,实现了父子组件之间的双向通信和弹窗控制[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值