【发布时间】:2020-12-11 01:00:05
【问题描述】:
我有一个从父组件接收道具的子组件。我添加了一个事件来在单击按钮时更新父组件中的道具。但是子组件并没有检测到prop的变化。
大概代码:
父组件:
<template>
<table>
<Student v-for="(student, index) in students"
:key="index"
:student="student"
:attendance="attendance[student.id]"
@attended-clicked="changeAttendance"
></student>
</table>
</template>
<script>
export default {
data() {
return {
students: [
{id: 1, name: 'Pepito'},
{id: 2, name: 'Sue'},
],
attendance: {
1: {attended: true},
2: {attended: false},
}
}
},
methods: {
changeAttendance(studentId) {
this.attendance[studentId].attended = !this.attendance[studentId].attended;
}
}
}
</script>
子组件:
<template>
<tr>
<td>{{ student.name }}</td>
<td><v-btn :color="attendance.attended ? 'green' : 'red'"
@click="$emit('attended-clicked', student.id)"
>Attended</v-btn>
</tr>
</template>
<script>
export default {
props: ['student', 'attendance']
}
</script>
我已尝试使代码尽可能少,以便让您了解我想要实现的目标。期望是当按钮被点击时,attendance.attended 会发生变化。
我可以验证使用 Vue 开发人员工具单击时该值是否正在更改(尽管我必须按下“强制刷新”按钮才能看到更改)。但显然,孩子的观点并没有接受这种变化。
我在这里做错了什么会破坏反应性吗?
我也尝试过使用Vue.set 和一些类似这样的代码:
methods: {
changeAttendance(studentId) {
let attendance = this.attendance[studentId];
attendance.attended = !attendance.attended;
Vue.set(this.attendance, studentId, attendance);
}
}
没有区别。
感谢您对我做错的任何见解,谢谢!
【问题讨论】:
-
你能做一个sn-p
-
不知道如何用多个 vue 组件制作 sn-p 和 vuetify。不过我会调查的
-
students和attendance我猜应该是一个数组 -
@Chris 这是你需要的吗:s8o8q.csb.app?
-
这是sandbox
标签: javascript vue.js vue-component vue-reactivity vue-props