如何通过单击Vue.js来调用组件上的方法?

时间:2016-12-26 17:45:06

标签: vue.js vue-component

我使用来自 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>中调用方法打开()

2 个答案:

答案 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

测试它