Vue v-для автофокуса на новой текстовой области

Я делаю блог и хотел бы, чтобы пользователь мог создавать новые текстовые области, когда они нажимают клавишу ввода, и чтобы он автоматически фокусировался на недавно созданной текстовой области. Я пытался использовать атрибут автофокуса, но это не работает. Я также пытался использовать функцию nextTick, но это не работает. Как мне это сделать?

<div v-for="(value, index) in content">
    <textarea v-model="content[index].value" v-bind:ref="'content-'+index" v-on:keyup.enter="add_content(index)" placeholder="Content" autofocus></textarea>
</div>

а также add_content() определяется следующим образом:

add_content(index) {
    var next = index + 1;
    this.content.splice(next, 0, '');
    //this.$nextTick(() => {this.$refs['content-'+next].contentTextArea.focus()})
}

1 ответ

Решение

Вы на правильном пути, но this.$refs['content-'+next] возвращает массив, так что просто получите доступ к первому и вызовите .focus() на что

add_content(index) {
  var next = index + 1;
  this.content.splice(next, 0, {
    value: "Next"
  });
  this.$nextTick(() => {
    this.$refs["content-" + next][0].focus();
  });
}

Рабочий пример

var app = new Vue({
  el: '#app',
  data() {
    return {
      content: [{
        value: "hello"
      }]
    };
  },
  methods: {
    add_content(index) {
      var next = index + 1;
      this.content.splice(next, 0, {
        value: "Next"
      });
      this.$nextTick(() => {
        this.$refs["content-" + next][0].focus();
      });
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <div v-for="(value, index) in content">
    <textarea v-model="content[index].value" v-bind:ref="'content-' + index" v-on:keyup.enter="add_content(index);" placeholder="Content" autofocus></textarea>
  </div>
</div>

Кроме того, ваше значение в массиве, кажется, является объектом, а не строкой, поэтому splice в объекте, а не пустой строке

Другие вопросы по тегам