Компонент отображает время последнего обновления: «только что», «минуту назад», «5 минут назад», «вчера» и в таком духе. В него через
props передаётся timestamp
ts его обновления, а дальше он сам.
Отображаемое вычисляемое человекопонятное «5 минут назад» надо обновлять. Сразу после обновления раз в минуту. Потом раз в 15 минут, в час и потом.. да и потом можно раз в час, не жалко.
Не соображу,
как правильно заставить обновляться это свойство. По умолчанию оно просчитывается раз при рендере компонента и дальше сидит спокойно, т.к.
ts не меняется, причин для пересчёта нет.
Что пробовал. Добавил data-свойство
now, которое ни в чём не участвует, т.к. по факту эти строки «5 минут назад» считаются в отдельном модуле на основе переданного туда
ts и текущего времени, которое модуль и сам умеет узнать. При первом вызове вычисляемого свойства запускаю
setTimeout(), который обновит data-свойство
now. Но Vue ведь хитрооптимизирован! Если это свойство никак не используется в вычисляемом свойстве, то никакого обновления (вызова) не происходит.
Стоит добавить
console.log(this.now) в тело вычисл. св-ва, как ура, всё исправно тикает. Но в production все
console.* выпиливаются и обновления пропадут. Да и вообще это же костыль какой-то.
Так как мне задействовать никчемное data-свойство, или иначе вызывать обновление вычисляемого?
Сокращённый пример:
import ago from '@/utils/ago';
export default {
props: {
ts: Number,
},
data: () => ({
now: Date.now(),
}),
computed: {
lastUpdated: function() {
console.log("[lastUpdated]", this.now); // так обновляется
// console.log("[lastUpdated]"); // а так не обновляется
const that = this;
setTimeout(() => that.now = Date.now(), 5000);
return ago(this.ts);
}
}
}