Vue: значение таймера не обновляется при использовании setInterval

У меня есть следующий код для обновления количества прошедших секунд и его отображения:

<template>
 
 <div>
   {{timerValue}}
   
 </div>
 
  </template>

<script>
 export default {
  name: "App",
  components: {
     
  },

  data() {
    return {
      timerValue: ""
    }
  },

  created()  {
     let seconds = 0;
      this.timerValue = seconds;
      setInterval(function()  {
           seconds++;
      })
  }
};
</script>

Однако на странице всегда отображается

0

Что я делаю не так?

https://codesandbox.io/s/still-cache-1mdgr6?file=/src/App.vue

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
63
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вместо этого вы должны увеличить this.timerValueseconds

created()  {
     let seconds = 0;
      this.timerValue = seconds;
      setInterval(function()  {
           this.timerValue++;
      }.bind(this))
  }

Или с функциями стрелок

created()  {
     let seconds = 0;
      this.timerValue = seconds;
      setInterval(() => {
           this.timerValue++;
      })
  }

Я думаю, что функция стрелки должна использоваться. Когда я не использовал его, не было обновления

parsecer 13.02.2023 09:00
Ответ принят как подходящий

Может быть, как следующий фрагмент:

const app = Vue.createApp({
  data() {
    return {
      timerValue: 0 // set value default is 0 
    }
  },
  created()  {
      setInterval(() => {
           this.timerValue++;
      }, 1000)
  }
})
app.mount('#demo')
<script src = "https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<div id = "demo">
  <div>
    {{timerValue}}
  </div>
</div>

вот почему я всегда советую людям изучить логику языка или хотя бы javascript, прежде чем изучать что-то еще

вам нужно обновить значение реакции, потому что у javascript нет API, который позволяет назначать ячейки памяти

<script>
 export default {
  name: "App",
  components: {
     
  },

  data() {
    return {
      timerValue: 0 // set default value is number
    }
  },

  created()  {
      setInterval(() => {
           this.timerValue++;
      }, 1_000 /* delay 1s */)
  }
};
</script>

Это больше проблема Vue (который является фреймворком, а не языком). И ваш код не будет отображать ничего, кроме нуля

parsecer 13.02.2023 08:53

я не думаю, что это проблема vue, вы не ссылаетесь на значение vue, а просто изменяете локальную переменную seconds

Tachibana Shin 13.02.2023 08:55

даже в javascript вы ничего не можете сделать с этим кодом, пока вы правы в javascript, вы будете правы в vue

Tachibana Shin 13.02.2023 08:56

У меня есть 3 момента, на которые вы должны обратить внимание

  • В функции setInterval вы меняете только переменную seconds, а не this.timerValue вообще. Таким образом, страница всегда показывает 0.
  • Функция setInterval еще не имеет аргумента интервала, поэтому она не будет выполняться каждую секунду.
  • Так же непонятно значение инициализации, думаю вам стоит понять логику программы и потратить немного времени на то, чтобы понять что вы написали.
<template>
 
 <div>
   {{timerValue}}
 </div>
 
 </template>

<script>
 export default {
  name: "App",
  components: {
     
  },

  data() {
    return {
      timerValue: 0,
    }
  },

  mounted()  { // use mounted much better than created in this case
      setInterval(() => {
           this.timerValue++;
      }, 1000)
  }
};
</script>

ссылки: https://www.w3schools.com/jsref/met_win_setinterval.asp

Не получится: codeandbox.io/s/jolly-smoke-3dj65g?file=/src/App.vue В setInterval необходимо использовать функцию стрелки.

parsecer 13.02.2023 09:05

Я обнаружил две неправильные вещи в своем коде:

  1. Использование this внутри function(). Следует использовать функцию стрелки, например:
setInterval(() => {}
  1. this.timerValue = seconds недостаточно для обновления Vue timerValue при обновлении seconds. Изменение секунд не вызывает изменение timerValue.

Это можно решить, используя вычисляемое свойство:

computed:  {
  timerValue: function()  {
    return this.seconds;
  }
},

Таким образом, весь код будет выглядеть так:

https://codesandbox.io/s/festive-cannon-8qvpn9?file=/src/App.vue

<template>
  <div>
    {{ timerValue }}
  </div>
</template>

<script>
export default {
  name: "App",
  components: {},

  data() {
    return {
      seconds: 0,
    };
  },

  created() {
    setInterval(() => {
      this.seconds++;
    }, 1000);
  },

  computed: {
    timerValue: function () {
      return this.seconds;
    },
  },
};
</script>

Другие вопросы по теме