[英]VueJS How to show/hide closest hidden element in list of items
How can I show/hide the closest div by clicking a button in vue
?如何通过单击vue
中的按钮来显示/隐藏最近的 div ?
lets say I have a list of items, each with some hidden details假设我有一个项目列表,每个项目都有一些隐藏的细节
<ul>
<li v-for="item in items" :key="item.id">
<div>
<p>{{item.text}}</p>
<button @click="showDetails(item)">Show details</div>
<div class="details" :class="isVisible ? activeClass : 'hidden'">Some hidden details</div>
</div>
</li>
</ul>
Then I do然后我做
data() {
return {
items: [ // a bunch of item objects here]
isVisible: false,
activeClass: 'is-visible'
}
},
methods: {
showDetails(item) {
this.isVisible = item;
}
}
Right now, when I click on on of the "showDetails" buttons, all divs with class .details
opens and get the .is-visible
-class, but I just want the closest div to the item to be displayed.现在,当我单击“showDetails”按钮时,所有带有 class .details
的 div 都会打开并获得 .is .is-visible
-class,但我只想显示最接近该项目的 div。 For some reason I think this is pretty simple, but I can't make it work.出于某种原因,我认为这很简单,但我无法让它工作。
How can I achieve that?我怎样才能做到这一点?
It would be clearer to create a new component for list item which would contain all logic itself.为列表项创建一个包含所有逻辑本身的新组件会更清晰。 Something like:就像是:
// ListItem.vue
<template>
<div>
<p>{{text}}</p>
<button @click="toggleVisibility">Show details</button>
<div class="details" v-show="isVisible">Some hidden details</div>
</div>
</template>
<script>
props: {
text: String
},
data() {
return {
isVisible: false
}
},
methods: {
toggleVisibility() {
this.isVisible = !this.isVisible
}
}
</script>
and in your parent component:并在您的父组件中:
<ul>
<li v-for="item in items" :text="item.text" :key="item.id" is="list-item" /></li>
</ul>
data() {
return {
items: [ // a bunch of item objects here]
}
}
Just store "isVisible" variable inside the "item"只需将“isVisible”变量存储在“项目”中
<ul>
<li v-for="item in items" :key="item.id">
<div>
<p>{{item.text}}</p>
<button @click="showDetails(item)">Show details</div>
<div class="details" :class="item.isVisible ? activeClass : 'hidden'">Some hidden details</div>
</div>
</li>
</ul>
data() {
return {
items: [ // a bunch of item objects here]
isVisible: false,
activeClass: 'is-visible'
}
},
methods: {
showDetails(item) {
item.isVisible = !item.isVisible;
this.$forceUpdate();
}
}
try this尝试这个
<template> <ul> <li v-for="(item, i) in items":key="item.id"> <div> <p>{{item.text}}</p> <button @click="showDetails(i)">Show details</button> <div class="details":class="i == active? activeClass: 'hidden'">Some hidden details</div> </div> </li> </ul> </template> <script> export default { data() { return { items: [], activeClass: 'is-visible', active: null }; }, methods: { showDetails(i) { this.active = i; } } }; </script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.