如何在 Vue.js 中创建 Date(now) 以在计算属性中使用?

Posted

技术标签:

【中文标题】如何在 Vue.js 中创建 Date(now) 以在计算属性中使用?【英文标题】:How to create Date(now) within Vue.js to use in a computed property? 【发布时间】:2019-10-04 21:54:19 【问题描述】:

我有一组带有预先格式化日期的日历事件:20190517T010000Z

我需要根据以下内容过滤数组:

1) 未来事件(发生大于NOW 的任何事件)

2) 过去事件(发生时间少于NOW 的任何事件)

3) 在过去 7 天内创建的新事件(NOW - 7 天)

我在下面有一个硬编码示例 - 但需要 NOW 是动态的并且基于用户的系统时间。我不知道如何以与我在数组中获取的日期时间格式相同的格式获取NOW。另外,我不知道它应该驻留在我的代码中的哪个位置(在单独的 JS 文件中或在 Vue 组件中)?

一旦我让它在下面列出的组件中工作,它将被移动到 VUEX Getter。

<template>
    <div class="text-left m-4 p-4">
        <div>
            Total Number Events:  allEvents.length 
        </div>
        <div>
            Events Created In Last 7 Days:  createdEvents 
        </div>
        <div>
            Future Events:  futureEvents 
        </div>
        <div>
            Past Events:  pastEvents 
        </div>
    </div>
</template>

<script>
import  mapState  from 'vuex'

export default 
  computed: 
    ...mapState(['allEvents']),

    futureEvents () 
      return this.$store.state.allEvents.filter(allEvents => allEvents.dtstart >= '20190517T010000Z').length
    ,

    pastEvents () 
      return this.$store.state.allEvents.filter(allEvents => allEvents.dtstart <= '20190517T235900Z').length
    ,

    createdEvents () 
      return this.$store.state.allEvents.filter(
        allEvents => allEvents.created >= '20190511T235900Z' && allEvents.created <= '20190517T235900Z' )
        .length
    
  ,

</script>

上面的代码有效——但它现在是硬编码的,它需要是动态的。欢迎任何想法或建议。

【问题讨论】:

【参考方案1】:

您的所有日期时间对象都应保留为 UNIX 时间戳(自 1970 年 1 月 1 日以来的 UTC 秒数)。这将允许您比较不同时区的系统时间。

假设您的 Vuex 存储中的事件以 dstart 作为 UNIX 时间戳存储,则以下 sn-p 应该为您提供所需的动态行为。

我在组件的数据中创建了一个now 属性。这会每秒更新一次,从而导致计算的属性刷新。

此外,如果 Vuex 存储中的 allEvents 属性更新,计算的属性也会刷新。

<template>
    <div class="text-left m-4 p-4">
        <div>
            Total Number Events:  allEvents.length 
        </div>
        <div>
            Events Created In Last 7 Days:  createdEvents 
        </div>
        <div>
            Future Events:  futureEvents 
        </div>
        <div>
            Past Events:  pastEvents 
        </div>
    </div>
</template>

<script>
    import  mapState  from 'vuex'
    export default 
        data () 
            return 
                now: new Date().getUTCSeconds()
            
        ,
        created () 
            this.scheduleUpdateNow();
        ,
        methods: 
            updateNow() 
                this.now = new Date().getUTCSeconds();
                this.scheduleUpdateNow();
            ,
            scheduleUpdateNow() 
                setTimeout(this.updateNow, 1000);
            
        ,
        computed: 
            ...mapState(['allEvents']),

            futureEvents () 
                return this.$store.state.allEvents.filter(allEvents => allEvents.dtstart > this.now).length
            ,

            pastEvents () 
                return this.$store.state.allEvents.filter(allEvents => allEvents.dtstart <= this.now).length
            ,

            createdEvents () 
                return this.$store.state.allEvents.filter(
                    allEvents => allEvents.created >= this.now && allEvents.created <= this.now).length
            
        
    
</script>

【讨论】:

P.S.我不确定您的最后一个计算函数 createdEvents 正在做什么 - 我已经“按原样”保留逻辑。它似乎可以找到现在创建的所有事件 - 但这不太可能匹配任何内容,因为“现在”非常具体! 感谢您的回答...createdEvents 用于过滤在两个日期之间创建的事件 - “结束”日期为现在并返回 7 天。一旦我有了现在的日期,计算应该不会太难。 欣赏这个......我不知道该把现在放在哪里 日期时间将通过日历系统预先格式化为YYYYMMDDTHHMMSSZ ... 将在哪里重新格式化/重塑传入的日期时间? 也许当您从日历系统接收事件时,将字符串解析为 Date 对象,然后将日期存储为 UNIX 时间戳。

以上是关于如何在 Vue.js 中创建 Date(now) 以在计算属性中使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vue.js 中创建自定义链接组件?

如何在 data vue.js 2 中创建两个数组?

如何在 v-for vue js 中创建增量变量

如何在 Django 中创建自动递增整数字段?

如何在Vue.js中创建简单的10秒倒计时

如何在Vue.js中创建自定义链接组件?