首页 > vue里面如何让v-for循环出来的列表里面的列表click事件只对当前列表有效

vue里面如何让v-for循环出来的列表里面的列表click事件只对当前列表有效

意思就是

<li @click="show">
    <span>1</span>
</li>

<li @click="show">
     <span>1</span>
</li>

<li @click="show">
     <span>1</span>
</li>

li点击只让当前的 li 下面的span 隐藏

<div id="app">
<ul>
<li @click="show($event)">
    <span>{{ a }}</span>
</li>

<li @click="show($event)">
     <span>{{ b }}</span>
</li>

<li @click="show($event)">
     <span>{{ c }}</span>
</li>
</ul>
</div>
<script>
new Vue({
  el: '#app',
  data: {
      a: "12345a",
    b: "12345bb",
    c: "12345c"
  },
  methods: {
    show: function(e){
            e.currentTarget.querySelector("span").style.display = "none"
        }
  }
})
</script>

既然是v-for循环出来的,例如v-for="obj in objs",那就把这个obj传进每个li标签的show方法中,@click="show(obj)",这么做是可以实现的。另外,不知道题主要实现什么,从方法名来看好像是控制显隐,那就给每一个span一个v-show属性,然后在show方法中改变对应的v-show绑定的属性值,这样对每个单独的span肯定是没问题的,即使你操作span内容或是其他操作都是可以的。但是如果当前标签显示span,其他标签的span隐藏,因为这里涉及的其他标签,需要考虑的就多了。既然用vue了,多从数据的角度去思考,多看看尤大写的todoList example,官方文档要多看。手机敲代码不方便,只能说说大概的思路,见谅哈哈?


定义好你的数据结构,然后操作数据就好了:

https://jsfiddle.net/ygjack/zq4hn28r/2/

<ul id="app">
  <li v-for='item in items' @click="toggle(item)">
    <span v-if='item.show'>{{item.content}}</span>
  </li>
</ul>
new Vue({
  el: '#app',
  data: function() {
    return {
      items: [{
        content: '1 item',
        show: true
      }, {
        content: '2 item',
        show: true
      }, {
        content: '3 item',
        show: true
      }]
    }
  },
  methods: {
    toggle: function(item) {
            item.show = !item.show;
    }
  }
})

用vue就尽量遵从数据驱动的想法,实现这个的方法很多,但是尽量不要直接去操作dom。

<div id="app">
  <ul>
    <li v-for="list in lists" @click="show($index)">
      <span v-show="$index !== i">{{ list }}</span>
    </li>
  </ul>
</div>
<script>
new Vue({
  el: '#app',
  data: {
    lists: [1, 1, 1],
    i: -1 
  },
  methods: {
    show (index) {
      this.i = index
    }
  }
})
</script>
【热门文章】
【热门文章】