v-for 按日期分组渲染项目

Posted

技术标签:

【中文标题】v-for 按日期分组渲染项目【英文标题】:v-for render items with groups by date 【发布时间】:2019-06-27 12:04:27 【问题描述】:

如何在 Vue.js 中按日期呈现带有分组的项目?

例如:我有一个动态数据数组,这些数据将来自以下类型的 api:

items: [
    
        name: 'a',
        created: '2019-02-03T02:31:46.3485544'
    ,
    
        name: 'b',
        created: '2019-02-03T02:31:46.3485544'
    ,
    
        name: 'c',
        created: '2019-02-03T02:31:46.3485544'
    ,
    
        name: 'd',
        created: '2019-02-04T02:31:46.3485544'
    ,
    
        name: 'd',
        created: '2019-02-04T02:31:46.3485544'
    
]

我想像这样渲染列表:

<p> items created today </p>
<ul>
    <li v-for="item in items">item.name</li>
</ul>

<p> items created yesterday </p>
<ul>
    <li v-for="item in items">item.name</li>
</ul>

<p> items created February 2 </p>
<ul>
    <li v-for="item in items">item.name</li>
</ul>

<p> items created February 4 </p>
<ul>
    <li v-for="item in items">item.name</li>
</ul>

有可能吗?我将始终从 api 接收此数据,因此它将是动态数据,这意味着我也需要动态获取标题,我的意思是例如:2 月 4 日创建的项目... 2 月 3 日创建的项目.. 今天创建的项目等。

【问题讨论】:

【参考方案1】:

您可以创建一个计算属性来按天对数据进行分组:

Vue.config.devtools = false;
Vue.config.productionTip = false;

new Vue(
  el: '#app',
  data() 
    return 
      items: [
          name: 'a',
          created: '2019-02-03T02:31:46.3485544'
        ,
        
          name: 'b',
          created: '2019-02-03T02:31:46.3485544'
        ,
        
          name: 'c',
          created: '2019-02-03T02:31:46.3485544'
        ,
        
          name: 'd',
          created: '2019-02-04T02:31:46.3485544'
        ,
        
          name: 'd',
          created: '2019-02-04T02:31:46.3485544'
        
      ]
    
  ,
  computed: 
    groupByDay() 
      let g = ;
      this.items.forEach(item => 
        let d = item.created.substring(0, 10);
        if (g[d]) 
          g[d].push(item.name);
         else 
          g[d] = [];
          g[d].push(item.name);
        
      );

      return g;

    
  

);
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.js"></script>


<div id="app" class="container">
   <div v-for="(item,key,index) in  groupByDay">
     <h5>items created : key</h5>
     <ul>
     <li v-for="name in item">name</li>
     </ul>
   
   </div>
</div>

【讨论】:

【参考方案2】:

基本上您需要获取数组的数组,以便迭代项目。

如果 API 可以返回为您分组的数据,那就太棒了,这样您就可以对其进行迭代。

如果您没有这种奢侈,您需要自己对数据进行分组。我建议使用https://date-fns.org/ 来确定该项目应该去哪个组。

【讨论】:

如果从 api 无法返回分组数据?

以上是关于v-for 按日期分组渲染项目的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 如何在一年中的每个日期按年龄和状态对项目进行分组/计数 - 第 2 部分

C# - LINQ - 按日期范围分组集合

Laravel 选择列,然后按日期对列值进行分组

检测bootstrap-vue日期选择器中v-for中每个元素的目标

按外键和日期分组数据,按日期汇总

iOS开发 服务器请求出来的数据按日期重新分组