javascript - Vue动态添加不同组件

标签 javascript vue.js components

我想用 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/

相关文章:

javascript - 跨组件发送多个 Prop React

delphi - 嵌套在 Delphi 框架中的私有(private)组件字段

javascript - 按标签过滤对象(对象数组中的数组)

javascript - 如何使用 webpack 在没有 npm 依赖项的情况下捆绑库?

javascript - vue js 中的自定义图像 slider

vue.js - Nuxt.js 找不到组件,错误为 "Failed to mount component: template or render function not defined."

javascript - Kentico:使用 ajax 让一个 Web 部件重新加载第二个 Web 部件

javascript - 如何创建 ViewModel 事件模式

javascript - Vue js - 将 Prop 定义为特定类型

javascript - 如何在 React 中定位 DOM 元素列表