Vue.js obtiene la opción seleccionada en @change


102

Primero, quiero decir que soy nuevo en Vue, y este es mi primer proyecto usando Vue. Tengo un cuadro combinado y quiero hacer algo diferente en función del cuadro combinado seleccionado. Utilizo archivos vue.html y mecanografiado separados. Aquí está mi código.

<select name="LeaveType" @change="onChange()" class="form-control">
     <option value="1">Annual Leave/ Off-Day</option>
     <option value="2">On Demand Leave</option>
</select>

y aquí está mi archivo ts

onChange(value) {
    console.log(value);
}

¿Cómo obtener el valor de la opción seleccionada en mi función de mecanografiado? Gracias.

Respuestas:


188

Úselo v-modelpara vincular el valor del valor de la opción seleccionada. He aquí un ejemplo .

<select name="LeaveType" @change="onChange($event)" class="form-control" v-model="key">
   <option value="1">Annual Leave/ Off-Day</option>
   <option value="2">On Demand Leave</option>
</select>
<script>
var vm = new Vue({
    data: {
        key: ""
    },
    methods: {
        onChange(event) {
            console.log(event.target.value)
        }
    }
}
</script>

Se puede ver más referencia desde aquí .


1
recibe el error "la clave no está definida". ¿Tengo que definir primero el modelo v? si es así, ¿cómo?
hphp

Sí, puede establecer cualquier nombre para reemplazar la clave. Pero asegúrese de que sea una propiedad de los datos.
ramwin

Aún así, no lo entiendo ... sé que puedo cambiarle el nombre a cualquier nombre, pero recibo una advertencia "[Vue warn]: la propiedad o método" seleccionado "no está definido en la instancia, pero se hace referencia durante el procesamiento. Asegúrese de que esto la propiedad es reactiva, ya sea en la opción de datos o para los componentes basados ​​en clases, al inicializar la propiedad "
hphp

Tal vez haya un error tipográfico en su script porque no existe la palabra 'seleccionado' en el script. Compruébelo y consulte el enlace en la respuesta. Le agrego un ejemplo de demostración.
ramwin

"seleccionado" es el nombre de mi modelo. si reescribo su código, mi advertencia se convertirá en "clave" no definida
hphp

37

@ es una opción de acceso directo para v-on . Utilice @ solo cuando desee ejecutar algunos métodos de Vue. Como no está ejecutando métodos Vue, en su lugar está llamando a la función javascript, debe usar el atributo onchange para llamar a la función javascript

<select name="LeaveType" onchange="onChange(this.value)" class="form-control">
 <option value="1">Annual Leave/ Off-Day</option>
 <option value="2">On Demand Leave</option>
</select>

function onChange(value) {
  console.log(value);
}

Si desea llamar a los métodos de Vue, hágalo así:

<select name="LeaveType" @change="onChange($event)" class="form-control">
 <option value="1">Annual Leave/ Off-Day</option>
 <option value="2">On Demand Leave</option>
</select>

new Vue({
  ...
  ...
  methods:{
    onChange:function(event){
       console.log(event.target.value);
    }
  }
})

Puede utilizar el atributo de datos del modelo v en el elemento de selección para vincular el valor.

<select v-model="selectedValue" name="LeaveType" onchange="onChange(this.value)" class="form-control">
 <option value="1">Annual Leave/ Off-Day</option>
 <option value="2">On Demand Leave</option>
</select>

new Vue({
    data:{
        selectedValue : 1, // First option will be selected by default
    },
    ...
    ...
    methods:{
        onChange:function(event){
            console.log(this.selectedValue);
        }
    }
})

Espero que esto ayude :-)


Recibo el siguiente error cuando ejecuto el segundo en vuejs: Uncaught TypeError: No se puede leer la propiedad 'aplicar' de indefinido
TheDevWay

No he usado "aplicar" en ninguna parte del Código. ¿Podría compartir el código en el que recibe el error?
santanu bera

23

El valor cambiado estará en event.target.value

const app = new Vue({
  el: "#app",
  data: function() {
    return {
      message: "Vue"
    }
  },
  methods: {
    onChange(event) {
      console.log(event.target.value);
    }
  }
})
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<div id="app">
  <select name="LeaveType" @change="onChange" class="form-control">
   <option value="1">Annual Leave/ Off-Day</option>
   <option value="2">On Demand Leave</option>
</select>
</div>


6

También puedes usar v-model para el rescate.

<template>
    <select name="LeaveType" v-model="leaveType" @change="onChange()" class="form-control">
         <option value="1">Annual Leave/ Off-Day</option>
         <option value="2">On Demand Leave</option>
    </select>
</template>

<script>
export default {
    data() {
        return {
            leaveType: '',
        }
    },

    methods: {
        onChange() {
            console.log('The new value is: ', this.leaveType)
        }
    }
}
</script>

¿Cómo agrego texto de entrada dependiendo de la opción seleccionada?
Angel

0

Puede guardar su @ change = "onChange ()" y usar observadores. Vue calcula y observa, está diseñado para eso. En caso de que solo necesite el valor y no otros atributos de evento complejos.

Algo como:

  ...
  watch: {
    leaveType () {
      this.whateverMethod(this.leaveType)
    }
  },
  methods: {
     onChange() {
         console.log('The new value is: ', this.leaveType)
     }
  }

Tenga en cuenta que los vigilantes son caros. lo anterior también se puede lograr como una propiedad computada, que es mucho más barata.
Ramesh Pareek
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.