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

Posted

技术标签:

【中文标题】使计算的 Vue 属性依赖于当前时间?【英文标题】:Make computed Vue properties dependent on current time? 【发布时间】:2019-03-21 01:09:23 【问题描述】:

我收藏了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>

【问题讨论】:

【参考方案1】:

您可以声明一个与时间相关的数据变量并使用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))
    

请注意,您需要在计算属性中使用now 以使其更新。

【讨论】:

谢谢,就像一个魅力!计算道具是一个很好的设计模式还是你会用另一种方式做得更好? @Anders 您可能应该在 beforeDestroy 中清除Interval。 +1【参考方案2】:

您的情况的一种可能性是$forceUpdate()。但是,应该注意它会专门针对您的情况,因为您使用子组件。

如果您要使用子组件,则需要在父组件中使用 slots 并将子组件插入各自的插槽中。

因此,例如,您可以这样做:

created() 
    setInterval(() => 
        this.$forceUpdate()
    , 5000)

这将导致整个组件重新渲染。这可能是也可能不是您正在寻找的理想互动。

【讨论】:

【参考方案3】:

您可以创建一个每秒更新一次的时间变量,然后在您的计算属性中使用此变量。

new Vue(
  el: "#app",
  data: 
    time: ''
  ,
  computed: 
    computedValue: function()
        return this.time;
    
  ,
  mounted: function()
    var app = this;
    setInterval(function()
      app.time = parseInt(new Date().getTime() / 1000);
        , 1000);
  
)

https://jsfiddle.net/ecwnvudz/

【讨论】:

以上是关于使计算的 Vue 属性依赖于当前时间?的主要内容,如果未能解决你的问题,请参考以下文章

Vue3计算属性computed

computed依赖其他Vue 示例

computed依赖其他Vue 示例

1 vue 关键字解释

vue 计算属性computed get 怎么把当前操作的dom传进去

vue的计算属性