【vue3】打开弹窗组件的方法,你了解几种?

1,881 阅读1分钟

根据项目实际应用场景,总结实际用法

项目中对话框一般单独写成一个vue文件,可增强组件的易读性和可维护性

如下代码结合Vue + Ant Design Vue 3.x版本,介绍三种方式常用的打开弹窗组件的方式

一、通过props,emit父子组件传值

父组件代码如下:

<template>
  <div class="home">
    <a-button @click="handleOpenDialog">打开对话框</a-button>
    <MyModal :visible="visible" @close-modal="handleCloseDialog" />
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import MyModal from './MyModal.vue';

const visible = ref(false);
const handleOpenDialog = () => {
  visible.value = true;
};
const handleCloseDialog = () => {
  visible.value = false;
};
</script>

弹窗组件代码如下:

<template>
  <a-modal :visible="props.visible" title="Basic Modal" @cancel="handleClose" @ok="handleOK">
    <p>Some contents...</p>
  </a-modal>
</template>
<script setup lang="ts">
interface IProps {
  visible: boolean;
}
const props = withDefaults(defineProps<IProps>(), {
  visible: false
});

const emit = defineEmits(['closeModal']);

const handleOK = () => {
  emit('closeModal');
  // 其他逻辑
};
const handleClose = () => {
  emit('closeModal');
  // 其他逻辑
};
</script>

二、ref的方式


ref用在子组件上,获得的值是组件实例

defineExpose:用于子组件暴露方法供父组件调用

父组件代码如下:

<template>
  <div class="home">
    <a-button @click="handleOpenDialog">打开对话框</a-button>
    <MyModal ref="myModalRef" />
  </div>
</template>
<script setup lang="ts">
import MyModal from './MyModal.vue';

const myModalRef = ref<InstanceType<typeof MyModal> | null>(null);
//获取子组件的组件实例

const handleOpenDialog = () => {
  myModalRef.value?.handleOpen();
};
</script>

弹窗组件代码如下:

<template>
  <a-modal v-model:visible="visible" title="Basic Modal" @cancel="handleClose" @ok="handleOK">
    <p>Some contents...</p>
  </a-modal>
</template>
<script setup lang="ts">
import { ref } from 'vue';

const visible = ref(false);

const handleOpen = () => {
  visible.value = true;
  // 其他逻辑
};
const handleClose = () => {
  visible.value = false;
  // 其他逻辑
};

const handleOK = () => {
  visible.value = false;
  // 其他逻辑
};

defineExpose({
  handleOpen,
  handleClose
});
</script>

三、组件的v-model方式


父组件代码如下:

<template>
  <div class="home">
    <a-button @click="handleOpenDialog">打开对话框</a-button>
    <MyModal v-model:visible="visible" />
  </div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import MyModal from './MyModal.vue';

const visible = ref(false);
const handleOpenDialog = () => {
  visible.value = true;
};
</script>

弹窗组件代码如下:

<template>
  <a-modal :visible="props.visible" title="Basic Modal" @cancel="handleClose" @ok="handleOk">
    <p>Some contents...</p>
  </a-modal>
</template>

<script setup lang="ts">
interface IProps {
  visible: boolean;
}
const props = withDefaults(defineProps<IProps>(), {
  visible: false
});

const emit = defineEmits(['update:visible']);

const handleClose = () => {
  emit('update:visible', false);
  // 其他逻辑
};
const handleOk = () => {
  emit('update:visible', false);
  // 其他逻辑
};
</script>