如何在 Quasar 2 中调用动态创建/挂载的全局组件(Vue 3 - 选项 API)
How to call a dynamically created/ mounted global component in Quasar2 (Vue3 - Options API)
我不太确定如何表述这个问题。我正在尝试将我的 Vue2 全局组件之一移植到 Vue3(选项 API)。简而言之,我正在尝试全局安装自定义对话框组件,即在引导文件夹中创建它(并将其添加到 quasar.conf.js 引导部分),然后能够在我的任何 Vue 文件中调用它项目,而不必在每个 vue 文件中导入它,即类似于 this.$axios.
使用早期版本的Vue的原始插件文件类似于
import Vue from 'vue';
import dialog from '@/components/dialog.vue';
export default ({ app }, inject) => {
const $dialog = Vue.extend( dialog );
const vm = new $dialog({ i18n: app.i18n }).$mount();
document.body.appendChild(vm.$el);
inject('dialog', vm);
};
我找到了解决 Vue.extend and used a component that implements the suggested solution by pearofducks 在 github 上的弃用问题的答案,这似乎正确地安装了组件。
回到我的引导文件
boot_dialog.js
import { boot } from 'quasar/wrappers'
import { mount } from 'mount-vue-component'
import customDialog from '../~global/scripts/debug/debug'
export default boot( async ({ app }) => {
const element = document.createElement('div');
element.setAttribute('id','modal-dialog-div');
document.body.appendChild(element);
const { vNode, destroy, el } = mount(customDialog, { app, element, props: { i18n: app.i18n }});
app.config.globalProperties.$dialog = customDialog;
// ^^^ Believe the error is here
});
我知道该组件是在 debug.vue 中安装的,我调用 this.show() 正确显示 q-dialog。
devug.vue
<template>
<q-dialog v-model="alert">
<q-card>
<q-card-section>
<div class="text-h6">Alert test</div>
</q-card-section>
<q-card-section class="q-pt-none">
Lorem ipsum dolor sit amet
</q-card-section>
<q-card-actions align="right">
<q-btn flat label="OK" color="primary" v-close-popup />
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script>
export default {
data () {
return {
alert: false,
}
},
methods: {
show (params) {
console.log('Show method called',params);
this.alert = true;
},
},
mounted() {
this.show('Parameters');
}
};
</script>
但是在我的任何主项目 vue 文件中调用 this.$dialog.show('A sample parameter') 都会导致错误。我如何从 vNode const 返回到我可以在任何项目 vue 文件中调用的实际组件?
我想你想要的是一个自定义插件:
https://v3.vuejs.org/guide/plugins.html#writing-a-plugin
我不太确定如何表述这个问题。我正在尝试将我的 Vue2 全局组件之一移植到 Vue3(选项 API)。简而言之,我正在尝试全局安装自定义对话框组件,即在引导文件夹中创建它(并将其添加到 quasar.conf.js 引导部分),然后能够在我的任何 Vue 文件中调用它项目,而不必在每个 vue 文件中导入它,即类似于 this.$axios.
使用早期版本的Vue的原始插件文件类似于
import Vue from 'vue';
import dialog from '@/components/dialog.vue';
export default ({ app }, inject) => {
const $dialog = Vue.extend( dialog );
const vm = new $dialog({ i18n: app.i18n }).$mount();
document.body.appendChild(vm.$el);
inject('dialog', vm);
};
我找到了解决 Vue.extend
回到我的引导文件
boot_dialog.js
import { boot } from 'quasar/wrappers'
import { mount } from 'mount-vue-component'
import customDialog from '../~global/scripts/debug/debug'
export default boot( async ({ app }) => {
const element = document.createElement('div');
element.setAttribute('id','modal-dialog-div');
document.body.appendChild(element);
const { vNode, destroy, el } = mount(customDialog, { app, element, props: { i18n: app.i18n }});
app.config.globalProperties.$dialog = customDialog;
// ^^^ Believe the error is here
});
我知道该组件是在 debug.vue 中安装的,我调用 this.show() 正确显示 q-dialog。
devug.vue
<template>
<q-dialog v-model="alert">
<q-card>
<q-card-section>
<div class="text-h6">Alert test</div>
</q-card-section>
<q-card-section class="q-pt-none">
Lorem ipsum dolor sit amet
</q-card-section>
<q-card-actions align="right">
<q-btn flat label="OK" color="primary" v-close-popup />
</q-card-actions>
</q-card>
</q-dialog>
</template>
<script>
export default {
data () {
return {
alert: false,
}
},
methods: {
show (params) {
console.log('Show method called',params);
this.alert = true;
},
},
mounted() {
this.show('Parameters');
}
};
</script>
但是在我的任何主项目 vue 文件中调用 this.$dialog.show('A sample parameter') 都会导致错误。我如何从 vNode const 返回到我可以在任何项目 vue 文件中调用的实际组件?
我想你想要的是一个自定义插件: https://v3.vuejs.org/guide/plugins.html#writing-a-plugin