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.