Vue.js v-show 在列表中

Posted

技术标签:

【中文标题】Vue.js v-show 在列表中【英文标题】:Vue.js v-show in a list 【发布时间】:2017-02-08 06:33:19 【问题描述】:

我相信这对你们来说会非常容易。我正在尝试制作一个简单的帖子列表,其中帖子标题始终可见,当您单击列表中的特定帖子时,您将获得帖子的正文。我为此使用了v-show。但是,当我单击特定帖子时,会显示所有帖子的正文,而不仅仅是我单击的那个。

这是模板:

<template>
<div class="container">
    <h1>My Posts</h1>
    <ul class="list-group">
        <li class="list-group-item" v-for="post in list">
            <div @click="changeShow">
                <h4> post.title </h4>
                <p v-show="show"> post.body </p>
                <span v-show="show" class="label label-primary">ID:  post.userId </span>
            </div>
        </li>
    </ul>

</div>

还有逻辑:

<script>

export default

    data()
        return
            msg:'hello vue',
            list: [],
            show: false
        
    ,
    ready()
        this.fetchPostList();
    ,

    methods:
        fetchPostList: function () 
            var root = 'http://jsonplaceholder.typicode.com';
            this.$http.get(root + '/posts').then(function (response) 
                this.list = response.data;
            )
        ,
        changeShow: function () 
            this.show = !this.show;
        
    


【问题讨论】:

【参考方案1】:

根据您的需要,有几种方法可以解决此问题。

多重打开

您可以将每个帖子设为自己的组件,这样您就可以将show 绑定到每个单独的帖子而不是所有帖子。

Vue.component('post', 
  template: '#post-template',
  props: 
    post: Object,
  ,
  data() 
    return 
      show: false,
    
  ,
  methods: 
    toggleShow() 
      this.show = !this.show
    ,
  ,
)

那么你可以这样使用它:

<post v-for="post in posts" :post="post"></post>

一开

如果您只想打开一个,您可以传递一个 id 作为道具并在此基础上显示它。

Vue.component('post', 
  template: '#post-template',
  props: 
    post: Object,
    selectedId: Number,
  ,
  computed: 
    show() 
      return this.post.id === this.selectedId
    ,
  ,
)

那么你就可以这样做了

<post :selected-id="selectedId" :post="post" @click="selectedId = post.id"></post>

【讨论】:

【参考方案2】:

我以不同的方式作弊。只需为每个帖子添加一个显示属性并切换它。

new Vue(
  el: 'body',
  data: 
    list: []
  ,
  ready: function() 
    this.fetchPostList()
  ,
  methods: 
    fetchPostList: function() 
      setTimeout(function() 
        this.list.push(
          title: 'First Post',
          body: 'This is the first Post',
          userId: 'Joe',
          show: false
        );
        this.list.push(
          title: 'Second Post',
          body: 'This is the second Post',
          userId: 'Joe',
          show: false
        );
        this.list.push(
          title: 'Third Post',
          body: 'This is the third Post',
          userId: 'Joe',
          show: false
        );
      .bind(this), 2000);
    ,
    changeShow: function(idx) 
      this.list[idx].show = !this.list[idx].show;
    
  
);
<link href="//cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css" rel="stylesheet" />
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
<div class="container">
  <h1>My Posts</h1>
  <ul class="list-group">
    <li class="list-group-item" v-for="post in list">
      <div @click="changeShow($index)">
        <h4> post.title </h4>
        <p v-show="post.show"> post.body </p>
        <span v-show="post.show" class="label label-primary">ID:  post.userId </span>
      </div>
    </li>
  </ul>
</div>

【讨论】:

【参考方案3】:

首先,我将举一个例子的方法没有用,但我写信是为了表明有这样的方法。

例如

<script>
export default 
  data: 
    isShow: false,
    postUserId: null,
  ,
;
</script>
<template>
  <div class="container">
    <h1>My Posts</h1>
    <ul class="list-group">
      <li class="list-group-item" v-for="post in list">
        <div @click="postUserId = post.userId; isShow = !isShow">
          <h4> post.title </h4>
          <p v-show="show"> post.body </p>
          <span v-show="isShow && postUserId == post.userId" class="label label-primary">ID:  post.userId </span>
        </div>
      </li>
    </ul>
  </div>
</template>

【讨论】:

以上是关于Vue.js v-show 在列表中的主要内容,如果未能解决你的问题,请参考以下文章

Vue js数据绑定不起作用

Vue.js学习之条件v-if和列表循环v-for详解

Vue.js教程--况颜

Vue.js 模板指令

Vue.js 创建一个 CNODE 社区

如何利用Vue.js库中的v-show显示和隐藏元素