1 回答
TA贡献1786条经验 获得超11个赞
当您在组件上定义数据属性时,它仅在该组件及其模板中可用。您的v-for指令在父范围内(即在定义的组件之外tasks)。
这里最简单的解决方案可能是将容器元素移动到组件内部,并迭代那里的任务:
<div>
<div class="card" v-for="task in tasks" :key="task.id">
<div class="card-title">{{ task.name }}</div>
<div class="card-body">
<div class="service-desc">{{ task.description }}</div>
<div class="task-notes"><input class="form-control" v-model="task.notes" placeholder="Notes"></div>
<div class="task-active"><input type="checkbox" checked data-toggle="toggle" data-size="sm" v-model="task.active" v-on:click="$emit('disable')"></div>
</div>
</div>
</div>
注意:不能将 v- 用于模板的根元素,这就是将容器元素移动到模板中的原因。
另一种方法是将其分成两个组件(例如TaskList和TaskItem),其中父组件负责从 API 获取任务。子组件可以只接收一个任务作为 prop 并将其呈现给 UI。
任务列表
Vue.component('task-list', {
data: function() {
return {
tasks: []
}
},
mounted() {
this.getTasks();
},
methods: {
getTasks() {
axios.get('/tasks').then(response => {
this.tasks = response.data;
console.dir(this.tasks);
})
.catch(error => {
console.log(error);
});
}
},
template: `
<div class="container">
<task-item
v-for="task in tasks"
:key="task.id"
:task="task"
/>
</div>
`
});
任务项
Vue.component('tasks', {
props: {
task: {
required: true
}
},
template: `
<div class="card">
<div class="card-title">{{ task.name }}</div>
<div class="card-body">
<div class="service-desc">{{ task.description }}</div>
<div class="task-notes"><input class="form-control" v-model="task.notes" placeholder="Notes"></div>
<div class="task-active"><input type="checkbox" checked data-toggle="toggle" data-size="sm" v-model="task.active" v-on:click="$emit('disable')"></div>
</div>
</div>
`
});
这样做的好处是它更好地分离了组件的责任。您可以向组件添加逻辑TaskList来处理显示加载微调器和/或 API 调用的错误消息,同时TaskItem只需要关心显示单个任务。
- 1 回答
- 0 关注
- 150 浏览
添加回答
举报