我正在尝试使用Vue.js构建可重复使用的组件,以处理通过AJAX提交表单的问题。理想情况下,我想要一个通用组件,可以用来替换HTML的
以下是我为名为
在我的HTML中,我会有以下内容:
如果我要在HTML组件中添加另一个字段,我期望它也映射到Vue实例的
form
元素,其中可能包含一组未知的表单元素,如input
、select
、textarea
等。以下是我为名为
ajax-form
的组件编写的代码:<template>
<form class="form" :action="action" :method="method" v-on:submit.prevent="ajaxSubmit">
<slot></slot>
</form>
</template>
<script>
module.exports = {
props: {
action: {
required: true,
type: String
},
method: {
default: 'post',
required: false,
type: String
}
},
data() {
return {
formData: {}
}
},
methods: {
ajaxSubmit() {
// Do ajax
}
}
}
</script>
在我的HTML中,我会有以下内容:
而在我的HTML中,我会有类似以下的内容:
<ajax-form action="http://example.com/do/something">
<input name="first_name" type="text">
<textarea name="about_you"></textarea>
</ajax-form>
我希望发生的理想情况是,我在组件内使用插槽放置所有表单元素,这些元素应该被映射到Vue组件实例中的data.formData
属性。因此,在这种情况下,data
属性看起来像:
data: {
formData: {
first_name: '',
about: ''
}
}
如果我要在HTML组件中添加另一个字段,我期望它也映射到Vue实例的
data
属性中。 是否有办法做到这一点?是否有一种方法可以告诉Vue,在通过插槽将我的表单元素放入组件时,我希望该元素映射到组件的data
中的某个内容? 我已经尝试为每个表单元素添加v-model
和v-bind
,以查看是否可以将数据传递给组件的数据:<ajax-form action="http://example.com/do/something">
<input name="first_name" type="text" v-model="formData.first_name">
</ajax-form>
然而,Vue 抱怨在模板中使用响应式数据属性之前必须声明它们:
[Vue 警告]: 实例上没有定义 "formData" 属性或方法,但是在渲染时引用了它。请确保在 data 选项中声明响应式数据属性。
mounted
方法(https://vuejs.org/v2/api/#mounted)获取到 Vue 创建的 DOM 元素的引用,然后通过迭代它的子元素(使用 jQuery?),并通过Vue.set
(https://vuejs.org/v2/api/#Vue-set)向this.data
添加响应式属性。 - PatrickSteeledata
项目之间创建反应绑定。您的建议假设我提前知道数据等内容。 - Jonathon