Skip to content

DynamicFields 动态表单字段组件

支持动态添加、删除、排序表单字段的组件。

基础用法

暂无字段配置
vue
<template>
  <x-dynamic-fields
    :fields="fields"
    :editable="true"
    :show-sort="true"
    :max-fields="20"
    @update:fields="handleUpdate"
    @add="handleAdd"
    @remove="handleRemove"
    @sort="handleSort"
    @update="handleFieldUpdate"
  />
</template>

<script setup>
import { ref } from 'vue'
import { DynamicFields } from '@xto/form'

const fields = ref([
  {
    id: '1',
    name: 'username',
    label: '用户名',
    type: 'input',
    required: true,
    placeholder: '请输入用户名',
    order: 0
  },
  {
    id: '2',
    name: 'email',
    label: '邮箱',
    type: 'input',
    required: true,
    placeholder: '请输入邮箱',
    order: 1
  },
  {
    id: '3',
    name: 'role',
    label: '角色',
    type: 'select',
    options: [
      { label: '管理员', value: 'admin' },
      { label: '普通用户', value: 'user' }
    ],
    order: 2
  }
])

const handleUpdate = (updatedFields) => {
  fields.value = updatedFields
}

const handleAdd = (field) => {
  console.log('添加字段:', field)
}

const handleRemove = (fieldId) => {
  console.log('删除字段:', fieldId)
}

const handleSort = (sortedFields) => {
  console.log('排序字段:', sortedFields)
}

const handleFieldUpdate = (fieldId, field) => {
  console.log('更新字段:', fieldId, field)
}
</script>

字段类型

支持多种字段类型。

暂无字段配置
vue
<script setup>
const availableTypes = [
  { label: '单行文本', value: 'input' },
  { label: '文本域', value: 'textarea' },
  { label: '数字', value: 'number' },
  { label: '下拉选择', value: 'select' },
  { label: '开关', value: 'switch' },
  { label: '日期', value: 'date' },
  { label: '文件', value: 'file' }
]
</script>

添加字段

组件顶部提供添加字段功能。

vue
<template>
  <x-dynamic-fields
    :fields="fields"
    :available-types="availableTypes"
    @add="handleAdd"
  />
</template>

<script setup>
// 自定义可用类型
const availableTypes = [
  { label: '文本输入', value: 'input' },
  { label: '多行文本', value: 'textarea' },
  { label: '选择器', value: 'select' }
]
</script>

字段排序

暂无字段配置
vue
<template>
  <x-dynamic-fields :fields="fields" :show-sort="true" @sort="handleSort" />
</template>

限制字段数量

vue
<template>
  <x-dynamic-fields :max-fields="10" />
</template>

禁用编辑

暂无字段配置
vue
<template>
  <!-- 只读模式,无法添加、删除、编辑 -->
  <x-dynamic-fields :fields="fields" :editable="false" />
</template>

空状态

暂无字段配置
vue
<template>
  <x-dynamic-fields :fields="[]" />
</template>

API

Props

属性说明类型默认值
fields字段列表DynamicField[][]
editable是否可编辑booleantrue
showSort是否显示排序按钮booleantrue
maxFields最大字段数number20
availableTypes可用的字段类型Array<{ label: string; value: string }>见下方

默认 availableTypes

javascript
[
  { label: '单行文本', value: 'input' },
  { label: '文本域', value: 'textarea' },
  { label: '数字', value: 'number' },
  { label: '下拉选择', value: 'select' },
  { label: '开关', value: 'switch' },
  { label: '日期', value: 'date' },
  { label: '文件', value: 'file' }
]

DynamicField

属性说明类型
id字段唯一标识string
name字段名称(变量名)string
label字段标签(显示名)string
type字段类型'input' | 'textarea' | 'select' | 'number' | 'switch' | 'date' | 'file'
required是否必填boolean
defaultValue默认值any
placeholder占位文本string
options下拉选项Array<{ label: string; value: any }>
order排序序号number

Events

事件名说明
update:fields字段列表变化时触发
add添加字段时触发
remove删除字段时触发
sort字段排序时触发
update更新单个字段时触发

基于 MIT 许可发布