OSW
OSW

Reputation: 107

Vue.js - Watch the input value has been changed or not

I am newcomer in Vue.js. Currently, I am creating a validation dialog to see user's otp is valid or not. If the value has not been changed over 5 seconds, my application disconnects automatically. However, if I use watch to monitor the value, it didn't work because the value is not changed, watch does not trigger.

How can I monitor the value is not changed within 5 seconds?

Dialog

<template>
 <div>
  <input type="text" v-model="otp">
  <b-button size="md" @click="cancel()" class="jump-to-ada-btn-cancel">
    Cancel
  </b-button>
  <b-button size="md" @click="handleJumpPage()" class="jump-to-ada-btn">
    Send
  </b-button>
 </div>
</template>

<script>

export default {
  data () {
    return {
      otp: ""
    }
  },
  computed: {
    show: {
      get: function () {
        return this.$store.state.modals.showOTPModal
      },
      set: function (val) {
        this.$store.commit("OPEN_OTP", {fieldName: "showOTPModal", fieldValue: val})
      }
    }
  },
  methods: {
    checkValueChange(newValue) {
      if(newValue === "") {
        alert("value is not changed yet")
      }
    }
  },
  watch: {
    otp: function(v) {
      console.log(v)
      let self = this
      setTimeout(function() {
        self.checkValueChange(v)
      }, 5000)
    }
  }
}
</script>

Upvotes: 0

Views: 5499

Answers (2)

iiirxs
iiirxs

Reputation: 4582

You do not need to watch the otp value to implement that. You only need to check if the value of the otp data property is empty in a setTimeout callback. You can add it inside handleJumpPage method (which is missing from your code above):

setTimeout(() => {
  if (this.otp === "") {
     // disconnect
  }
}, 5000)

EDIT

If you want to add a timeout that checks if otp has changed 5 seconds since component mounting you can add an extra flag as data property and check its value:

data: {
   otp: "",
   otpUpdated: false
},
watch: {
   otp() {
      otpUpdated = true
   }
},
mounted() {
  setTimeout(() => {
     if (!this.otpUpdated) {
       // disconnect
     }
   }, 5000)
}

Upvotes: 2

Sahil Khurana
Sahil Khurana

Reputation: 488

Assuming that you start the 5 second countdown, as soon as the user visits the page. You'll need to start the countdown when the page is loaded. You can do that using the mounted lifecycle hook.

mounted: function() {
 setTimeout(() => {
  this.checkValueChange(this.otp)
 }, 5000)
}

Code sandbox link - https://codesandbox.io/s/damp-snowflake-tovs2

Upvotes: 1

Related Questions