el-dialog作为子组件如何由父组件控制显示/隐藏

文章讲述了在Vue3中使用ElementPlus时,如何通过父组件的`visible`属性控制子组件`el-dialog`的显示。作者发现直接使用`v-model`传递布尔值不可行,解决方案是在子组件中添加一个`dialogVisible`变量与`v-model`绑定,并在`mounted`生命周期钩子中同步父组件的值。
摘要由CSDN通过智能技术生成

目录

关键词

问题发现

解法探寻

解决办法


关键词

element ui plus,props,vue3,

问题发现

当父组件向子组件传递布尔值visible来控制子组件可见性的时候,发现似乎不可行:

r
<template>
  <el-dialog :v-model="visible" >
    <span>呀哈</span>
  </el-dialog>
</template>

<script>
import EleUploadVideo from "@/components/EleUploadVideo.vue";
export default {
  name: 'VideoUploadPopup',
  components: {
    EleUploadVideo,
  },
  props: {
    visible: {
      type: Boolean,
      required: true
    },
    point:{
      type:Object,
      default: null // 设置默认值为空对象或者 null
    }
  },
  emits: ['closePopup', 'deletePoint'], // 声明自定义事件
  data() {
    return {
      token: 'xxx',
      video: 'https://s3.pstatp.com/aweme/resource/web/static/image/index/tvc-v2_30097df.mp4'
    };
  },
  computed: {
    uploadData() {
      return {
        token: this.token
      };
    }
  },
  methods: {
 
  }
};
</script>

<style scoped>

</style>

解法探寻

查询element ui 官网,发现是用v-model没错,而且vue3里面似乎不用:visible-sync了:

Dialog 对话框 | Element Plus

然后看了另外的文章,发现子组件不能直接更改props里面的数据,也不能直接进行v-model绑定

el-dialog作为子组件如何由父组件控制显示/隐藏_公共组件的dialog是父组件的dialog进行传值来显示title和显示隐藏-CSDN博客

解决办法

  1. 在子组件内部多写一个变量来和v-model绑定,并且将父组件props的值发给该变量
  2. 父子组件赋值的过程在mounted里面调用

看代码~

r
<template>
  <el-dialog 
    title="乌萨奇:"
    v-model="dialogVisible"//看这里!
    append-to-body="true">
    <span>测试文字</span>
  </el-dialog>
</template>

<script>
export default {
  name: 'VideoUploadPopup',
  props: {
    visible: {//接受父级组件的显示标记,用于被watch
      type: Boolean,
      required:true
    },
    point: {
      type: Object,
      default: null
    }
  },
  emits: ['closePopup', 'deletePoint'],
  data() {
    return {
      token: 'xxx',
      dialogVisible: false,
      video: 'https://s3.pstatp.com/aweme/resource/web/static/image/index/tvc-v2_30097df.mp4'
    };
  },
  computed: {
    uploadData() {
      return {
        token: this.token
      };
    }
  },
  mounted(){//看这里!!
    console.log(this.visible);
    this.dialogVisible = this.visible;
    console.log("mounted后dialogVisible的新值为:",this.dialogVisible);
  },
  watch: {
    visible(newVal) {
      this.dialogVisible = newVal; // 监听 visible 变化,并将新值赋给 dialogVisible
      console.log("watch后dialogVisible的新值为:", this.dialogVisible)
    }
  },
  methods: {
  },
};
</script>

<style scoped>
/* 样式 */
</style>

重点关注这两段代码:

  mounted(){
    console.log(this.visible);
    this.dialogVisible = this.visible;
    console.log("mounted后dialogVisible的新值为:",this.dialogVisible);
  },
  watch: {
    visible(newVal) {
      this.dialogVisible = newVal; // 监听 visible 变化,并将新值赋给 dialogVisible
      console.log("watch后dialogVisible的新值为:", this.dialogVisible)//调试过程证明
    }
  },

成品展示如下:

注意看调试窗口里面:当visible的值发生变化的时候,没有调用watch的函数,而是调用mounted函数

个人经验,如有错漏,欢迎指出

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值