一. 传统写法不使用setup语法糖

方式一:通过v-model的方式实现子组件的显示与隐藏

  1. 父组件的内容
<template>
  <div>
    <el-button @click="open">打开</el-button>
    <Child v-model:visible="flag" ></Child>
  </div>
</template>
<script>
  import { ref, watch } from 'vue'
  import Child from "../components/Child.vue"
  export default {
    components: {
      Child
    },
    setup() {
      const flag = ref(false)
      const open = () => {
        flag.value = true
      }
      watch(() => flag.value , (val) => {
        console.log("监听flag值得变化:", val)
      })
      return {
        flag,
        open
      }
    }
  }
</script>
  1. 子组件内容
<template>
  <div class="hello">
    <el-dialog title="提示" v-model="dialogVisble" width="30%" :before-close="close">
      <span>这是一段信息</span>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="close">取 消</el-button>
          <el-button type="primary" @click="confirm">确 定</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script>
  import { ref, watch } from 'vue'
  export default {
    props: {
      visible: {
        type: Boolean,
        default: false
      }
    },
    setup(props, ctx) {
      const dialogVisble = ref(false)
      const close = () => {
        ctx.emit("update:visible", false);
      };
      const confirm = () => {
        console.log('你点击了确定按钮')
        ctx.emit("update:visible", false);
      }
      watch(() => props.visible, (val) => {
        console.log(props.visible, val);
        dialogVisble.value = val
      });
      return {
        dialogVisble,
        confirm,
        close
      }
    }
  }
</script>

方式二:通过为元素绑定ref的方式实现子组件的显示与隐藏

  1. 父组件的内容
<template>
  <div>
    <el-button @click="open">打开</el-button>
    <Child ref="visibleDialog"></Child>
  </div>
</template>
<script>
  import { ref } from 'vue'
  import Child from "../components/Child.vue"
  export default {
    components: {
      Child
    },
    setup() {
      const visibleDialog = ref(null)
      const open = () => {
        visibleDialog.value.dialogVisble = true
      }
      return {
        visibleDialog,
        open
      }
    }
  }
</script>
  1. 子组件内容
<template>
  <div class="hello">
    <el-dialog title="提示" v-model="dialogVisble" width="30%" :before-close="close">
      <span>这是一段信息</span>
      <template #footer>
        <span class="dialog-footer">
          <el-button @click="close">取 消</el-button>
          <el-button type="primary" @click="confirm">确 定</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script>
  import { ref } from 'vue'
  export default {
    setup(props, ctx) {
      const dialogVisble = ref(false)
      const confirm = () => {
        console.log('你点击了确定按钮')
        dialogVisble.value = false
      }
      const close = () => {
        dialogVisble.value = false
      }
      return {
        dialogVisble,
        confirm,
        close
      }
    }
  }
</script>

2. setup语法糖写法

  1. 父组件
<template>
  <Child :user="user" ref="visiableDialog"></Child>
  <el-button type="primary" @click="openDialog">打开弹窗</el-button>
</template>
<script setup>
import { reactive, ref } from 'vue'
import Child from "../components/childComponents.vue"
const visiableDialog = ref(null)
const user = reactive({
  name: '张三',
  age: 20
})
function openDialog() {
  visiableDialog.value.dialogVisble = true
  console.log(visiableDialog.value.dialogVisble);
}
</script>
  1. 子组件
<template>
  <div class="hello">{{ `${props.user.name}在学习VUE3` }}</div>
  <el-dialog title="提示" v-model="dialogVisble" width="30%">
    <span>这是一段信息</span>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="close">取 消</el-button>
        <el-button type="primary" @click="confirm">确 定</el-button>
      </span>
    </template>
  </el-dialog>
</template>
<script setup>
import { ref } from 'vue';
import { ElMessageBox } from 'element-plus'
// 定义控制弹窗显隐的变量
const dialogVisble = ref(false)
// 接受父组件传过来的值
// const props = defineProps({
//   user: {
//     type: Object,
//     default: {}
//   }
// })
// 或者
const props = defineProps(['user'])
function confirm() {
  ElMessageBox.confirm('确定关闭吗?').then(() => {
    console.log('你点击了确定按钮')
    dialogVisble.value = false
  }).catch(() => { })
}
function close() {
  dialogVisble.value = false
}
// 将变量暴露出来
defineExpose({
  dialogVisble
})
</script>

总结:

发表回复