我有一个Vue 2模式,用于常见场景:以编程方式创建一个示例,以便在模板之外的动态内容上打开Modal/Dialog/Lightbox。
在Vue 2中,我发现了这个模式:
// DialogService.js
export default {
alert(text) {
const DialogClass = Vue.extend(DialogComponentDef);
let dialog = new DialogClass({ propsData: { text } });
dialog.$on('close', () => {
dialog.$destroy();
dialog.$el.remove();
dialog = null;
});
// mount the dynamic dialog component in the page
const mountEl = document.createElement('div');
document.body.appendChild(mountEl);
dialog.$mount(mountEl);
},
};
知道Vue.extends
、$on
和$destroy
不再存在,我如何在Vue 3中实现这一点?您可以看到clicking here的DialogService.js的完整示例。
4条答案
按热度按时间z9ju0rcb1#
下面是如何在Vue 3中处理
createApp
,但是上下文(存储、插件、指令...)将不会保留。为了保持上下文,这里可以看到
h
和render
Vue方法的一些更复杂的东西:https://github.com/vuejs/vue-next/issues/2097#issuecomment-7098601322izufjch2#
下面是以编程方式调用和运行组件的简单方法
qqrboqgw3#
Vue 3不提供通用事件总线,它可以被轻量级的第三方替代品(如
mitt
或eventemitter3
)所取代。组件可通过teleport挂载到应用程序元素层次结构之外。这在之前的Vue 2中已通过第三方
portal-vue
库提供。模态和其他屏幕UI元素是其常见用例其中
DialogComponent
控制其自身的可见性,不需要像在原始代码片段中那样显式卸载。在父卸载时会自动执行清理:以及
对于更复杂的场景,需要管理多个示例,或者在业务逻辑中访问
show
外部组件,需要在组件层次结构的顶层挂载一个teleport,这种情况下可以使用一个可以通过应用传递的事件总线示例进行交互。ckocjqey4#
我建议使用mount-vue-component。它是轻量级的,易于使用。代码示例: