使用 VueJs 更改子组件中对象的属性

xge*_*86x 6 vue.js vuejs2

我有一个简单的问题,但我找不到答案。这段代码(属于子组件?是一个好习惯吗?

 export default {
  name: 'Wish',
  props: ['wish'],
  data () {
    return {
      isEditing: false
    }
  },
  methods: {
    completeWish () {
      this.wish.done = true
    },
   ...
Run Code Online (Sandbox Code Playgroud)

或者我应该使用emit更新父级中wish对象的done属性?

谢谢

kli*_*mat 9

正如 Amade 所说,这是一种不好的做法。

您应该使用事件以便从设计的角度正确地完成它。

<script>
  export default {
    name: 'Wish',
    props: ['wish'],
    methods: {
      completeWish () {
        this.$emit('wish-is-completed')
      }
    }
  }
</script>
Run Code Online (Sandbox Code Playgroud)

然后在父母你有v-on:wish-is-completed="handleCompletedWish"喜欢:

// Parent template
<template>
  <wish v-on:wish-is-completed="handleCompletedWish"></wish>
</template>
Run Code Online (Sandbox Code Playgroud)

编辑:

我知道答案被否决了,因为您实际上能够改变道具的属性(不是直接的道具参考)并且在您这样做时不会收到警告

这是否意味着你应该这样做?

不。

道具是为单向数据流目的而创建的。当你改变 props 来通知父级某事时,它很快导致难以维护状态更改,因为它们不是隐式的。在这种情况下,按照官方文档的建议,将事件用于 child->parent 通信。

所有的 props 在子属性和父属性之间形成一种单向向下绑定:当父属性更新时,它会向下流到子属性,而不是相反。这可以防止子组件意外改变父组件的状态,这会使您的应用程序的数据流更难以理解。

  • “它很快就会导致难以维持状态变化”。我一直在到处阅读这篇文章,但有人能提供一个导致问题的实际例子吗?我还没有遇到过一个。 (2认同)

小智 0

文档

由于现代 JavaScript 的限制(以及 Object.observe 的废弃),Vue 无法检测属性添加或删除。由于 Vue 在实例初始化期间执行 getter/setter 转换过程,因此数据对象中必须存在一个属性,以便 Vue 对其进行转换并使其具有反应性

如果你想添加或更改属性,请使用Vue.set,如下所示:

this.$set(this.wish, 'done', true)
Run Code Online (Sandbox Code Playgroud)

请参阅示例应用程序: https ://3xyx386q65.codesandbox.io/setProps

请参阅示例代码(打开Components/setProps/childComponent.vue): https: //codesandbox.io/s/3xyx386q65

笔记! wish初始化为对象!请参阅示例代码中的Components/setProps/setProps.vue