Двойной вызов функции Vue.js

111
20 декабря 2020, 19:50

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

new Vue({ 
  el: '#app', 
  data() { 
    return { 
      item: null, 
      loader: null, 
      loading: false, 
    } 
  }, 
  watch: { 
    loader() { 
      const l = this.loader 
      this[l] = !this[l] 
 
      setTimeout(() => (this[l] = false), 3000) 
      this.qwerty(); 
      this.loader = null 
    } 
  }, 
  methods: { 
    qwerty() { 
      console.log('double'); 
    }, 
  } 
})
.btn_text { 
  color: black; 
} 
 
.LoaderBtn { 
  border: 2px solid red; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> 
<link href="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.min.css" rel="stylesheet"> 
<div id="app"> 
  <v-modal> 
    <v-btn class="LoaderBtn" :loading="loading" :disabled="loading" color="primary" @click="loader = 'loading'"> 
      <span class="btn_text"> 
      Accept Terms 
    </span> 
    </v-btn> 
  </v-modal> 
</div> 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script src="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.js"></script>

Answer 1

Потому что, в самом watch есть изменение переменной, за которой он наблюдает

new Vue({ 
  el: '#app', 
  data() { 
    return { 
      item: null, 
      loader: null, 
      loading: false, 
    } 
  }, 
  watch: { 
    loader() { 
      const l = this.loader 
      this[l] = !this[l] 
 
      setTimeout(() => (this[l] = false), 3000) 
      this.qwerty(); 
      
    } 
  }, 
  methods: { 
    qwerty() { 
      console.log('double'); 
    }, 
  } 
})
.btn_text { 
  color: black; 
} 
 
.LoaderBtn { 
  border: 2px solid red; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> 
<link href="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.min.css" rel="stylesheet"> 
<div id="app"> 
  <v-modal> 
    <v-btn class="LoaderBtn" :loading="loading" :disabled="loading" color="primary" @click="loader = 'loading'"> 
      <span class="btn_text"> 
      Accept Terms 
    </span> 
    </v-btn> 
  </v-modal> 
</div> 
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> 
<script src="https://cdn.jsdelivr.net/npm/vuetify/dist/vuetify.js"></script>

READ ALSO
Не работает Spinner | jQuery UI

Не работает Spinner | jQuery UI

Есть интернет магазин в корзине заказов отображены все выбранные к покупке товары

121
Написать фильтр для checkbox во Vue.js

Написать фильтр для checkbox во Vue.js

Нужно выводить данные по определенным требованиям - по полу

92
Конфликт двух компонентов Swiper на одной странице

Конфликт двух компонентов Swiper на одной странице

Использую этот слайдерДобавляю два компонента на страницу

157
Копирование через spread-оператор с заменой поля второго уровня

Копирование через spread-оператор с заменой поля второго уровня

Всем привет, передо мной стоит задача, которую хочу решить за минимальное число символов, подробнее в коде ниже:

126