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.

hphp
fuente

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í .

ramwin
fuente
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 :-)

santanu bera
fuente
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/[email protected]/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>

Agney
fuente
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>
Merhawi Fissehaye
fuente
¿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)
     }
  }
biojazzard
fuente
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