我如何为用户实时更新相对时间从momentjs

我计算过:

computed: {
  ago() {
     return moment().fromNow();
    },
}

当我在这个组件中使用时:

<span class="text-muted pr-2" v-text="ago"></span>

我得到静态文本:a few seconds ago,如何在不重新加载页面的情况下更新此文本?我想看看:a minute agotwo minutes ago e.t.c..

我如何为用户实时完成这项工作?

推荐答案

由于moment().fromNow()不是react 性的,所以你不会看到任何变化,为了解决这个问题,我们修复了一个旧的时间属性,它应该在created hook 102中初始化,并将时间间隔设置为1s,基于旧的时间属性,我们调用103来更新我们的属性104.

// ignore the following two lines, they just disable warnings in "Run code snippet"
Vue.config.devtools = false;
Vue.config.productionTip = false;

new Vue({
  el: '#app',

  data() {
    return {
      ago: '',
      oldTime: '',
    interval:null
    }
  },
 destroyed(){
   clearInterval(this.interval)
   },
  created() {
    this.oldTime = new Date();
    this.interval=setInterval(() => {
      this.ago = moment(this.oldTime).fromNow();
    }, 1000)
  }
});
<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>
<script src="https://rawgit.com/moment/moment/2.2.1/min/moment.min.js"></script>

<div id="app" class="container">

  <span class="text-muted pr-2" >
  {{ago}}
  </span>
</div>

根据@Badgy的 comments :

101

为了适应这种情况,我们应该创建一个时间间隔,更新每条消息的ago属性:

// ignore the following two lines, they just disable warnings in "Run code snippet"
Vue.config.devtools = false;
Vue.config.productionTip = false;

new Vue({
  el: '#app',

  data() {
    return {

      messages: [{
          content: 'Hello !',
          time: '2019-09-10 00:08'
        },
        {
          content: 'Hello again!',
          time: '2019-09-10 00:10'
        }
      ],
  interval:null
    }
  },
  computed: {
    msgs() {
      return messages

    }
  },
       destroyed(){
   clearInterval(this.interval)
   },
  created() {

    this.interval=setInterval(() => {

      this.messages = this.messages.map(m => {
        m.ago = moment(m.time).fromNow();
        return m;
      })
    }, 1000)
  }
});
.primary{
color:blue
}
<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>
<script src="https://rawgit.com/moment/moment/2.2.1/min/moment.min.js"></script>

<div id="app" class="container">

  <ul>
    <li v-for="m in messages">{{m.content}} <span class="primary">{{m.ago}}</span></li>
  </ul>
</div>

Vue.js相关问答推荐

Vue CDN的html工作,但v—如果不工作

Vue Router中.getRoutes()获取的路由顺序优化建议

在Vue 2中,是否可能在不创建组件的情况下注入代码块?

使用内部方法创建计算(computed)属性是否合法?

作为props 传递的原始 ref 的 Vue 3 react 性

如何在 v-for 指令切换状态下安全地制作包含附加到对象的复选框的列表(W/O 切换列表中的其他复选框)?

我可以在未注册的组件上构建 Vue.js 失败吗?

将props传递给设置时的VueJS 3组合API和TypeScript类型问题:类型上不存在属性 user用户

Vue.js 中的 mount挂载是什么意思?

正确实现 Vue.js + DataTables

Vue3在'vue-router'中找不到导出'createWebHistory,createRouter'

我应该将所有数据存储在 vuex 状态

Vue cli 在 css 中构建生产更改不透明度

如何让 vuetify 数据表在卡片内时跨越容器的整个宽度?

Bootstrap-vue:如何将数据传递给模态?

在 VueJS 中使用 Axios - 这个未定义

如何访问通用 javascript 模块中的当前路由元字段

如何在 VeeValidate 中自定义错误信息(字段名称)?

Vue 3 组合 API 数据()函数

Mapbox 事件监听器