从子组件 Vue 更新父模型

新手上路,请多包涵

我有一个非常小的应用程序,它有一个捐赠表格。该表单将引导用户完成填写信息的步骤。我有一个主要组件,它是表单包装器和包含所有表单数据(模型)的主 Vue 实例。所有子组件都是捐赠过程中的步骤。每个子组件都有要填写的输入字段,这些字段将更新父模型,以便我在提交表单时拥有父模型中的所有表单数据。以下是组件的组合方式:

 <donation-form></donation-form> // Main/Parent component

donation-form 组件内部:

 <template>
    <form action="/" id="give">
        <div id="inner-form-wrapper" :class="sliderClass">
            <step1></step1>
            <step2></step2>
            <step3></step3>
        </div>
        <nav-buttons></nav-buttons>
    </form>
</template>

现在,我正在从每个子组件中的输入设置数据,然后我有一个 watch 方法正在监视要更新的字段,然后我将它们推送到 $root 通过做这个…

 watch: {
    amount() {
        this.$root.donation.amount = this.amount;
    }
}

问题是我的步骤之一是我有很多字段,而且我似乎正在编写一些重复的代码。另外,我确信这不是最好的方法。

我尝试将数据作为 prop 传递给我的子组件,但似乎我无法更改子组件中的道具。

除了为我的子组件中的每个值添加监视之外,还有什么更好的方法来更新根实例甚至父实例?

更多示例 这是我的 step2.vue 文件-step2 vue文件 这是我的 donation-form.vue 文件- 捐赠形式vue文件

原文由 dericcain 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 589
2 个回答

您可以使用 自定义事件 将数据发回。

要使用自定义事件,您的数据应该在父组件中,并作为道具传递给子组件:

 <step1 :someValue="value" />

现在你想从孩子那里接收更新的数据,所以给它添加一个事件:

 <step1 :someValue="value" @update="onStep1Update" />

您的子组件将发出事件并将数据作为参数传递:

 this.$emit('update', newData)

父组件:

 methods: {
  onStep1Update (newData) {
    this.value = newData
  }
}

这是一个带有自定义事件的简单示例:

http://codepen.io/CodinCat/pen/QdKKBa?editors=1010


如果所有的 step1、step2 和 step3 都包含大量的字段和数据,您可以将这些数据封装在子组件中(如果父组件不关心这些行数据)。

所以每个孩子都有自己的数据并与 <input /> 绑定

<input v-model="data1" />
<input v-model="data2" />

但同样,您将通过事件将结果数据发回。

 const result = this.data1 * 10 + this.data2 * 5
this.$emit('update', result)

(同样,如果您的应用程序变得越来越复杂,vuex 将是解决方案。

原文由 CodinCat 发布,翻译遵循 CC BY-SA 4.0 许可协议

就个人而言,我更喜欢在使用表单时使用通用函数来更新父级,而不是为每个孩子编写一个方法。为了说明——有点浓缩——像这样在父级中:

 <template lang="pug">
  child-component(:field="form.name" fieldname="name" @update="sync")
</template>
<script>
export default {
  methods: {
    sync: function(args) {
      this.form[args.field] = args.value
    }
  }
}
</script>

在子组件中:

 <template lang="pug">
  input(@input="refresh($event.target.value)")
</template>
<script>
export default {
  props: ['field', 'fieldname'],
  methods: {
    refresh: function(value) {
      this.$emit('update', {'value': value, 'field': this.fieldname});
    }
  }
}
</script>

原文由 jensmtg 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题