vue3通过父子传值实现弹框功能
作者:我爱学习yq
在Vue3中,我们可以通过 provide 和 inject 来实现父子组件之间的数据传递,这也适用于实现弹框功能。下面是一个简单的例子:
父组件代码:
<template> <div> <button @click="showDialog">打开弹框</button> <my-dialog :visible="dialogVisible" @close="handleDialogClose"> <!-- 弹框内容 --> </my-dialog> </div> </template> <script> import MyDialog from './MyDialog.vue' export default { components: { MyDialog }, data() { return { dialogVisible: false } }, methods: { showDialog() { this.dialogVisible = true }, handleDialogClose() { this.dialogVisible = false } } } </script>
在父组件中,我们定义了一个 dialogVisible 变量来控制弹框的显示与隐藏,以及对应的方法来打开和关闭弹框。同时,我们将要展示的弹框作为父组件的子组件嵌入到模板中,并将 visible 属性绑定到 dialogVisible 变量上,这样在弹框中也可以使用它来控制弹框的显示与隐藏。
子组件代码:
<template> <div v-if="visible"> <div class="dialog-overlay" @click="close"></div> <div class="dialog-content"> <slot></slot> </div> </div> </template> <script> export default { props: { visible: { type: Boolean, default: false } }, inject: ['close'], mounted() { document.body.style.overflow = 'hidden' }, beforeUnmount() { document.body.style.overflow = '' } } </script>
在子组件中,我们定义了一个 visible 属性来控制该弹框的显示与隐藏。同时,我们使用了 inject 来注入父组件中定义的 close 方法,这样在子组件中就可以调用该方法来关闭弹框。在弹框的模板中,我们使用了 slot 来插入具体的弹框内容,而弹框的样式可以通过 CSS 进行控制。
至此,我们就成功地实现了一个简单的弹框功能。当然,这只是一个简单的示例,实际上我们还可以通过传递参数,定制弹框的样式和行为等方式来进一步丰富弹框功能。
第二种方法
在Vue3中,可以使用provide和inject来实现父子组件之间的值传递。具体的实现步骤如下:
在父组件中使用provide来提供一个方法,该方法将会被传递给子组件。在该provide方法中,通过ref来创建一个响应式状态 isShowModal,用于控制弹框的显示和隐藏。
// 父组件 <template> <div> <button @click="openModal">打开弹框</button> <ChildComponent /> </div> </template> <script> import { provide, ref } from 'vue'; import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent, }, setup() { const isShowModal = ref(false); const openModal = () => { isShowModal.value = true; }; provide('openModal', openModal); provide('isShowModal', isShowModal); }, }; </script>
在子组件中使用inject来获取父组件传递的isShowModal和openModal。在子组件中,通过watch监听isShowModal的变化,从而控制弹框的显示和隐藏。
// 子组件 <template> <div> <Modal :visible="isShowModal" /> </div> </template> <script> import { inject, watch } from 'vue'; import Modal from './Modal.vue'; export default { components: { Modal, }, setup() { const isShowModal = inject('isShowModal'); const openModal = inject('openModal'); watch(isShowModal, (newVal) => { if (newVal) { Modal.open({ title: '提示', content: '这是一个弹框', onOk: () => { isShowModal.value = false; }, }); } else { Modal.close(); } }); }, }; </script>
根据需求自定义Modal组件,实现弹框的显示和隐藏逻辑。
// Modal.vue <template> <div v-show="visible" class="modal"> <div class="modal-mask"></div> <div class="modal-wrapper"> <div class="modal-content"> <div class="modal-header"> <slot name="header"></slot> <span class="modal-close" @click="handleClose">×</span> </div> <div class="modal-body"> <slot name="content"></slot> </div> <div class="modal-footer"> <slot name="footer"></slot> </div> </div> </div> </div> </template> <script> import { ref } from 'vue'; const MODAL_CONTAINER_CLASSNAME = 'modal-container'; export default { props: { visible: { type: Boolean, default: false, }, }, setup(props) { const modalContainer = ref(null); const handleClose = () => { props.onClose && props.onClose(); }; const transitionEndHandler = () => { if (!props.visible) { modalContainer.value.classList.remove(MODAL_CONTAINER_CLASSNAME); } }; const open = ({ title, content, onOk, onCancel }) => { props.onOpen && props.onOpen(); modalContainer.value.classList.add(MODAL_CONTAINER_CLASSNAME); }; const close = () => { props.onClose && props.onClose(); }; return { handleClose, open, close, }; }, }; </script>
通过以上的实现,即可在Vue3中实现父子组件之间的弹框功能。
以上就是vue3通过父子传值实现弹框功能的详细内容,更多关于vue3弹框的资料请关注脚本之家其它相关文章!