Vue项目封装函数式弹窗类组件
Vue2实现步骤
步骤1:创建弹窗组件
首先,创建一个名为 GlobalModal.vue
的组件。这个组件将包含弹窗的模板、样式和逻辑。
步骤2:创建全局弹窗管理器
接下来,你需要一个全局管理器来控制弹窗的显示和隐藏。这可以通过创建一个Vue插件或直接在Vue实例上挂载一个对象来实现。
// src/plugins/globalModal.js
import GlobalModal from '@/components/GlobalModal.vue';
const GlobalModalManager = {
install(Vue, options = {}) {
// 创建一个Vue实例来挂载GlobalModal组件
const ModalConstructor = Vue.extend(GlobalModal);
const instance = new ModalConstructor();
instance.$mount();
document.body.appendChild(instance.$el);
// 将实例挂载到Vue原型上,以便全局访问
Vue.prototype.$globalModal = {
show(props = {}) {
instance.open(props);
},
hide() {
instance.close();
},
};
},
};
export default GlobalModalManager;
步骤3:在Vue实例中使用全局弹窗管理器
在你的Vue项目入口文件(通常是 main.js
或 main.ts
)中,安装这个插件。
// src/main.js
import Vue from 'vue';
import App from './App.vue';
import GlobalModalManager from './plugins/globalModal';
Vue.config.productionTip = false;
Vue.use(GlobalModalManager);
new Vue({
render: h => h(App),
}).$mount('#app');
Vue3实现步骤
在Vue 3中,实现全局弹窗的方式与Vue 2有所不同,因为Vue 3引入了Composition API和全局API的变更。以下是一个Vue 3中实现全局弹窗的示例。
步骤1:创建弹窗组件
首先,创建一个名为GlobalModal.vue
的组件,这个组件将包含弹窗的模板、样式和逻辑。与Vue 2类似,但可能会使用Composition API。
步骤2:创建全局弹窗管理器
- 创建一个单例模式的管理器类来管理弹窗实例。
- 在Vue应用创建时,将这个管理器实例设置为全局属性。
// src/utils/globalModalManager.js
import { reactive, onMounted, onBeforeUnmount } from 'vue';
import GlobalModal from '@/components/GlobalModal.vue';
class GlobalModalManager {
constructor() {
this.state = reactive({
visible: false,
props: {},
});
this.modalInstance = null;
}
install(app) {
// 创建一个Vue实例来挂载GlobalModal组件
const ModalConstructor = app.component('GlobalModal', GlobalModal);
this.modalInstance = new ModalConstructor();
this.modalInstance.$mount();
document.body.appendChild(this.modalInstance.$el);
// 将实例挂载到Vue全局属性上,以便全局访问
app.config.globalProperties.$globalModal = this;
onMounted(() => {
// 可以在这里添加其他挂载时的逻辑
});
onBeforeUnmount(() => {
// 清理逻辑,比如移除事件监听器等
document.body.removeChild(this.modalInstance.$el);
this.modalInstance.$destroy();
});
}
show(props = {}) {
this.state.visible = true;
this.state.props = props;
// 更新弹窗内容(这里需要一些额外的逻辑来将props传递给弹窗组件)
// 注意:由于我们直接挂载了GlobalModal组件,这里没有直接将props传递给它。
// 在实际应用中,你可能需要创建一个更复杂的系统来传递这些props。
// 一个简单的方法是使用Vuex或Pinia等状态管理库,或者通过事件总线来传递数据。
// 在这个示例中,我们假设GlobalModal组件内部会处理这些props(尽管在代码中并没有体现)。
}
hide() {
this.state.visible = false;
}
}
export const globalModalManager = new GlobalModalManager();