Как перехватить или очистить значение v-модели после события @paste в Vue 2.6 - PullRequest
2 голосов
/ 16 апреля 2020

У меня проблема с v-моделью и событием @paste в поле ввода.

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

Я хотел бы предотвратить это.

Я создал простое приложение JsFiddle Todo, чтобы показать проблему.

https://jsfiddle.net/k12drcqn/1/

onPaste: function() {
          let clipped = event.clipboardData.getData('text').split("\n");
          clipped.forEach(item => {
             this.todos.push({
                 text: item, done: false
             })
          })
          // is not clearing the v-model: todo
          this.todo = ''
       }

Например, если вы скопируете что-то подобное в поле ввода:

  1. Task1
  2. Task2
  3. Task3

Эти задачи будут добавлены в список, но также будут отображаться в поле ввода. Есть ли возможность не отображать в поле ввода вставленные задачи?

Ответы [ 2 ]

1 голос
/ 17 апреля 2020
onPaste: function() {
   let clipped = event.clipboardData.getData('text').split("\n");
   clipped.forEach(item => {
      this.todos.push({
         text: item, done: false
      })
   })

   // instead of this
   // this.todo = ''

   // make this
   setTimeout(() => {
       this.todo = ''
   }, 0);
}

Я думаю, что текст остается на входе при синхронном вызове this.todo = ''.

0 голосов
/ 17 апреля 2020

Свойство todo успешно очищено, проблема в событии вставки, вы должны очистить его, добавив событие blur:

    onPaste: function(event){
        let clipped = event.clipboardData.getData('text').split("\n");
      clipped.forEach(item => {
        this.todos.push({
            text: item, done: false
        })
      })

      this.todo = ''
      event.target.blur();
    }

Полный пример

new Vue({
  el: "#app",
  data: {
    todo: '',
    todos: [{
        text: "Learn JavaScript",
        done: false
      },
      {
        text: "Learn Vue",
        done: false
      },
      {
        text: "Play around in JSFiddle",
        done: true
      },
      {
        text: "Build something awesome",
        done: true
      }
    ]
  },
  methods: {
    toggle: function(todo) {
      todo.done = !todo.done
    },
    addTodo: function() {
      this.todos.push({
        text: this.todo,
        done: false
      })
      this.todo = ''
    },
    onPaste: function(event) {
      let clipped = event.clipboardData.getData('text').split("\n");
      clipped.forEach(item => {
        this.todos.push({
          text: item,
          done: false
        })
      })
      // is not clearing the v-model: todo
      this.todo = ''
      event.target.blur();

    }
  }
})
body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  margin: 8px 0;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

del {
  color: rgba(0, 0, 0, 0.3);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <h2>Todos:</h2>
  <input type="text" v-model="todo" @keyup.enter="addTodo" @paste="onPaste">
  <ol>
    <li v-for="todo in todos">
      <label>
        <input type="checkbox"
          v-on:change="toggle(todo)"
          v-bind:checked="todo.done">

        <del v-if="todo.done">
          {{ todo.text }}
        </del>
        <span v-else>
          {{ todo.text }}
        </span>
      </label>
    </li>
  </ol>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...