【发布时间】:2017-04-29 16:34:26
【问题描述】:
我正在尝试使用 vuejs 创建手风琴。
我在网上找了一些例子,但我想要的不一样。出于 SEO 的目的,我使用“is”和“inline-template”,所以手风琴是一种静态的,没有完全在 Vuejs 中创建。
我有 2 个问题/疑问:
1) 我需要根据用户交互(点击)在组件上添加一个“is-active”类,因此我收到以下错误。
属性或方法“contentVisible”未在实例上定义,但 在渲染期间引用。确保声明反应数据 数据选项中的属性。
这可能是因为我需要在实例级别设置它。但是“contentVisible”对于每个组件都有一个不同的值(真或假)。
所以我想在实例级别使用一个“contentVisible”数组和一个道具(通过实例)和子级的自定义事件来更新实例值。
2) 可以工作,但它是一个静态数组。如何制作动态数组(不知道item组件的数量)?
<div class="accordion">
<div>
<div class="accordion-item" is="item" inline-template :class="{ 'is-active': contentVisible}" >
<div>
<a @click="toggle" class="accordion-title"> Title A1</a>
<div v-show="contentVisible" class="accordion-content">albatros</div>
</div>
</div>
<div class="accordion-item" is="item" inline-template :class="{ 'is-active': contentVisible}" >
<div>
<a @click="toggle" class="accordion-title"> Title A2</a>
<div v-show="contentVisible" class="accordion-content">lorem ipsum</div>
</div>
</div>
</div>
var item = {
data: function() {
return {
contentVisible: true
}
},
methods: {
toggle: function(){
this.contentVisible = !this.contentVisible
}
}
}
new Vue({
el:'.accordion',
components: {
'item': item
}
})
更新 我创建了以下代码,但是将修改从组件发送到实例的自定义事件不起作用,tabsactive 没有改变
var item = {
props: ['active'],
data: function() {
return {
contentVisible: false
}
},
methods: {
toggle: function(index){
this.contentVisible = !this.contentVisible;
this.active[index] = this.contentVisible;
**this.$emit('tabisactive', this.active);**
console.log(this.active);
}
}
}
new Vue({
el:'.accordion',
data: {
tabsactive: [false, false]
},
components: {
'item': item
}
})
<div class="accordion" **@tabisactive="tabsactive = $event"**>
<div class="accordion-item" is="item" inline-template :active="tabsactive" :class="{'is-active': tabsactive[0]}">
<div>
<a @click="toggle(0)" class="accordion-title"> Title A1</a>
<div v-show="contentVisible" class="accordion-content">albatros</div>
</div>
</div>
<div class="accordion-item" is="item" inline-template :active="tabsactive" :class="{'is-active': tabsactive[1]}">
<div>
<a @click="toggle(1)" class="accordion-title" > Title A2</a>
<div v-show="contentVisible" class="accordion-content">lorem ipsum</div>
</div>
</div>
</div>
【问题讨论】:
标签: javascript vue.js vue-component