使计算的 Vue 属性依赖于当前时间?

And*_*ers 11 time vue.js computed-properties

我有一个集合Events。这些将根据它们的状态呈现在列表中 - 即将到来的/实时/以前的。因此渲染取决于当前时间。随着时间的推移,如何使计算属性更新/重新计算?

<template>
    <div>
        <h2>Upcoming events</h2>
        <p v-bind:key="event.name" v-for="event in upcomingEvents">{{ event.name }}</p>

        <h2>Live events</h2>
        <p v-bind:key="event.name" v-for="event in liveEvents">{{ event.name }}</p>

        <h2>Previous events</h2>
        <p v-bind:key="event.name" v-for="event in previousEvents">{{ event.name }}</p>
    </div>
</template>

<script>
    import Event from '../Event.js'

    export default {
        data() {
            return {
                events: []
            }
        },

        computed: {
            upcomingEvents() {
                return this.events.filter(event => event.isUpcoming())
            },

            liveEvents() {
                return this.events.filter(event => event.isLive())
            },

            previousEvents() {
                return this.events.filter(event => event.isPrevious())
            },
        },

        mounted() {
            // this.events are populated here 
        }
    }
</script>
Run Code Online (Sandbox Code Playgroud)

itt*_*tus 15

您可以声明一个与时间相关的数据变量并用于setInterval()更新它:

data() {
    return {
        events: [],
        now: Date.now()
    }
},
created() {
    var self = this
    setInterval(function () {
         self.now = Date.now()
    }, 1000)
},
computed: {
    upcomingEvents() {
        return this.events.filter(event => event.isUpcoming(this.now))
    },
    liveEvents() {
        return this.events.filter(event => event.isLive(this.now))
    },
    previousEvents() {
        return this.events.filter(event => event.isPrevious(this.now))
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您需要使用nowin 计算属性来更新它们。

  • @Anders 您可能应该在 beforeDestroy 中清除间隔。+1 (7认同)