我对 vueJs 很陌生,我正在尝试创建类似选项卡菜单的东西。 我有一个下拉导航栏,每个链接都会创建一个新选项卡,这个新选项卡是一个 Vue 组件。
我试图在创建的选项卡中放置一个 v-on:click
指令,但它不会调用该函数。事实上,我遇到了类似
"Property or method "removeTab" is not defined on the instance but referenced during render."
和
"removeTab is not a function."
但是 removeTab
是一个函数,如果我将 v-on:click
放在静态 html 标记中,它就可以工作。我做错了什么,还是不可能在动态加载的组件中包含指令?
这是我的代码的简化版本,只是为了更好地展示我想要解释的内容。 RemoveTab 只是一个警报,只是为了显示何时有效、何时无效。
HTML
<div id="application">
<button class="item" v-on:click="addTab()">Add Button</button>
<button class="item" v-on:click="removeTab()">Remove</button>
<br><br>
<div >
<tab v-for ="tab in tabs" :tab="tab"></tab>
</div>
</div>
<template id="tab-template">
<button class="item">
{{tab.nomeTab}} <div v-on:click="removeTab()">remove</div>
</button>
</template>
JS
Vue.component('tab', {
template: '#tab-template',
props: ['tab']
});
new Vue({
el: '#application',
data:{
newTab:'',
tabs: [
{nomeTab:'Home', contenutoTab:'ciao'},
]
},
methods:{
addTab: function() {
this.tabs.push({
nomeTab: 'NewTab',
});
},
removeTab: function () {
alert("Here it works");
}
}
});
这里是JSFiddle .
感谢您的关注
最佳答案
@Leo 是正确的;本质上,您试图在子级中调用 removeTab
方法,但该方法是在您的父级上定义的。子级无法直接访问父级的方法。
为了让您的示例正常工作,由于您的父级可能会管理选项卡,因此您需要从选项卡中发出一个事件并监听父级中的事件。
<button class="item" v-on:click="$emit('remove-tab')">{{tab.nomeTab}} <div >remove</div></button>
并在父模板中
<tab v-for ="tab in tabs" :key="tab" :tab="tab" @remove-tab="removeTab"></tab>
这是你的 fiddle已修复。
我还为您的v-for
添加了一个key
。您应该始终将 key
与 v-for
一起使用。
关于javascript - 模板内的 Vue 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43918505/