Skip to content

xtf-form-array

组件说明

xtf-form-array 是表单数组组件,用于管理动态增减的表单字段组。配合 xtf-form 使用,支持添加/删除/复制项、最大/最小数量限制和行级错误收集,适用于多地址录入、多联系人和动态表单项等场景。


基础用法

1. 动态表单组

通过 v-model 绑定数组数据,通过 template 设置新增项模板:

vue
<template>
  <xtf-form :model="formData" label-width="160">
    <xtf-form-array
      v-model="formData.contacts"
      title="联系人"
      :template="itemTemplate"
      :max-items="5"
    >
      <template #default="{ item, index }">
        <xtf-form-item :label="'姓名' + (index + 1)">
          <xtf-input v-model="item.name" placeholder="请输入姓名" />
        </xtf-form-item>
        <xtf-form-item :label="'电话' + (index + 1)">
          <xtf-input v-model="item.phone" type="number" placeholder="请输入电话" />
        </xtf-form-item>
      </template>
    </xtf-form-array>
  </xtf-form>
</template>

<script>
export default {
  data() {
    return {
      formData: { contacts: [{ name: '', phone: '' }] },
      itemTemplate: { name: '', phone: '' }
    }
  }
}
</script>

2. 可复制项

通过 copyable 启用复制功能:

vue
<template>
  <xtf-form :model="formData" label-width="160">
    <xtf-form-array v-model="formData.addresses" title="地址" copyable :template="addrTemplate">
      <template #default="{ item, index }">
        <xtf-form-item :label="'地址' + (index + 1)">
          <xtf-input v-model="item.address" placeholder="请输入地址" />
        </xtf-form-item>
      </template>
    </xtf-form-array>
  </xtf-form>
</template>

<script>
export default {
  data() {
    return {
      formData: { addresses: [{ address: '' }] },
      addrTemplate: { address: '' }
    }
  }
}
</script>

3. 自定义行操作与事件

插槽可调用组件提供的增删函数,并监听所有数组变化事件:

vue
<template>
  <xtf-form-array
    v-model="items"
    title="收货人"
    :template="template"
    copyable
    show-indexes
    @input="onInput"
    @change="onChange"
    @add="onAdd"
    @remove="onRemove"
  >
    <template #default="{ item, index, moveUp, moveDown }">
      <xtf-input v-model="item.name" :placeholder="'收货人' + (index + 1)" />
      <xtf-button label="上移" size="xs" @click="moveUp" />
      <xtf-button label="下移" size="xs" @click="moveDown" />
    </template>
  </xtf-form-array>
</template>

<script>
export default {
  data() {
    return { items: [{ name: '张三' }], template: { name: '' } }
  },
  methods: {
    onInput(value) {
      console.log('input', value)
    },
    onChange(value) {
      console.log('change', value)
    },
    onAdd(payload) {
      console.log('add', payload)
    },
    onRemove(payload) {
      console.log('remove', payload)
    }
  }
}
</script>

全部属性

属性类型默认值作用描述适用范围
valueArray[]数组数据双向绑定
nameString''字段名数据绑定
titleString''标题标题
minItemsString | Number0最小项数数量限制
maxItemsString | Number0最大项数。内部限制逻辑将 0 解析为不限;但模板仅在值不是数值时显示添加按钮,因此数值 0(如 :max-items="0")会隐藏添加按钮,省略该属性或传字符串 '0' 可显示不限添加按钮数量限制
removableBooleantrue是否可删除删除
addableBooleantrue是否可添加添加
copyableBooleanfalse是否可复制复制
addButtonTextString''添加按钮文字按钮
templateObject{}新增项模板模板
showIndexesBooleanfalse是否显示索引指示器索引
itemKeyString'_faKey'每项的内部稳定键字段名自定义数据键
disabledBooleanfalse是否禁用禁用
customClassString''自定义类名样式覆盖
customStyleString | Object''自定义样式动态样式覆盖

事件

事件名称触发时机回调参数参数说明
input数据变化时触发(items: Array)用于 Vue 2 v-model 的当前数组
change数据变化时触发(items: Array)当前数组
add添加项时触发({ item, index, items })新增项信息
remove删除项时触发({ item, index, items })删除项信息

插槽

插槽名称说明
default每一项内容
title自定义标题
add-btn自定义添加按钮
actions自定义行操作按钮

主题说明

  • 添加按钮使用 xtf-button 组件
  • 复制/删除按钮使用 xtf-button 组件
  • 标题使用 xtf-text 组件
  • 通过 inject 获取 xtf-form 的配置

如需全局调整主题,请在 xtf-config-provider 或主题配置中覆盖相关 CSS 变量。

MIT Licensed