简体   繁体   English

VueJS如何在项目列表中显示/隐藏最近的隐藏元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM