Почему значения не обновляются в компоненте при изменении пропсов?

Каким образом можно улучшить следующий код Vue.js, чтобы таймер отображал корректные значения дней, часов, минут и секунд до указанной даты?
  • 27 февраля 2024 г. 17:38
Ответы на вопрос 2
Чаще всего, значения не обновляются в компоненте при изменении пропсов из-за того, что Vue.js не отслеживает изменения вложенных объектов или массивов. 

Чтобы улучшить код и обновлять значения таймера корректно, можно воспользоваться вычисляемыми свойствами. Вместо того, чтобы просто передавать пропсы в шаблон компонента, можно создать вычисляемые свойства, которые будут отслеживать изменения пропсов и автоматически обновлять значения таймера.

Пример:

```vue
<template>
  <div>
    <p>{{ days }} Days</p>
    <p>{{ hours }} Hours</p>
    <p>{{ minutes }} Minutes</p>
    <p>{{ seconds }} Seconds</p>
  </div>
</template>

<script>
export default {
  props: {
    date: {
      type: String,
      required: true
    }
  },
  data() {
    return {
      countdownDate: new Date(this.date).getTime()
    };
  },
  computed: {
    days() {
      const now = new Date().getTime();
      const distance = this.countdownDate - now;
      return Math.floor(distance / (1000 * 60 * 60 * 24));
    },
    hours() {
      const now = new Date().getTime();
      const distance = this.countdownDate - now;
      return Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    },
    minutes() {
      const now = new Date().getTime();
      const distance = this.countdownDate - now;
      return Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
    },
    seconds() {
      const now = new Date().getTime();
      const distance = this.countdownDate - now;
      return Math.floor((distance % (1000 * 60)) / 1000);
    }
  }
};
</script>
```

В данном примере, при изменении значения пропса `date`, вычисляемые свойства будут автоматически пересчитываться и обновляться, отображая корректные значения дней, часов, минут и секунд до указанной даты.
Или в таймер передавай дату 

<Timer :date="new Date('2024-03-21T00:00:00')" />

или укажи что date строка

const props = defineProps({
  date: String
})


https://playcode.io/1778699 - все работает

P.S. Странно видеть обновление через innerText. Что мешало сделать 4 реактивные переменные - дни, часы, минуты, секунды?
Похожие вопросы