【发布时间】:2020-01-19 20:09:46
【问题描述】:
我正在更新发送到 Vue 中的“锻炼”组件的“锻炼”道具。在子组件中,我发出一个函数来增加你所在的集合。该函数在父组件中触发(我得到了 console.logs()),但子组件没有重新渲染。
家长:
<ExerciseListItem
v-for="(exercise) in exercises"
v-on:completeSet="completeSet"
v-on:selectExercise="selectExercise"
v-bind:exercise.sync="exercise"
v-bind:isActiveExercise="exercise.slug === activeExerciseSlug"
v-bind:key="exercise.slug"
/>
方法:
methods: {
completeSet: function(slug) {
console.log("complete-set", slug);
const exercise = this.getExerciseBySlug(slug);
exercise.completedSets++;
if (exercise.completedSets === exercise.totalSets) {
this.completeExercise(slug);
}
},
completeExercise: function(slug) {
this.getExerciseBySlug(slug).isComplete = true;
console.log("COMPLETE-exercise", slug);
},
getExerciseBySlug: function(slug) {
return this.exercises.find(exercise => exercise.slug === slug);
},
selectExercise: function(selectedSlug) {
this.activeExerciseSlug = selectedSlug;
}
},
子模板
<li
v-bind:class="{ 'white-box': true, complete: exercise.isComplete }"
v-on:click="exercise.totalSets > 1 ? $emit('selectExercise', exercise.slug) : $emit('completeSet', exercise.slug)"
>
帮助感谢????
【问题讨论】:
-
exercise.completedSets的值应按预期更新并触发重新渲染。如果 'exercie' 对象本身没有反应(其属性没有 setter/getter),什么可以防止这种情况发生。在您的代码中,不清楚练习对象的来源 - 您能解释或发布代码吗? -
您应该为您的演示启用 Vue 开发工具。这将有助于我们调试。
-
嘿@TimWickstrom,完全不知道那是一回事。我现在加了????
-
@MarcRo 原始数据作为道具传递给路由。原始数据在default.js中
-
@RossWhitehouse 我明白了,我之前没有时间检查回购。问题是您的道具(数组)中的嵌套对象不是反应性的。默认情况下,Vue 不会使嵌套属性具有反应性——因此它无法检测到它们的值何时发生变化。您可以做两件事:1. 明确地使您的道具反应或 2. 手动强制更新。
标签: javascript vue.js data-binding components vue-props