假设我有一个主Vue实例,它有子组件.有没有办法完全从Vue实例外部调用属于这些组件之一的方法?

下面是一个例子:

var vm = new Vue({
  el: '#app',
  components: {
    'my-component': { 
      template: '#my-template',
      data: function() {
        return {
          count: 1,
        };
      },
      methods: {
        increaseCount: function() {
          this.count++;
        }
      }
    },
  }
});

$('#external-button').click(function()
{
  vm['my-component'].increaseCount(); // This doesn't work
});
<script src="http://vuejs.org/js/vue.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="app">
  
  <my-component></my-component>
  <br>
  <button id="external-button">External Button</button>
</div>
  
<template id="my-template">
  <div style="border: 1px solid; padding: 5px;">
  <p>A counter: {{ count }}</p>
  <button @click="increaseCount">Internal Button</button>
    </div>
</template>

因此,当我单击内部按钮时,increaseCount()方法被绑定到它的单击事件,因此它被调用.没有办法将事件绑定到外部按钮,我正在使用jQuery监听其Click事件,因此我需要一些其他方法来调用increaseCount.

EDIT

这似乎有效:

vm.$children[0].increaseCount();

但是,这不是一个好的解决方案,因为我是通过组件在子数组中的索引来引用组件的,而且对于许多组件,这不太可能保持不变,代码的可读性也较差.

推荐答案

最后我 Select 了使用Vue's ref directive.这允许从父级引用组件,以便直接访问.

例如.

在我的父实例上注册一个compent:

var vm = new Vue({
    el: '#app',
    components: { 'my-component': myComponent }
});

使用引用在template/html中呈现组件:

<my-component ref="foo"></my-component>

现在,在其他地方,我可以从外部访问该组件

<script>
vm.$refs.foo.doSomething(); //assuming my component has a doSomething() method
</script>

看这把小提琴的例子:https://jsfiddle.net/xmqgnbu3/1/

(使用Vue 1:https://jsfiddle.net/6v7y6msr/的旧示例)

Javascript相关问答推荐

使用Element.children在前后移动 node

如何比较嵌套对象的更改并创建更改报告

nPM审计始终发现0个漏洞

如何通过onClick为一组按钮分配功能;

是什么原因导致此Angular 16电影应用程序中因类型错误而不存在属性?

React:未调用useState变量在调试器的事件处理程序中不可用

togglePopover()不打开但不关闭原生HTML popover'

成功完成Reducers后不更新状态

如何控制Reaction路由加载器中的错误状态?

使用js构造一个html<;ath&>元素并不能使其正确呈现

为什么我的自定义元素没有被垃圾回收?

Webpack在导入前混淆文件名

Rxjs流中生成IMMER不能在对象上操作

为什么我的按钮没有从&q;1更改为&q;X&q;?

是否可以将Select()和Sample()与Mongoose结合使用?

Docent.cloneNode(TRUE)不克隆用户输入

构建器模式与参数对象输入

在GraphQL解析器中修改上下文值

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色