web-dev-qa-db-ja.com

v-modelが変更されたときにイベントを発生させる方法は? (vue js)

@clickfoo()関数を起動しようとしていますが、ご覧のとおり、イベントを正しく起動するにはラジオボタンを2回押す必要があります。 2回目に押すと値をキャッチします...

@clickなしでイベントを発生させたいのは、v-model(srStatus)が変更されたときにのみイベントを発生させます。

ここに私のフィドルがあります:

http://fiddle.jshell.net/wanxe/vsa46bw8/

64
jnieto

これは、ラジオボタンの値が変更される前にclickハンドラーが起動するために発生します。代わりにchangeイベントをリッスンする必要があります。

<input 
  type="radio" 
  name="optionsRadios" 
  id="optionsRadios2" 
  value=""
  v-model="srStatus" 
  v-on:change="foo"> //here

また、準備完了時にfoo()を本当に呼び出したいことを確認してください。

ready:function(){
    foo();
},
50
pherris

v-onディレクティブを削除することで、実際にこれを簡素化できます。

<input type="radio" name="optionsRadios" id="optionsRadios1" value="1" v-model="srStatus">

そしてwatchメソッドを使用して、変更をリッスンします。

new Vue ({
    el: "#app",
    data: {
        cases: [
            { name: 'case A', status: '1' },
            { name: 'case B', status: '0' },
            { name: 'case C', status: '1' }
        ],
        activeCases: [],
        srStatus: ''
    },
    watch: {
        srStatus: function(val, oldVal) {
            for (var i = 0; i < this.cases.length; i++) {
                if (this.cases[i].status == val) {
                    this.activeCases.Push(this.cases[i]);
                    alert("Fired! " + val);
                }
            }
        }
    }
});
71

Vue2:入力ぼかしの変化のみを検出する場合(たとえば、Enterキーを押すか、他の場所をクリックした後)do(詳細情報 ここ

<input @change="foo" v-model... >

(ユーザーの入力中に)単一の文字の変更を検出したい場合

<input @keydown="foo" v-model... >

@keyupおよび@inputイベントを使用することもできます。追加のパラメーターを渡したい場合は、テンプレートで使用します。 @keyDown="foo($event, param1, param2)"。以下の比較(編集可能なバージョン ここ

new Vue({
  el: "#app",
  data: { 
    keyDown: { key:null, val: null,  model: null, modelCopy: null },
    keyUp: { key:null, val: null,  model: null, modelCopy: null },
    change: { val: null,  model: null, modelCopy: null },
    input: { val: null,  model: null, modelCopy: null },
    
    
  },
  methods: {
  
    keyDownFun: function(event){                   // type of event: KeyboardEvent   
      console.log(event);  
      this.keyDown.key = event.key;                // or event.keyCode
      this.keyDown.val = event.target.value;       // html current input value
      this.keyDown.modelCopy = this.keyDown.model; // copy of model value at the moment on event handling
    },
    
    keyUpFun: function(event){                     // type of event: KeyboardEvent
      console.log(event);  
      this.keyUp.key = event.key;                  // or event.keyCode
      this.keyUp.val = event.target.value;         // html current input value
      this.keyUp.modelCopy = this.keyUp.model;     // copy of model value at the moment on event handling
    },
    
    changeFun: function(event) {                   // type of event: Event
      console.log(event);
      this.change.val = event.target.value;        // html current input value
      this.change.modelCopy = this.change.model;   // copy of model value at the moment on event handling
    },
    
    inputFun: function(event) {                    // type of event: Event
      console.log(event);
      this.input.val = event.target.value;         // html current input value
      this.input.modelCopy = this.input.model;     // copy of model value at the moment on event handling
    }
  }
})
div {
  margin-top: 20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

Type in fields below (to see events details open browser console)

<div id="app">
  <div><input type="text" @keyDown="keyDownFun" v-model="keyDown.model"><br> @keyDown (note: model is different than value and modelCopy)<br> key:{{keyDown.key}}<br> value: {{ keyDown.val }}<br> modelCopy: {{keyDown.modelCopy}}<br> model: {{keyDown.model}}</div>
  
  <div><input type="text" @keyUp="keyUpFun" v-model="keyUp.model"><br> @keyUp (note: model change value before event occure) <br> key:{{keyUp.key}}<br> value: {{ keyUp.val }}<br> modelCopy: {{keyUp.modelCopy}}<br> model: {{keyUp.model}}</div>
  
  <div><input type="text" @change="changeFun" v-model="change.model"><br> @change (occures on enter key or focus change (tab, outside mouse click) etc.)<br> value: {{ change.val }}<br> modelCopy: {{change.modelCopy}}<br> model: {{change.model}}</div>
  
  <div><input type="text" @input="inputFun" v-model="input.model"><br> @input<br> value: {{ input.val }}<br> modelCopy: {{input.modelCopy}}<br> model: {{input.model}}</div>
     
</div>
18

上記の正しい答えに追加するために、Vue.JS v1.0では次のように記述できます。

<a v-on:click="doSomething">

したがって、この例では

 v-on:change="foo"

参照: http://v1.vuejs.org/guide/syntax.html#Arguments

8
Matthew

@inputを使用する必要があります。

<input @input="handleInput" />

@inputは、ユーザーが入力値を変更すると起動します。

@changeは、ユーザーが値を変更し、入力のフォーカスを外したときに起動します(たとえば、外部のどこかをクリックしたとき)

ここで違いを見ることができます: https://jsfiddle.net/posva/oqe9e8pb/

4
Peretz30