在 elementUI 和 element-plus 中 Dialog 的 简单分析

本篇主要探讨 Dialog 的 显示隐藏 的区别

vue2中 .sync 在elementUI(2.15.6) Dialog 中的应用

Dialog 是否显示 是通过 visible 控制的,并且支持 .sync 修饰符
在使用Dialog时 我们一般会这样写

  <!-- Test.vue-->
  <CustomDialog :visible.sync="isShow" />

  <!-- CustomDialog.vue-->
  <template>
    <el-dialog title="tips" v-bind="$attrs" v-on="$listeners" @open="handleOpen"  @close="handleClose">
      <xxx></xxx>
    </el-dialog>
  </template>
  <script>
  export default {
    methods: {
      handleOpen () {
        // 对话框展示 初始化数据
      },
      handleClose () {
        this.$emit('update:visible', false)
      }
    }
  }
  </script>

正常情况下我们需要在 CustomDialog 的 props选项里添加 visible属性,但这里我们在 el-dialog 上使用了 v-bind=“$attrs” 选项,此时就会把 visible 以 attrs 方式传递给 Dialog
我们可以打开 Dialog 源码 /element-ui/packages/dialog/src/component.vue
在它的文件里我们发现只是使用了 visible 并对 visible 进行了监听,那这个 visible 是在哪接收的呢?
其实是通过 mixins 混入到 props 中的
可查看这个文件 import Popup from ‘element-ui/src/utils/popup’;
在 Popup 的 props 选项里 有对 visible 进行定义

注意:我们在 el-dialog 上定义的 v-bind=“$attrs” 是必须要写的,即便 CustomDialog.vue文件的根元素时 el-dialog,因为在vue2.0中未被 props 接收的属性不能自动透传到 孙组件内

vue3 v-model 在 element-plus(2.2.17) Dialog中的应用

因 vue3 去除了 .sync 修饰符。此时 Dialog 是否显示 是通过 model-value / v-model 来控制的,现在Dialog源码和之前也不一样,现在我们的写法是:

  <!-- Test.vue-->
  <CustomDialog v-model="isShow" />

  <!-- CustomDialog.vue--> 
  <template>
    <el-dialog title="Tips" @open="handleOpen"  @close="handleClose">
      // ...
    </el-dialog>
  </template>

  <script lang="ts" setup>
  const emits = defineEmits(['update:modelValue'])
  const handleOpen = () => {
    // 对话框打开-初始化数据
  }
  const handleClose = () => {
    emits('update:modelValue', false)
  }
  </script>

正常情况下我们需要在 CustomDialog 中定义

  const props = defineProps(['modelValue'])

并通过在 el-dialog 上添加

  <el-dialog v-model="modelValue" ...></el-dialog>
  或
  <el-dialog :modelValue="modelValue" ...></el-dialog>

传递给 Dialog,但这里我们什么都没写,但对话框还是可以正常显示隐藏,其实正是因为 props 未定义 modelValue 选项,所以此属性会 自动透传 到子组件上,而 el-dialog内部的 props 上又定义了 modelValue 值,所以就可以接受到了

注意:如果我门在 CustomDialog 中定义 modelValue 但在 el-dialog 组件上又不写该属性,则此时 modelValue 不会透传到Dialog内,也就无法控制对话框的显示和隐藏

我们可以打开 Dialog 源码 /element-plus/packages/components/dialog/src/dialog.vue
我们会看到 import { dialogEmits, dialogProps } from ‘./dialog’
props 的定义都在 dialogProps 文件内,打开 dialogProps 文件,我们会发现有对 modelValue 的定义

注意:当 子组件 的 根组件 又是一个 组件(孙组件) 时,则 子组件 接收的 透传属性 会直接传递到这个 组件(孙组件) 内

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值