Home > Software design >  Why is my disabled prop not working as expected?
Why is my disabled prop not working as expected?

Time:10-10

In my Vue3 Project I have a form for registering a new user.

Said form contains a password input, a confirm password input and a save button.
Both input fields use v-on:input to trigger a typescript function called comparePasswords. In there both input values are compared and if they are equal, should enable the save button (and else disable it again).

The button uses :disabled="!passwordsMatch", which is just a variable that is set by the comparePasswords function, and by default is set to false.

When I type in matching passwords and log the result, the function does its job and passwordsMatch is true. However the button is not activated by it, seemingly does not refresh.

Solutions I could find online are using :disabled pretty much in the same way.

So how do I have my button enabled/disabled with the result of my comparePasswords function?

Here's the relevant code:

<template>
    <input v-model="adminPass" placeholder="Password" type="password" v-on:input="comparePasswords"/>
    <input v-model="adminPassVerification" placeholder="Confirm Password" type="password" v-on:comparePasswords/>
    <button :disabled="!passwordsMatch">Save</button>
</template>

<script setup lang="ts">
    import {ref} from 'vue'

    //Getting the data from input
    var adminPass = ref('')        
    var adminPassVerification('')

    var passwordsMatch: boolean = false

    function comparePasswords() {
        if(adminPass.value != '') { //Checks if input is empty
            passwordsMatch = adminPass.value == adminPassVerification.value //Updates passwordsMatch
            console.log(passwordsMatch)
        }
    }
</script>

CodePudding user response:

Try like following snippet:

const { ref } = Vue
const app = Vue.createApp({
  setup() {
    const adminPass = ref('')        
    const adminPassVerification = ref('')
    const passwordsMatch = ref(false)
    function comparePasswords() {
      if(adminPass.value !== '') {
        passwordsMatch.value = adminPass.value === adminPassVerification.value
      }
    }
    return {
      adminPass, adminPassVerification, passwordsMatch, comparePasswords
    };
  },
})
app.mount('#demo')
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<div id="demo">
  <input v-model="adminPass" @input="comparePasswords" placeholder="Password" type="password" />
  <input v-model="adminPassVerification" @input="comparePasswords" placeholder="Confirm Password" type="password" />
  <button :disabled="!passwordsMatch">Save</button>
</div>

CodePudding user response:

This code works as shown here

<template>
  <input v-model="adminPass" placeholder="Password" type="password" @input="comparePasswords" />
  <input v-model="adminPassVerification" placeholder="Confirm Password" type="password" @input="comparePasswords" />
  <button :disabled="!passwordsMatch">Save</button>

  <p>{{ passwordsMatch }}</p>
</template>

<script setup>
import {ref} from 'vue'

const adminPass = ref('')        
const adminPassVerification = ref('')
const passwordsMatch = ref(false)

function comparePasswords() {
  if(adminPass.value) {
    passwordsMatch.value = adminPass.value === adminPassVerification.value
    console.log(passwordsMatch)
  }
}
</script>
  • Related