javascript - Vue 子组件不会因 Prop 更改而更新

标签 javascript vue.js data-binding components vue-props

我正在更新一个“exercise” Prop ,该 Prop 会发送到 Vue 中的“workout”组件。在子组件中,我发出一个函数来增加您所在的集合。该函数在父组件中触发(我得到 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)"
>

Here's the project on Github

And a live demo

感谢帮助😊

最佳答案

该组件未更新,因为 prop 的嵌套值不是响应式的,因此,vue 不会注意到它们正在发生变化。

如何在 Vue 中使嵌套属性响应式

以下内容适用于您的 vue 应用程序中的所有状态 - 无论它是否位于 vuex 商店中,您的 data()选项,或在 prop 内.

默认情况下,vue 仅在声明时才使状态响应。这意味着动态(在运行时)分配的状态不是 react 性的(例如 mounted() { this.bar = 'two' } 不会在 bar 中创建 react 性属性 data() )。

如果您想动态创建响应式状态,则需要遵循两个规则:

  1. 所有属性都需要用 Vue.set(rootObject, key, value) 设置(例如 mounted() { this.$set(this, 'bar', 'two') } - this.$set()Vue.set() 的别名)。在这里阅读:Vue Doku

  2. 数组需要填充 native 数组属性( Array.prototype.push() 等)。按索引设置数组元素不会使这些元素具有反应性。 注意: Vue.set(rootArray, 1, value)也不起作用 - 因为它通过索引设置元素。在这里阅读更多相关信息:Vue Gotchas

关于javascript - Vue 子组件不会因 Prop 更改而更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58000035/

相关文章:

javascript - HTML 5 文件 API

javascript - AngularJS 手动引导模块

javascript - 为什么在我的 View 中看不到我的总计?

javascript - 如何使用组件和 v-bind 过滤 Vue 中的帖子 :class

c# - WinForms 数据绑定(bind)

c# - 无法从 WPF 中的集合绑定(bind)模型的 DependcyProperty

javascript - 检查输入项值的 DIV 在 jQuery 中不为空

javascript - Android 在 WebView 中调用 API <= 18 的 JavaScript 函数

javascript - 使用vue webpack-simple解析css失败

c# - 是否有用于将控件绑定(bind)到异步数据的明确定义的模式?