当我在父级为 v-for 的输入元素上使用 v-model 时,它一次只能让我输入 1 个字符
When I use v-model on input element that has a parent with v-for, it only let's me put 1 character at a time
我正在使用 Vue 开发一个待办事项列表应用程序。但是我在尝试实现对待办事项名称的编辑时遇到了一个问题。这是我的待办事项列表模板:
<div v-for="(todo, index) in todos" :key="todo.title" class="todo-item">
<div>
<!-- <div v-if="!todo.editing" class="item-label"
@dblclick="editTodo(todo)" >{{ todo.title }}</div> -->
<input
@dblclick="todo.editing = true"
@blur="todo.editing = false"
@keydown.enter="todo.editing = false"
class="item-edit"
type="text" :readonly="!todo.editing ? true : null"
v-model="todo.title">
</div>
<div class="remove-item" @click="removeTodo(index)">
×
</div>
</div>
我最初有一个 div 包含待办事项 title
。但是现在我已经用一个输入替换了它,这是只读的但是当双击变成一个正常的输入。但是,当输入可编辑时,在取消选择之前我只能输入 1 个字符。我相信这是因为每次我输入一个字符时,待办事项列表都会更新,因此它会取消选择。我该如何解决这个问题?
我稍微修改了您的代码,希望以下解决方案对您有所帮助。我用了两个条件来判断是显示标题还是输入框。您可以 运行 此处的代码片段并测试它是否符合您的目的。如果您有任何困惑,请告诉我。
new Vue({
el: '#app',
data: {
todos: [
{
title: 'title- 1',
editing: true
},
{
title: 'title- 2',
editing: true
},
{
title: 'title- 3',
editing: false
}
],
showInput: false,
updateTitle: '',
selectedIndex: -1
},
methods: {
editTodo(index){
if(this.todos[index].editing){
this.selectedIndex = index;
this.updateTitle = this.todos[index].title;
this.showInput = true;
}
},
updateTodo(index){
this.todos[index].title = this.updateTitle;
this.showInput = false;
this.selectedIndex = -1;
},
removeTodo(index){
this.todos.splice(index, 1);
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<div v-for="(todo, index) in todos" :key="todo.title" class="todo-item">
<div v-if="index != selectedIndex" class="item-label" @dblclick="editTodo(index)" >
{{ todo.title }}
<span class="remove-item ml-2" @click="removeTodo(index)" style="cursor: pointer;"> × </span>
</div>
<input
v-if="showInput && (index == selectedIndex)"
class="item-edit"
type="text"
v-model="updateTitle"
@blur="updateTodo(index)"
v-on:keyup.enter="updateTodo(index)"
>
</div>
</div>
可能有点晚了,但对于其他有类似问题的人来说,这是因为关键是 todo.title 他正在改变输入 (v-model="todo.title" )
我正在使用 Vue 开发一个待办事项列表应用程序。但是我在尝试实现对待办事项名称的编辑时遇到了一个问题。这是我的待办事项列表模板:
<div v-for="(todo, index) in todos" :key="todo.title" class="todo-item">
<div>
<!-- <div v-if="!todo.editing" class="item-label"
@dblclick="editTodo(todo)" >{{ todo.title }}</div> -->
<input
@dblclick="todo.editing = true"
@blur="todo.editing = false"
@keydown.enter="todo.editing = false"
class="item-edit"
type="text" :readonly="!todo.editing ? true : null"
v-model="todo.title">
</div>
<div class="remove-item" @click="removeTodo(index)">
×
</div>
</div>
我最初有一个 div 包含待办事项 title
。但是现在我已经用一个输入替换了它,这是只读的但是当双击变成一个正常的输入。但是,当输入可编辑时,在取消选择之前我只能输入 1 个字符。我相信这是因为每次我输入一个字符时,待办事项列表都会更新,因此它会取消选择。我该如何解决这个问题?
我稍微修改了您的代码,希望以下解决方案对您有所帮助。我用了两个条件来判断是显示标题还是输入框。您可以 运行 此处的代码片段并测试它是否符合您的目的。如果您有任何困惑,请告诉我。
new Vue({
el: '#app',
data: {
todos: [
{
title: 'title- 1',
editing: true
},
{
title: 'title- 2',
editing: true
},
{
title: 'title- 3',
editing: false
}
],
showInput: false,
updateTitle: '',
selectedIndex: -1
},
methods: {
editTodo(index){
if(this.todos[index].editing){
this.selectedIndex = index;
this.updateTitle = this.todos[index].title;
this.showInput = true;
}
},
updateTodo(index){
this.todos[index].title = this.updateTitle;
this.showInput = false;
this.selectedIndex = -1;
},
removeTodo(index){
this.todos.splice(index, 1);
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
<div v-for="(todo, index) in todos" :key="todo.title" class="todo-item">
<div v-if="index != selectedIndex" class="item-label" @dblclick="editTodo(index)" >
{{ todo.title }}
<span class="remove-item ml-2" @click="removeTodo(index)" style="cursor: pointer;"> × </span>
</div>
<input
v-if="showInput && (index == selectedIndex)"
class="item-edit"
type="text"
v-model="updateTitle"
@blur="updateTodo(index)"
v-on:keyup.enter="updateTodo(index)"
>
</div>
</div>
可能有点晚了,但对于其他有类似问题的人来说,这是因为关键是 todo.title 他正在改变输入 (v-model="todo.title" )