问题描述
我在使用 laravel 和 vue 时遇到了关于显示数据库表 find 方法的结果的问题。我不太明白为什么 v-for 指令会错误地解析 json 结果。
这是Vue代码:
<template>
<table class="table table-hover">
<thead>
<tr>
<th>Class</th>
<th>Amount of Students</th>
<th>Teacher</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr v-for="classroom in classrooms" :key="classroom.id">
<td>{{ classroom.class_no }}•{{ classroom.field }}•{{ classroom.room_no }}</td>
<td>{{ classroom.amount_students }}</td>
<td>{{ classroom.teacher }}</td>
<td>
<a href="#">
<i class="fa fa-edit blue"></i>
</a>
</td>
</tr>
</tbody>
</table>
</template>
<script>
export default {
data () {
return {
classrooms : {
"success": true,"data": { "id": 1,"class_no": 1,"field": "Architecture","room_no": 4,"amount_students": 40,"teacher": "Bobby Fisher" },"message": "Find Classroom Detail"
}
}
}
}
</script>
json 教室本身实际上是控制器的结果:
public function show($level)
{
$classrooms = ClassRoom::where('class_no',$level)->firstOrFail();
return $this->sendResponse($classrooms,'Find Classroom Detail');
}
这是错误结果的截图:
The result should be only a single row
请帮我解决这个问题。
解决方法
查看您的 Vue 数据属性,您想使用 v-for="classroom in classrooms.data"
。
如果您从 API 获取数据,那么您不想将完整响应分配给您的 classroom
数据属性,而是将 response.data
分配给 classroom
,因此您可以这样做
v-for="classroom in classrooms"
。
除非您的 API 以不同格式返回数据,否则这将有效。
,实际上,当您迭代教室是一个具有三个键的对象时,for 循环对每个键迭代一次。
如果您只想遍历 data
键,那么只需从后端返回数据即可。
您可以使用 v-if
条件来检查当前键是否包含 class_no,如果是,则显示该行,否则不显示。
<tr v-for="classroom in classrooms" :key="classroom.id" v-if="classroom.class_no">
<td>{{ classroom.class_no }}•{{ classroom.field }}•{{ classroom.room_no }}</td>
<td>{{ classroom.amount_students }}</td>
<td>{{ classroom.teacher }}</td>
<td>
<a href="#">
<i class="fa fa-edit blue"></i>
</a>
</td>
</tr>
,
您可以查看 JsFiddle
https://jsfiddle.net/JManish/9qjvdy8n/2/
对教室的数据属性进行一些更改。
<table class="table">
<thead>
<tr>
<th>Class</th>
<th>Amount of Students</th>
<th>Teacher</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr v-for="(classroom,index) in classrooms.data" :key="index">
<td>{{ classroom.class_no }}•{{ classroom.field }}•{{ classroom.room_no }}</td>
<td>{{ classroom.amount_students }}</td>
<td>{{ classroom.teacher }}</td>
<td>
<a href="#">
<i class="fa fa-edit blue"></i>
</a>
</td>
</tr>
</tbody>
</table>
new Vue({
el: '#app',data() {
return {
classrooms: {
"success": true,"data":[
{
"id": 1,"class_no": 1,"field": "Architecture","room_no": 4,"amount_students": 40,"teacher": "Bobby Fisher"
}
],"message": "Find Classroom Detail"
}
}
}
})
希望这能解决您的解析问题。