榆山数据端小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

99 lines
3.1 KiB

import baseComponent from '../helpers/baseComponent'
import classNames from '../helpers/classNames'
import { parse, diff, format } from './core/index'
import locales from './locales/index'
baseComponent({
properties: {
prefixCls: {
type: String,
value: 'wux-timeago',
},
to: {
type: null,
value: null,
observer(newVal) {
const { from, lang } = this.data
this.updated(newVal, from, lang)
},
},
from: {
type: null,
value: null,
observer(newVal) {
const { to, lang } = this.data
this.updated(to, newVal, lang)
},
},
refreshable: {
type: Boolean,
value: false,
observer(newVal) {
const { to, from, lang } = this.data
this.updated(to, from, lang, true)
},
},
lang: {
type: String,
value: 'zh_CN',
observer(newVal) {
const { to, from } = this.data
this.updated(to, from, newVal, true)
},
},
},
data: {
currentTo: null,
currentFrom: null,
timeago: null,
},
methods: {
/**
* 更新时间
* @param {Any} currentTo 当前开始时间
* @param {Any} currentFrom 当前截止时间
* @param {String} lang 返回文本的语言,可选值为 en、zh_CN、zh_TW
* @param {Boolean} isForce 是否强制更新
*/
updated(currentTo, currentFrom, lang, isForce) {
// clearTimeout
this.clearTimer()
// check datetime
if (currentTo !== this.data.currentTo || currentFrom !== this.data.currentFrom || isForce) {
const diffTime = diff(currentTo, currentFrom)
const timeago = format(diffTime, locales[lang])
this.setData({ currentTo, currentFrom, timeago }, () => {
// check refreshable
if (this.data.refreshable && !this.data.from) {
const howOld = diff(currentTo, currentFrom, 'minute')
const secondsUntilUpdate = howOld < 1 && 1 || howOld < 60 && 30 || howOld < 180 && 300 || 3600
// setTimeout
this.timeout = setTimeout(() => {
this.updated(currentTo, this.getNow(), lang)
}, secondsUntilUpdate * 1000)
}
})
}
},
/**
* 清除定时器
*/
clearTimer() {
if (this.timeout) {
clearTimeout(this.timeout)
this.timeout = null
}
},
/**
* 获取当前截止时间
*/
getNow() {
const { from } = this.data
return from ? from && parse(from) : new Date()
},
},
detached() {
this.clearTimer()
},
})