VueJS и Firestore: обновление свойства документа происходит дважды

#javascript #google-cloud-firestore #vuejs2 #vuex

#javascript #google-cloud-firestore #vuejs2 #vuex

Вопрос:

Я получил обработчик щелчка, который при нажатии по какой-то причине обновляет мое значение дважды (увеличивая или уменьшая дважды).Это происходит не все время, но я бы сказал, в 90% случаев. Я хочу предотвратить это и обновлять значение только один раз.

Позвольте мне объяснить.

Во-первых, вот мой код шаблона кнопки:

           <b-button
            variant="link"
            class="mb-2"
            @click="clueHandler(comment)"
          >
  

Вот код скрипта для clueHandler :

 async clueHandler(comment) {
  const inClues =
    this.clues.findIndex((clue) => clue.id === comment.id) > -1
  if (this.loggedIn) {
    if (inClues) {
      await this.$store.dispatch('removeCommentFromCluesFeed', comment)
      console.log('dispatched from clueHandler')
    } else if (!inClues) {
      await this.$store.dispatch('addCommentToCluesFeed', comment)
      console.log('dispatched from clueHandler')
    }
  } else {
    this.$router.replace('/login')
  }
},
  

Вот логика в Vuex для обновления свойства документа Firestore:

   async addCommentToCluesFeed({ state }, comment) {
    try {
      const cluesFeedDoc = this.$fireStore
        .collection(`users/${state.userProfile.uid}/clues`)
        .doc(comment.id)
      await cluesFeedDoc.set(comment)
      console.log('clue added from addCommentToCluesFeed action')
      await this.$fireStore
        .collection('comments')
        .doc(comment.id)
        .update({
          clueVotes: parseInt(comment.clueVotes)   1 // <<<<------------HERE !!
        })
      console.log('clue vote increased from addCommentToCluesFeed action')
    } catch (error) {
      console.error(
        'error adding clue from addCommentToCluesFeed action',
        error
      )
    }
  },
  

Вот скриншот области, которую обновляет обработчик:

введите описание изображения здесь

Происходит то, что когда вы нажимаете ОДИН раз на кнопку шаблона с помощью clueHandler, свойство document clueVotes увеличивается в два раза (или уменьшается в два раза в зависимости от того, была ли подсказка уже установлена пользователем ранее).

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

введите описание изображения здесь Это должно быть только clueVotes: 1 .

У кого-нибудь есть какие-либо советы или мысли о том, что происходит или как я могу исправить? Я предполагаю, что это будет связано с неполным выполнением обещания / завершением гонки и т.д. Спасибо!

Ответ №1:

Я нашел отличное объяснение, почему у меня возникла эта проблема. Вот оно: https://fireship.io/snippets/firestore-increment-tips /

По сути, мне нужно было вернуть специальное значение, которое можно использовать с помощью set() или update(), которое сообщает серверу увеличить текущее значение поля на заданное значение.

Вот мое обновление кода:

             .update({
              clueVotes: this.$fireStoreObj.FieldValue.increment(1)
            })