【vue】弹窗组件的几种调用方式 | 您所在的位置:网站首页 › vue弹窗怎么写 › 【vue】弹窗组件的几种调用方式 |
写在前面
本文仅代表个人对vue组件的一些粗浅认识,仅供参考,如有错漏,欢迎指出。 vue 弹窗组件的几种调用方式 1. 同一组件调用 Click to open the Dialog Cancel Confirm import { ref } from 'vue' import { ElMessageBox } from 'element-plus' const dialogVisible = ref(false) const handleClose = (done: () => void) => { ElMessageBox.confirm('Are you sure to close this dialog?') .then(() => { done() }) .catch(() => { // catch error }) }缺点:弹窗代码在父组件中,导致代码较多 2.父子组件调用父组件 点击出现弹窗 import { ref } from 'vue'; import Dialog from './components/Dialog.vue'; const visible = ref(false) const clickBtn = () => { visible.value = true } const close = () => { visible.value = false } const submit =() => { visible.value =false }子组件 取消 确定 const props = defineProps( { visible: Boolean}) const emit = defineEmits(['update:visible']) const close =() => { emit('update:visible') }缺点:需要一个变量控制子组件展示隐藏,耦合重 3.父组件调用子组件方法子组件暴露弹窗打开关闭方法 取消 确定 import {ref} from 'vue' const emit = defineEmits(['submit']) const visible = ref(false) const open = () => { visible.value = true } const close =() => { visible.value = false } const submit = () => { visible.value = false emit('submit', [123]) } defineExpose({open, close})父组件通过ref调用 点击出现弹窗 import { ref } from 'vue'; import Dialog2 from './components/Dialog2.vue'; const dialogRef = ref() const clickBtn = () => { dialogRef.value.open() } const submit =(list) => { console.log('list :>> ', list); dialogRef.value.close() }缺点:需要知道子组件暴露的方法,不利于解耦 4.函数式调用子组件 取消 确定 import {onMounted, ref} from 'vue' interface Props { close?: () => void, submit?: (list:any) => void } const props = defineProps( ) const visible = ref(false) onMounted( () => { visible.value = true }) const close =() => { visible.value = false props?.close?.() } const submit = () => { visible.value = false props?.submit?.([123]) }index.ts: 动态调用 import Dialog3 from './Dialog3.vue' import { createApp } from 'vue'; const useDialog = (options: any) => { const mountNode = document.createElement('div') document.body.appendChild(mountNode) return new Promise((resolve, reject) => { let app: any = createApp(Dialog3, { ...options, close: () => { app.unmount() mountNode.remove() app = undefined reject() }, submit: (list: any) => { app.unmount() mountNode.remove() app = undefined resolve(list) } }) if (app) { app.mount(mountNode) } }) } export default useDialog父组件中使用 点击出现弹窗 import useDialog from './index.ts' const clickBtn = () => { useDialog({}).then(list => { console.log('object :>> ', list); }) }优点: 需要使用组件式才调用,只需要传递props,不需要了解子组件内部逻辑 很多组件都是使用这种思想,如element-plus的MessageBox |
CopyRight 2018-2019 实验室设备网 版权所有 |