【发布时间】:2020-09-21 15:12:50
【问题描述】:
我做了一个叫对话框的组件,我想把它做成插件并注册为一个全局函数。
但是,我不知道如何从插件访问组件并调用组件的方法。
import Vue from 'vue'
import AlertDialog from '@/components/AlertDialog'
const methods = {
openDialog: (
maxWidth,
title,
message
) =>
AlertDialog.openDialog(
maxWidth,
title,
message
),
closeDialog: () => AlertDialog.closeDialog()
}
Vue.prototype.openDialog = methods.openDialog
Vue.prototype.closeDialog = methods.closeDialog
这是一个 dialog_plugin.js。
但它不起作用。
编辑 ::
<template>
<v-dialog
v-if="isShow"
v-model="isShow"
:max-width="maxWidth ? maxWidth : 290"
>
<v-card>
...
</v-card>
</v-dialog>
</template>
<script>
export default {
data() {
return {
isShow: false,
maxWidth: null,
title: null
}
},
methods: {
openDialog(
maxWidth,
title
) {
this.isShow = true
...
},
closeDialog() {
this.isShow = false
}
}
}
</script>
这是 AlertDialog.vue
【问题讨论】:
-
我怀疑
AlertDialog不是组件instance,而是组件定义对象,对吧? -
这是AlertDialog.vue文件的导入。为文件添加了内容。请检查。
-
您不能调用
AlertDialog.openDialog,因为AlertDialog不是该组件的实例。您需要在模板中的某处有一个AlertDialog,并带有一个ref,以便您可以在其上调用方法。或许放入根组件模板,然后调用this.$root.$refs.dialog.openDialog即可。 -
我在 AlertDialog 组件的模板中添加了一个引用,但在 $refs 中看不到“对话框”。我需要将此组件添加到布局中吗?如果是这样,请告诉我您是否有使对话框成为全局函数的好方法,因为更改布局结构是有限制的。
-
引用不应该在 AlertDialog 模板中,您实际上需要在其他地方拥有
<AlertDialog ref="dialog">。您必须在某处拥有<AlertDialog>才能创建它的实例;仅仅导入 AlertDialog 是不够的。
标签: vue.js plugins components nuxt.js