重点关注新添加的项目

时间:2016-09-16 06:57:38

标签: vue.js

所以我有一个项目列表和通过v-for和v-model链接到每个项目的输入列表。

我单击一个按钮并将新项目添加到该列表中。我想关注与新添加的项链接的输入。

无法弄清楚如何实现这一目标。

<div id="app">
  <div v-for="item in sortedItems">
    <input v-model="item">
  </div>
  <button @click="addItem">
    add
  </button>
</div>


new Vue({
  el: '#app',
  data: {
    items: []
  },
  methods: {
    addItem: function() {
      this.items.push(Math.random());
    }
  },
  computed: {
    sortedItems: function() {
      return this.items.sort(function(i1, i2) {
        return i1 - i2;
      })
    }
  }
})

这里是排序列表的小提琴 https://jsfiddle.net/sfL91r95/1/

由于

2 个答案:

答案 0 :(得分:8)

更新:灵感来自pkawiak的评论,这是一个基于指令的解决方案。我发现在focus部分调用bind并不起作用;我不得不使用nextTick来推迟它。

&#13;
&#13;
Vue.directive('focus-on-create', {
  // Note: using Vue 1. In Vue 2, el would be a parameter
  bind: function() {
    Vue.nextTick(() => {
      this.el.focus();
    })
  }
})

new Vue({
  el: '#app',
  data: {
    items: []
  },
  methods: {
    addItem: function() {
      this.items.push(Math.random());
    }
  },
  computed: {
    sortedItems: function() {
      return this.items.sort(function(i1, i2) {
        return i1 - i2;
      })
    }
  }
})
&#13;
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
<div id="app">
  <div v-for="item in sortedItems">
    <input v-focus-on-create v-model="item">
  </div>
  <button @click="addItem">
    add
  </button>
</div>
&#13;
&#13;
&#13;

原始答案: 将输入作为组件,以便为其提供a ready hook

&#13;
&#13;
const autofocus = Vue.extend({
  template: '<input v-model="item" />',
  props: ['item'],
  ready: function() {
    this.$el.focus();
  }
})

new Vue({
  el: '#app',
  data: {
    items: []
  },
  methods: {
    addItem: function() {
      this.items.push(Math.random());
    }
  },
  components: {
    autofocus
  },
  computed: {
    sortedItems: function() {
      return this.items.sort(function(i1, i2) {
        return i1 - i2;
      })
    }
  }
})
&#13;
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/1.0.26/vue.min.js"></script>
<div id="app">
  <div v-for="item in sortedItems">
    <autofocus :item="item"></autofocus>
  </div>
  <button @click="addItem">
    add
  </button>
</div>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

我想扩展 @Roy 的答案。 如果您使用的是任何UI框架,则它将创建DIV并在DIV输入标签内创建,因此此代码段将处理这种情况。

Vue.directive('focus-on-create', { 
    bind: function(el) { 
          Vue.nextTick(() => { 
              el.querySelector('input').focus()
          })
    }
})