Keydown и Keyup в Vue - PullRequest
       16

Keydown и Keyup в Vue

0 голосов
/ 02 июля 2018

Это мой код

<script src="https://npmcdn.com/vue/dist/vue.js"></script>

<div id="temp">
<div>
<input type="text" v-on:keydown = "storeValue">
<p>{{ value }}</p>
</div>
<div>
<input type="text" v-on:keyup = "storeValue2">
<p>{{ value2 }}</p>
</div>
</div>
<script>
new Vue({
    el:'#temp',
    data:{
        value:'',
        value2:''
    },
    methods:{
        storeValue:function(event){
            this.value = event.target.value
        },
        storeValue2:function(event){
            this.value2 = event.target.value
        }
    }
})
</script>

enter image description here

Есть два текстовых поля. На мой взгляд, окончательный результат двух текстовых полей должен быть одинаковым, если я добавлю значение в текстовое поле. Однако результат другой. значение показывает «w» после того, как я ввожу любую клавишу. (Я запускаю это снова) Значение2 показывает «W» сразу. Так кто-нибудь может это объяснить?

Проверьте JSFiddle

Большое спасибо.

@ Владислав Ладицкий Я пробую простой JavaScript. Однако поведение клавиш и клавиш одинаково.

<html>
    <p>This is keyDown</p>
    <input type="text" id="myInputKeyDown" onkeydown="keyDownFunc()" >
    <p id="demo1"></p>

    <p>This is keyUp</p>
    <input type="text" id="myInputKeyUp" onkeydown="keyUpFunc()" >
    <p id="demo2"></p>
</html>

<script>
    function keyDownFunc(){
        let temp = document.getElementById("myInputKeyDown").value;
        document.getElementById("demo1").innerHTML = temp;
    }

    function keyUpFunc(){
        let temp = document.getElementById("myInputKeyUp").value;
        document.getElementById("demo2").innerHTML = temp;
    }
</script>

Ответы [ 4 ]

0 голосов
/ 03 июля 2018

Ваша проблема может быть легко решена с помощью функции двустороннего связывания данных Vue, как в ответе выше @TechBirds. Ниже приведен фрагмент с небольшими изменениями, который решает проблему обновления. Я также добавил наблюдателя, который будет очень полезен, если вы захотите дополнительно контролировать значение в поле ввода.

<script src="https://npmcdn.com/vue/dist/vue.js"></script>

<div id="temp">
<div>
<input type="text" v-model="value1">
<p>{{ value1 }}</p>
</div>
<div>
<input type="text"v-model="value2">
<p>{{ value2 }}</p>
</div>
</div>
<script>
new Vue({
    el:'#temp',
    data: {
       value1:'',
       value2:''
    },
    watch: {
      value1: 'storeValue1',
      value2: 'storeValue2'
    },
    methods:{
      storeValue1(value) {
        // you can play here for more control
      },
      storeValue2(value) {
        // you can play here for more control
      }
    }
})
</script>

12345678

0 голосов
/ 02 июля 2018

Я думаю, что ваша проблема - событие нажатия клавиш, похожее на одно нажатие клавиши с точки зрения отображения данных.

Проверьте ловушки жизненного цикла VueJs, для изменения данных существует повторный рендеринг DOM. В этом случае это выглядит как время нажатия клавиши, и упомянутый повторный рендеринг заставляет его выглядеть так, будто нажатие клавиши запаздывает на один символ.

Во время срабатывания клавиши срабатывает storeValue, Похоже, что event.target.value еще не обновлен, поэтому вы не увидите, что он установлен на value

0 голосов
/ 02 июля 2018

Я думаю, что это не имеет ничего общего с Vue. Попробуйте это с простым JS, и вы получите те же результаты. Это классическая проблема с keydown / keyup. И причина, по которой все вместо этого используют входное событие.

0 голосов
/ 02 июля 2018

<script src="https://npmcdn.com/vue/dist/vue.js"></script>

<div id="temp">
<div>
<input type="text" v-model="value">
<p>{{ value }}</p>
</div>
<div>
<input type="text"v-model="value">
<p>{{ value }}</p>
</div>
</div>
<script>
new Vue({
    el:'#temp',
    data:{
       value:''
    },
    methods:{
    }
})
</script>

ты хочешь этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...