我想用 Vue 创建一个简单的表单生成器,用户可以在其中单击菜单中的按钮以向表单添加不同的表单字段。我知道,如果只添加一种类型的表单字段,我可以用这样的方法 (https://jsfiddle.net/u6j1uc3u/32/):
<div id="app">
<form-input v-for="field in fields"></form-input>
<button type="button" v-on:click="addFormElement()">Add Form Element</button>
</div>
<script type="x-template" id="form-input">
<div>
<label>Text</label>
<input type="text" />
</div>
</script>
和:
Vue.component('form-input', {
template: '#form-input'
});
new Vue({
el: '#app',
data: {
fields: [],
count: 0
},
methods: {
addFormElement: function() {
this.fields.push({type: 'text', placeholder: 'Textbox ' + (++this.count)});
}
}
})
但是如果有不止一种类型的表单字段(输入、文件、选择等)怎么办?我在想也许可以为每种类型构建不同的组件,但我如何在单个表单元素列表中显示多种类型的组件?
我可以根据 fields
数组中的数据创建一个包含不同类型子组件的组件吗?
或者是否有更好的方法来解决我所缺少的这种情况?我刚刚开始学习 Vue,非常感谢任何帮助!
最佳答案
好的,所以我研究了动态元素并设法将其组合在一起:
Vue.component('form-input', {
template: '#form-input'
});
Vue.component('form-select', {
template: '#form-select'
});
Vue.component('form-textarea', {
template: '#form-textarea'
});
new Vue({
el: '#app',
data: {
fields: [],
count: 0
},
methods: {
addFormElement: function(type) {
this.fields.push({
'type': type,
id: this.count++
});
}
}
})
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
<div id="app">
<component v-for="field in fields" v-bind:is="field.type" :key="field.id"></component>
<button type="button" v-on:click="addFormElement('form-input')">Add Textbox</button>
<button type="button" v-on:click="addFormElement('form-select')">Add Select</button>
<button type="button" v-on:click="addFormElement('form-textarea')">Add Textarea</button>
</div>
<script type="x-template" id="form-input">
<div>
<label>Text</label>
<input type="text" />
</div>
</script>
<script type="x-template" id="form-select">
<div>
<label>Select</label>
<select>
<option>Option 1</option>
<option>Option 2</option>
</select>
</div>
</script>
<script type="x-template" id="form-textarea">
<div>
<label>Textarea</label>
<textarea></textarea>
</div>
</script>
因此,我不是为 fields
数组中的每个项目创建一个新的 form-input
组件,而是创建一个新的 component
通过字段的 type
属性与正确的组件相关联
关于javascript - Vue动态添加不同组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50418651/