桥西做网站,网页网站模板,网站注册免费,哈尔滨网页设计外包公司在Vue3中#xff0c;我们可以通过 provide 和 inject 来实现父子组件之间的数据传递#xff0c;这也适用于实现弹框功能。下面是一个简单的例子#xff1a;
父组件代码#xff1a;
templatedivbutton clickshowDialog打开弹框/b…在Vue3中我们可以通过 provide 和 inject 来实现父子组件之间的数据传递这也适用于实现弹框功能。下面是一个简单的例子
父组件代码
templatedivbutton clickshowDialog打开弹框/buttonmy-dialog :visibledialogVisible closehandleDialogClose!-- 弹框内容 --/my-dialog/div
/templatescript
import MyDialog from ./MyDialog.vueexport default {components: {MyDialog},data() {return {dialogVisible: false}},methods: {showDialog() {this.dialogVisible true},handleDialogClose() {this.dialogVisible false}}
}
/script在父组件中我们定义了一个 dialogVisible 变量来控制弹框的显示与隐藏以及对应的方法来打开和关闭弹框。同时我们将要展示的弹框作为父组件的子组件嵌入到模板中并将 visible 属性绑定到 dialogVisible 变量上这样在弹框中也可以使用它来控制弹框的显示与隐藏。
子组件代码
templatediv v-ifvisiblediv classdialog-overlay clickclose/divdiv classdialog-contentslot/slot/div/div
/templatescript
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用于控制弹框的显示和隐藏。
// 父组件
templatedivbutton clickopenModal打开弹框/buttonChildComponent //div
/templatescript
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的变化从而控制弹框的显示和隐藏。
// 子组件
templatedivModal :visibleisShowModal //div
/templatescript
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
templatediv v-showvisible classmodaldiv classmodal-mask/divdiv classmodal-wrapperdiv classmodal-contentdiv classmodal-headerslot nameheader/slotspan classmodal-close clickhandleClose×/span/divdiv classmodal-bodyslot namecontent/slot/divdiv classmodal-footerslot namefooter/slot/div/div/div/div
/templatescript
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中实现父子组件之间的弹框功能。