Vue3,使用 JS 调用弹窗组件,并实现关闭弹窗组件时销毁组件
需要对一个弹窗组件进行改造,使其能用 JS 调用,并实现关闭弹窗组件时销毁组件
原始弹窗组件 Popup.vue
<template> <van-overlay :show="visible" > <div class="overlay-wrapper"> <div class="container"> <div class="content-container"> <i class="icon-sad"></i> <p class="content">{{ message }}</p> <div class="btn btn-know" @click="onClose"></div> </div> <div class="btn-close" @click="onClose"></div> </div> </div> </van-overlay> </template> <script setup> const props = defineProps({ visible: { type: Boolean, default: true, }, message: { type: String, default: '', } }) const emit = defineEmits(['update:visible']) const onClose = () => { emit('update:visible', false) } </script>
这个组件默认页面中调用,改成 JS 调用则需要用到 createVNode
方式
新增 popup.js
文件
import { render, createVNode } from 'vue' import Popup from './Popup.vue' export default function (options = {}) { const { visible = true, message } = options const mountNode = document.createElement('div') // 销毁组件 const destroy = () => { render(null, mountNode) document.body.removeChild(mountNode) } const app = createVNode(Popup, { visible, message, onDestroy: destroy, }) render(app, mountNode) document.body.appendChild(mountNode) }
同时需要对原来组件进行修改,实现关闭的时候销毁组件
Popup.vue
<script setup> const props = defineProps({ ... onDestroy: Function, }) const onClose = () => { emit('update:visible', false) // js 调用的时候,可以传入一个回调函数,用于销毁组件 if (props.onDestroy) { props.onDestroy() } } </script>
使用 JS 调用
import Popup from '@/components/popup' Popup({ message: '这是 JS 调用的组件' })
默认的组件中调用
<template> <Popup v-model:visible="show" :message="message"/> </template> <script setup> import Popup from '@/components/Popup.vue' const show = ref(false) const message = ref('这是组件中使用') </script>
分类:
JavaScript
, Vue
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY