Vue.js otrzymuje wybraną opcję na @change


108

Po pierwsze, chcę powiedzieć, że jestem nowy w Vue i jest to mój pierwszy projekt, w którym Vue jest używany. Mam combobox i chcę zrobić coś innego w oparciu o wybrany combobox. Używam osobnego pliku vue.html i maszynopisu. Oto mój kod.

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

a oto mój plik ts

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

Jak uzyskać wybraną wartość opcji w mojej funkcji maszynopisu? Dzięki.

Odpowiedzi:


200

Służy v-modeldo wiązania wartości wybranej opcji. Oto przykład .

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

Więcej informacji można znaleźć tutaj .


1
pojawia się błąd „klucz nie jest zdefiniowany”. czy muszę najpierw zdefiniować model v? jeśli tak, to jak?
hphp

Tak, możesz ustawić dowolną nazwę, aby zastąpić klucz. Ale upewnij się, że jest to właściwość danych.
ramwin

Nadal nie rozumiem. Wiem, że mogę zmienić jego nazwę na dowolną, ale pojawia się ostrzeżenie „[Ostrzeżenie Vue]: Właściwość lub metoda„ wybrana ”nie jest zdefiniowana w instancji, ale odwołuje się do niej podczas renderowania. Upewnij się, że to właściwość jest reaktywna, albo w opcji danych, albo w przypadku komponentów opartych na klasach, przez zainicjowanie właściwości "
hphp

Być może w Twoim skrypcie jest literówka, ponieważ w skrypcie nie ma słowa „wybrane”. Sprawdź to i zapoznaj się z linkiem w odpowiedzi. Dodam w nim przykład demo.
ramwin

„Wybrano” to nazwa mojego modelu. jeśli przepiszę twój kod, moje ostrzeżenie zmieni się na „klucz” nie jest zdefiniowany
hphp

38

@ jest opcją skrótu do v-on . Użyj @ tylko wtedy, gdy chcesz wykonać niektóre metody Vue. Ponieważ nie wykonujesz metod Vue, zamiast tego wywołujesz funkcję javascript, musisz użyć atrybutu onchange, aby wywołać funkcję 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);
}

Jeśli chcesz wywołać metody Vue, zrób to w ten sposób-

<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);
    }
  }
})

Możesz użyć atrybutu danych modelu v na elemencie select, aby powiązać wartość.

<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);
        }
    }
})

Mam nadzieję że to pomoże :-)


Gdy wykonuję drugi w vuejs, pojawia się następujący błąd: Uncaught TypeError: Cannot read property 'apply' of undefined
TheDevWay

Nigdzie w Kodeksie nie użyłem słowa „aplikuj”. Czy mógłbyś udostępnić kod, w którym otrzymujesz błąd?
santanu bera

23

Zmieniona wartość będzie w 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>


8

Możesz także użyć modelu V do pomocy

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

Jak dołączyć tekst wejściowy, zależy od wybranej opcji?
Anioł

0

Możesz zapisać @ change = "onChange ()" i używać obserwatorów. Vue oblicza i zegarki, jest do tego zaprojektowany. W przypadku, gdy potrzebujesz tylko wartości, a nie innych złożonych atrybutów zdarzenia.

Coś jak:

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

Należy pamiętać, że obserwatorzy są drogie. powyższe można również uzyskać jako właściwość obliczoną, która jest znacznie tańsza.
Ramesh Pareek
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.