serverAndUserTimeDifference
— разница в миллисекундах между датами, а при пробросе её в moment()
она считается как дата в UNIX-формате.const now = moment();
const serverTime = moment('2024-10-09 10:20:34.987');
const duration = moment.duration(Math.abs(now.diff(serverTime)));
const result = `${duration.days()} ${duration.hours().toString().padStart(2, '0')}:${duration.minutes().toString().padStart(2, '0')}:${duration.seconds().toString().padStart(2, '0')}`;
this.$set \ Vue.set
при добавлении нового ключа.const templates = reactive(keyBy(templatesArr, 'id'))
for (let templateId in templates) {
const devices = devicesArr.filter(device => device.templateId === templateId)
Vue.set(templates[templateId], 'devices', devices);
Vue.set(templates[templateId], 'settings', {});
}
// либо просто так:
const templates = keyBy(templatesArr, 'id');
for (let templateId in templates) {
const devices = devicesArr.filter(device => device.templateId === templateId)
Object.assign(templates[templateId], { devices }, {settings: {}})
}
reactive(templates);
reactive
, вместо него был Vue.observable
. Но может добавили, хз, лень смотреть.:) почему при изменении даты передаваемой в пропс не обновляется значение в самом компоненте таймера?
targetDate
при изменении props.date
. Нет, можете себя не утруждать - ничего такого у вас нет.targetDate
, рассчитываем дни-часы-минуты-секунды сразу на основе props.date
- так при изменении props.date
не придётся предпринимать никаких дополнительных телодвижений, всё посчитается как надо при следующем вызове updateCountdown
. Вот как-то так. const updateItems = async ({ id, isShow = false }: Partial<{ id: number, isShow: boolean }>) => {};
var o = {
value: {
orders: {
tools: [
{
tool1: 't1'
}
],
wood: [
{
wood1: 'w1',
}
],
},
}
}
var allOrders = [];
var ordersByType = o.value?.orders || {};
Object.keys(ordersByType).forEach((type) => {
ordersByType[type].forEach((order) => {
allOrders.push({
...order,
type,
});
});
});
o.value.orders = allOrders;
const popup = document.querySelector('.popup');
const pseudoElement = popup.querySelector('::before');
popup.addEventListener('scroll', function() {
if (popup.scrollHeight - popup.scrollTop === popup.clientHeight) {
pseudoElement.style.display = 'none';
} else {
pseudoElement.style.display = 'block';
}
});
const doSmth = () => {
const event = new Event('doSmth');
window.dispatchEvent(event);
console.log('do something')
}
const event = new Event('myEvent'); // создаем кастомное событие myEvent
pew.addEventListener('click', function() { // слушаем клик по кнопке
circle.dispatchEvent(event); // отправляем событие myEvent
});
circle.addEventListener('myEvent', function(evt) { // слушаем событие myEvent
// какая-то полезная нагрузка
console.log(evt.target);
});