v-show无效的原因

使用v-for列出班级列表,每个班级的后面有个按钮【查看详情】,点击按钮后,在该班级下方显示一个div,展示该班级详情,同时隐藏其它班级详情。
伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<template v-for="class in classes">
<span>{{class.name}}</span>
<button @click='showDetail(class)' >查看详情</button>

<div v-show="class.show_detail == true">
<span>{{class.name}}</span>
<span>{{class.peoples}}</span>
</div>
</template>

<script>
export default {
data() {
return {
classes: [],
};
},
created() {
this.fetchData();
},
methods: {
fetchData() {
axios("/getClasses")
.then((response) => {
for (const key in response.data) {
response.data[key].show_detail = true
}
// 一定要先在for循环加入show_detail属性,然后再一次性赋值给classes
this.classes = response.data;
})
},
showCabins(params){
for (const key in this.classes) {
this.classes[key].show_detail = false
}
// 注意:如果参数是对象,修改对象中的属性,属于引用传递,原始对象会发生改变
params.show_detail = true
},
},
};
</script>

此处有两个知识点:
1.showDetail函数中的参数params是对象,如果修改了params中的属性,则原始变量classes也会改变
2.从axios中拿到的数据中没有show_detail这个属性,如果是先把response.data赋值给classes,然后for循环中给classes加上show_detail属性,则v-show无效,无法控制班级的显示隐藏