我正在尝试使类似于jsFiddle的代码正常工作。
该代码基本上在Vue实例之外有onclick="vm.$refs.foo.addThing()"
(我无法更改其方式),该实例在Vue的methods
中调用一个函数。
但是,它现在不起作用,我不知道为什么会这样。
HomeView.vue
var MyComponent = Vue.extend({
template: '<div><p>Hello</p><ul><li v-for="thing in things">{{ thing }}</li></ul></div>',
data: function() {
return {
things: ['first thing']
};
},
methods: {
addThing: function() {
this.things.push('another thing ' + this.things.length);
}
}
});
var vm = new Vue({
el: '#app',
components: {
'my-component': MyComponent
}
});
HTML
<div id="app">
<h1>Component Test</h1>
<my-component ref="foo"></my-component>
</div>
<button onclick="vm.$refs.foo.addThing()">External Button</button>
答案 0 :(得分:0)
您可以将此方法公开给window
对象,但它被认为是反模式,您可能应该考虑以某种方式将此按钮移到组件内部。
或者,使用一些技巧:
const MyComponent = Vue.extend({
template: '<div><p>Hello</p><ul><li v-for="thing in things">{{ thing }}</li></ul></div>',
data: function() {
return {
things: ['first thing']
};
},
methods: {
addThing: function() {
this.things.push('another thing ' + this.things.length);
}
}
});
const vm = new Vue({
el: '#app',
mounted() {
var btn = document.getElementById('btn-external');
btn.addEventListener('click', this.$refs.foo.addThing);
},
components: {
'my-component': MyComponent
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<h1>Component Test</h1>
<my-component ref="foo"></my-component>
</div>
<button id="btn-external">External Button</button>
答案 1 :(得分:0)
您可以在处理模板之前访问$refs
(检查docs)。
请查看修改后的代码:https://jsfiddle.net/b5oset1w/17/
Javascript:
var MyComponent = Vue.extend({
template: '<div><p>Hello</p><ul><li v-for="thing in things">{{ thing }}</li></ul></div>',
data: function() {
return {
things: ['first thing']
};
},
methods: {
addThing: function() {
this.things.push('another thing ' + this.things.length);
}
}
});
var vm = new Vue({
el: '#app',
components: {
'my-component': MyComponent
},
mounted: function() {
console.log(this.$refs)
},
methods: {
onAddThing: function() {
this.$refs.foo.addThing()
}
}
});
模板:
<div id="app">
<h1>Component Test</h1>
<my-component ref="foo"></my-component>
<button @click="onAddThing">External Button</button>
</div>
答案 2 :(得分:0)
另一种实现此目的的方法是也为外部按钮创建一个vue实例。像下面的示例代码。
var MyComponent = Vue.extend({
template: '<div><p>Hello</p><ul><li v-for="thing in things">{{ thing }}</li></ul></div>',
data: function() {
return {
things: ['first thing']
};
},
methods: {
addThing: function() {
this.things.push('another thing ' + this.things.length);
}
}
});
var vm = new Vue({
el: '#app',
components: {
MyComponent: MyComponent
}
});
var vm1 = new Vue({
el: '#newapp',
methods:{
clickAction:function(){
vm.$refs.foo.addThing();
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="app">
<h1>Component Test</h1>
<my-component ref="foo"></my-component>
</div>
<div id="newapp">
<button @click="clickAction">External Button</button>
</div>