Skip to content

DrawerForm 抽屉表单组件

右侧滑出式表单配置面板,结合抽屉和表单功能的组件。

基础用法

vue
<template>
  <button @click="showDrawer = true">打开配置面板</button>
  
  <x-drawer-form
    v-model="showDrawer"
    :title="'用户配置'"
    :size="'400px'"
    :fields="fields"
    :form-data="formData"
    :show-confirm="true"
    :show-cancel="true"
    @confirm="handleConfirm"
    @cancel="handleCancel"
    @close="handleClose"
    @field-change="handleFieldChange"
  />
</template>

<script setup>
import { ref } from 'vue'
import { DrawerForm } from '@xto/feedback'

const showDrawer = ref(false)

const fields = [
  {
    name: 'username',
    label: '用户名',
    type: 'input',
    required: true,
    placeholder: '请输入用户名'
  },
  {
    name: 'email',
    label: '邮箱',
    type: 'input',
    required: true,
    placeholder: '请输入邮箱',
    rules: [
      { type: 'email', message: '请输入有效的邮箱地址' }
    ]
  },
  {
    name: 'role',
    label: '角色',
    type: 'select',
    options: [
      { label: '管理员', value: 'admin' },
      { label: '普通用户', value: 'user' }
    ]
  },
  {
    name: 'enabled',
    label: '启用状态',
    type: 'switch'
  },
  {
    name: 'description',
    label: '描述',
    type: 'textarea',
    placeholder: '请输入描述'
  }
]

const formData = ref({
  username: '张三',
  email: 'zhangsan@example.com',
  role: 'user',
  enabled: true
})

const handleConfirm = (data) => {
  console.log('确认数据:', data)
}

const handleCancel = () => {
  console.log('取消操作')
}

const handleClose = () => {
  console.log('关闭抽屉')
}

const handleFieldChange = (name, value) => {
  console.log('字段变化:', name, value)
}
</script>

字段类型

支持多种表单字段类型。

vue
<template>
  <x-drawer-form v-model="showDrawer" :fields="fields" />
</template>

<script setup>
const fields = [
  // 单行文本
  { name: 'inputField', label: '单行文本', type: 'input' },
  
  // 文本域
  { name: 'textareaField', label: '文本域', type: 'textarea' },
  
  // 数字输入
  { name: 'numberField', label: '数字', type: 'number' },
  
  // 下拉选择
  { name: 'selectField', label: '下拉选择', type: 'select', options: [...] },
  
  // 开关
  { name: 'switchField', label: '开关', type: 'switch' },
  
  // 日期
  { name: 'dateField', label: '日期', type: 'date' },
  
  // 文件
  { name: 'fileField', label: '文件', type: 'file' }
]
</script>

表单验证

vue
<template>
  <x-drawer-form :fields="fields" @confirm="handleConfirm" />
</template>

<script setup>
const fields = [
  {
    name: 'username',
    label: '用户名',
    type: 'input',
    required: true  // 必填验证
  },
  {
    name: 'email',
    label: '邮箱',
    type: 'input',
    rules: [
      { type: 'email', message: '请输入有效的邮箱地址' },
      { type: 'minLength', min: 5, message: '邮箱长度不能小于5' }
    ]
  }
]
</script>

抽屉宽度

vue
<template>
  <!-- 固定宽度 -->
  <x-drawer-form :size="'500px'" />
  
  <!-- 百分比宽度 -->
  <x-drawer-form :size="'30%'" />
  
  <!-- 数字宽度 -->
  <x-drawer-form :size="600" />
</template>

禁用状态

vue
<template>
  <x-drawer-form :disabled="true" :fields="fields" />
</template>

关闭时销毁

vue
<template>
  <x-drawer-form :destroy-on-close="true" />
</template>

API

Props

属性说明类型默认值
modelValue是否显示booleanfalse
title抽屉标题string'配置'
size抽屉宽度string | number'400px'
fields表单字段FormField[][]
formData表单数据Record<string, any>{}
showConfirm是否显示确认按钮booleantrue
showCancel是否显示取消按钮booleantrue
confirmText确认按钮文本string'确认'
cancelText取消按钮文本string'取消'
disabled是否禁用表单booleanfalse
destroyOnClose是否在关闭时销毁内容booleanfalse

FormField

属性说明类型
name字段名称string
label字段标签string
type字段类型'input' | 'textarea' | 'select' | 'number' | 'switch' | 'date' | 'file'
required是否必填boolean
disabled是否禁用boolean
placeholder占位文本string
options下拉选项Array<{ label: string; value: any }>
rules验证规则Array<{ type: string; message: string }>

Events

事件名说明
update:modelValue显示状态变化时触发
confirm确认时触发
cancel取消时触发
close关闭时触发
field-change字段值变化时触发

基于 MIT 许可发布