Javascript 更新输入';编辑时的s绑定值
我正在编写一个基本的待办事项应用程序。每个待办事项/任务项在VueJavascript 更新输入';编辑时的s绑定值,javascript,vue.js,vuejs2,Javascript,Vue.js,Vuejs2,我正在编写一个基本的待办事项应用程序。每个待办事项/任务项在Vue组件中作为输入项列出,并且将显示一个v形,用于指向任务数组 我试图允许用户编辑每个任务输入,并在更改值后,让此命令更新数组项(而不仅仅是输入本身)。输入上的@change事件正在触发,但我不知道在这一点之后该做什么 HTML: 添加任务 JS: Vue.component('list-item'{ 道具:['item','index'], 模板:` `, 方法:{ completeTask:function(){ 此.emi
组件中作为输入项列出,并且
将显示一个v形,用于指向任务数组
我试图允许用户编辑每个任务输入,并在更改值后,让此命令更新数组项(而不仅仅是输入本身)。输入上的@change事件正在触发,但我不知道在这一点之后该做什么
HTML:
添加任务
JS:
Vue.component('list-item'{
道具:['item','index'],
模板:`
`,
方法:{
completeTask:function(){
此.emit('task-completed',此.index);
},
deleteTask:function(){
此.emit('task-deleted',此.index);
},
updateTask:function(){
console.log('changed');
}
}
});
Vue.组件(“响应容器”{
模板:`
`
});
var app=新的Vue({
el:“.app”,
数据:{
任务:[],
已完成的任务:[],
新任务:“”
},
方法:{
addTask:function(){
如果(此.IsThere文本){
this.tasks.push(this.newTask);
this.newTask='';
这个.updateStorage();
}
},
completeTask:函数(索引){
this.completedTasks.push(this.tasks[index]);
这个.tasks.splice(索引,1);
这个.updateStorage();
},
deleteTask:函数(索引){
这个.tasks.splice(索引,1);
这个.updateStorage();
},
updateStoreRage:function(){
setItem(“tasks”,JSON.stringify(this.tasks));
}
},
计算:{
isThereText:函数(){
返回此.newTask.trim().length;
}
},
//如果本地存储中已经存储了任务,
//填充任务数组
挂载:函数(){
if(localStorage.getItem(“任务”)){
this.tasks=JSON.parse(localStorage.getItem(“tasks”);
}
}
});
您可以将索引和新值传递给更改事件处理程序:
<input class="task" :value="item" @change="updateTask(index, $event)">
在
组件上使用,而不是传入项
属性。您还需要传入来自数组的引用(tasks[index]
),因为此范围内的task
是一个未绑定到数组元素的副本:
<list-item v-for="task, index in tasks" v-model="tasks[index]"></list-item>
- 正如Bert Evans提到的,即使这样做有效,Vue也要求使用
指令的组件也使用v-for
属性(否则您将从Vue收到警告):键
- 另外,要意识到
范围中的v-for
变量可能会更改,这意味着索引1处的项可能会更改为索引4,随着应用程序变得更加复杂,这可能会带来一些问题。更好的方法是将index
存储为具有项
属性的对象。这样,您就可以拥有与该项关联的不可变idid
值@BertEvans为什么不使用索引
?我知道文档中说需要键
,但这不就是要绑定数据吗?我认为v-model
规避了这一点。我得到了预期的结果,没有任何错误或警告。你不会得到警告,因为他使用的是Vue的生产verison。我们不断从使用索引
作为组件变量的人那里得到问题。问题是index
发生了变化,而id
s没有变化。@BertEvans Ok,呼叫正确。我将更新我的答案以包括PSA@BertEvans,请等待您的第一条评论更改?
<input class="task" :value="item" @change="updateTask(index, $event)">
updateTask: function(index, event) {
console.log(index);
console.log(event.target.value);
}
<list-item v-for="task, index in tasks" v-model="tasks[index]"></list-item>
Vue.component('list-item', {
props: ['value'],
template: `<div class="task-wrapper">
<input class="task" v-model="item" @change="updateTask"></div>
</div>
`,
data() {
return {
item: this.value,
}
},
methods: {
updateTask: function() {
this.$emit('input', this.item);
}
}
});
<list-item
v-for="task, index in tasks"
:key="index"
v-model="tasks[index]"
></list-item>