如何创建可重用的表单 Vue 组件

Rob*_*blo 5 vue-component vuejs2

假设我想创建一个联系表单。在此联系表单中,用户可以有多个地址。我认为这是使用 Vue 组件的绝佳机会,这样我就不必创建多余的地址表单字段。然后我就可以在网站的不同区域使用这个组件,比如编辑、创建等......

我将如何创建一个父级可以使用的表单组件并将该表单中的值添加到地址数组中?此外,如果正在编辑此表单,我希望能够使用现有值填充此表单。

我尝试过不同的东西,但我尝试过的任何东西似乎都不起作用。有任何想法吗?我已经搜索过 Stack 和 Google,但没有找到答案。

这是我正在尝试完成的一些起始代码(粗略示例)。当然,我会允许用户在创建/编辑时动态添加多个地址,但我也会在编辑表单时循环遍历地址数据以显示每个地址组件,但这只是一个快速的非工作设置来理解我的观点穿过。

地址组件.vue

<template>
<div>
    <h4>Address</h4>
    <label>Address</label>
    <input type="text" v-model="address">

    <label>City</label>
    <input type="text" v-model="city">

    <label>State</label>
    <input type="text" v-model="state">
</div>
</template>
<script>
export default {
    data() {
        return {
            address: null,
            city: null,
            state: null
        }
    }
 }
</script>
Run Code Online (Sandbox Code Playgroud)

联系表格.vue

<template>
    <h1>My Contact Form</h1>
    <form>
        <AddressComponent></AddressComponent> // Addresses[0]
        <AddressComponent></AddressComponent> // Addresses[1]
    </form>
</template>
<script>
import AddressComponent from '../components/AddressComponent'

export default {
    components: {AddressComponent},
    data() {
        return {
            addresses: [],
        }
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

Law*_*one 4

也许是这样的,传入数据,然后将更改发送回父级。

Vue.component('address-component', {
  template: '#address',
  props: ['data', 'index'],
  data() {
    return {
      item: {
        address: this.data.address,
        city: this.data.city,
        state: this.data.state
      }
    }
  },
  methods: {
    inputOccurred() {
      this.$emit('on-change', this.item, this.index)
    }
  }
});

//
var vm = new Vue({
  el: '#app',
  data() {
    return {
      addresses: [{
          address: '1 Stackoverflow Way',
          city: 'San Fran',
          state: 'California'
        },
        {
          address: '2 Stackoverflow Way',
          city: 'San Fran',
          state: 'California'
        }
      ]
    }
  },
  methods: {
    setAddress(value, index) {
      this.$set(this.addresses, index, value);
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.14/vue.min.js"></script>

<div id="app">
  <h1>My Contact Form</h1>

  <address-component 
    v-for="(address, index) in addresses" 
    :data="address" 
    :index="index"
    :key="index"
    @on-change="setAddress"
  ></address-component>

  <pre>{{ addresses }}</pre>
</div>

<template id="address">
   <div>
     <h4>Address</h4>
     <label>Address</label>
     <input type="text" v-model="item.address" @input="inputOccurred"/>

     <label>City</label>
     <input type="text" v-model="item.city" @input="inputOccurred"/>

     <label>State</label>
     <input type="text" v-model="item.state" @input="inputOccurred"/>
   </div>
</template>
Run Code Online (Sandbox Code Playgroud)