我使用来自 vue-mdl 包
的对话窗口 dialog.vue 的组件<template>
<div class="mdl-dialog-container" v-show="show">
<div class="mdl-dialog">
<div class="mdl-dialog__title">{{title}}</div>
<div class="mdl-dialog__content">
<slot></slot>
</div>
<div class="mdl-dialog__actions" :class="actionsClasses">
<slot name="actions">
<mdl-button class="mdl-js-ripple-effect" @click.native.stop="close">Close</mdl-button>
</slot>
</div>
</div>
</div>
</template>
<script>
import mdlButton from './button.vue'
import createFocusTrap from 'focus-trap'
export default {
components: {
mdlButton
},
computed: {
actionsClasses () {
return {
'mdl-dialog__actions--full-width': this.fullWidth
}
}
},
data () {
return {
show: false
}
},
props: {
title: {
type: String
},
fullWidth: Boolean
},
mounted () {
this._focusTrap = createFocusTrap(this.$el)
},
methods: {
open () {
this.show = true
this.$nextTick(() => this._focusTrap.activate())
this.$emit('open')
},
close () {
this.show = false
this._focusTrap.deactivate()
this.$emit('close')
}
}
}
</script>
我想将对话窗口带到另一个组件
<mdl-dialog></mdl-dialog>
<button class="mdl-button mdl-js-button mdl-button--raised">Click me</button>
我没有找到关于如何在另一个组件中调用一个组件的方法的信息。所有例子主要是使用道具。告诉我该怎么做?
如何在<mdl-dialog></mdl-dialog>
中调用方法打开()?
答案 0 :(得分:1)
由于他们不是父母,你想要使用事件总线。由于您使用的是.vue
个文件,因此可以创建一个名为bus.js
的文件,如
import Vue from 'vue'
export default new Vue()
然后,导入您需要发出的任何地方并收听集中事件。这是一个简单的例子:
// SomeComponent.vue
import bus from './bus.js'
export default {
methods: {
log (msg) {
console.log(msg)
}
},
created () {
bus.$on('someEvent', this.log)
}
}
然后在另一个组件中你可以做...
// AnotherComponent.vue
import bus from './bus.js'
export default {
methods: {
emitClick (msg) {
bus.$emit('Hello from AnotherComponent.vue')
},
},
}
您可以在此处阅读更多相关信息:https://vuejs.org/v2/guide/components.html#Non-Parent-Child-Communication
答案 1 :(得分:0)
您可以在父组件的方法中创建以下辅助方法:
getChild(name) {
for(let child of this.$children) if (child.$options.name==name) return child;
},
以这种方式调用子组件方法:
this.getChild('mdl-dialog').open();
我没有为Vue&gt; = 2.0
测试它