假设您有一个模板:
<div v-for="item in items" :key="item.id">
<p @click="toggle(item, $event)"> {{ item.name }} </p>
</div>
此模板中的项目来自计算属性:
computed: { ...mapGetters(['items']) }
我想在点击<p>
项时切换一个班级(当然不是在同级中)。有没有简单的方法可以做到这一点?
是否有一种简单的方法可以将属性添加到计算出的属性中的那个item
,然后执行:class="item.prop ? 'myclass' : ''"
?最好不必为此专门进行分派...
您会改为使用$event.target
来点击元素吗?如果是的话,您将如何切换类?
答案 0 :(得分:1)
HTML:
<div id="app">
<div v-for="item in items" :key="item.id">
<p @click="toggle($event)"> {{ item.name }}</p>
</div>
</div>
CSS:
.my-class {
background-color: yellow;
}
JS:
new Vue({
el: '#app',
data: {
items: [{ name: "Item1", id: "1" }, { name: "Item2", id: "2" }, { name: "Item3", id: "3" }]
},
methods: {
toggle($event){
let s = $event.target.classList;
s.contains("my-class") ? s.remove("my-class") : s.add("my-class");
}
}
})
答案 1 :(得分:0)
到目前为止,我发现最好的是:
data() {
myClasses: {}
},
methods: {
toggle(item) {
if (this.myClasses[item.id]) {
this.$set(this.myClasses, item.id, false)
} else {
this.$set(this.myClasses, item.id, true)
}
}
}
并在组件中像这样使用它:
<p @click="toggle(item)" :class="myClasses[item.id] ? 'myclass' : ''">
答案 2 :(得分:0)
尝试一下:
<div v-for="item in items" :key="item.id">
<p @click="item.clicked=!item.clicked"
:class="{'class1':item.clicked, 'class2':!item.clicked}">
{{ item.name }}
</p>
</div>