所以我有一个项目列表和通过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/
由于
答案 0 :(得分:8)
更新:灵感来自pkawiak的评论,这是一个基于指令的解决方案。我发现在focus
部分调用bind
并不起作用;我不得不使用nextTick
来推迟它。
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;
原始答案:
将输入作为组件,以便为其提供a ready
hook。
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;
答案 1 :(得分:1)
我想扩展 @Roy 的答案。 如果您使用的是任何UI框架,则它将创建DIV并在DIV输入标签内创建,因此此代码段将处理这种情况。
Vue.directive('focus-on-create', {
bind: function(el) {
Vue.nextTick(() => {
el.querySelector('input').focus()
})
}
})