# 表单项目组件(formItem)

我们对表单输入组件进行了封装,以方便快速生成和制作表单。
本组件不同于baInput,本组件是使用el-form-item内嵌了baInput实现的。

温馨提示

el-form内可以同时存在el-form-itemFormItemba-input等输入组件,而且FormItem多数情况就是渲染的el-form-item

# 可用属性

本组件继承于el-form-item (opens new window),它的所有属性可以直接用于本组件。

属性名 注释
type 输入框类型(下面介绍的类型之一),必填
v-model 双向绑定值,必填
inputAttr 输入框的附加属性,根据输入框类型,可以设置的附加属性不一样(如string类型使用了el-input,则此处可以附加el-input的所有属性,同baInput (opens new window)的attr)
blockHelp 块级输入帮助信息
tip 输入提示信息,功能类似blockHelp,但渲染方式不同,可以传递stringobject,传递的object应为el-tooltip的属性列表
placeholder 输入框的placeholder,相当于inputAttr.placeholder的别名
attr v2.1.0 起 attr 可直接作为 props 传递,无需使用 props.attr 的语法,需要附加到内部el-form-item组件上的额外属性
data v2.1.0 起 data 部分可直接使用 inputAttr 代替,额外数据,比如输入类型:单选框、复选框的选项,城市选择器的区域等级配置等

# 输入框类型

类型名 注释 内部输入组件,点击链接可查以上inputAttr可用属性
string 字符串 el-input (opens new window)
password 密码 el-input (opens new window)
number 数字 el-input (opens new window),使用v-model.number="val"绑定值
radio 单选框组 el-radio-group (opens new window) 使用inputAttr.borderinputAttr.button可直接将更加内部的el-radio渲染为不同的样式,其他的el-radio属性需要使用inputAttr.childrenAttr修改,比如inputAttr.childrenAttr.disabled
checkbox 复选框组 el-checkbox-group (opens new window) 使用inputAttr.borderinputAttr.button可直接将更加内部的el-checkbox渲染为不同的样式,其他的el-checkbox属性需要使用inputAttr.childrenAttr修改,比如inputAttr.childrenAttr.disabled
switch 开关 el-switch (opens new window)
textarea 多行文本 el-input (opens new window)
array 数组 ba-array (opens new window) /@/components/baInput/components/array.vue
datetime 时间日期选择 el-date-picker (opens new window)
year 年份选择 el-date-picker (opens new window)
date 日期选择 el-date-picker (opens new window)
time 时间选择 el-time-picker (opens new window)
select 下拉选择框-单选 el-select (opens new window)
selects 下拉选择框-多选 el-select (opens new window)
remoteSelect 远程下拉选择框 ba-remote-select (opens new window) /@/components/baInput/components/remoteSelect.vue
editor 富文本编辑器 ba-editor (opens new window) /@/components/editor/index.vue
city 城市选择器 el-cascader (opens new window)
image 图片上传 ba-upload (opens new window)
images 图片上传-多图 ba-upload (opens new window)
file 文件上传 ba-upload (opens new window)
files 文件上传-多文件 ba-upload (opens new window)
icon 图标选择器 ba-icon-selector (opens new window) /@/components/baInput/components/iconSelector.vue参:字体图标选择器 (opens new window)
color 颜色选择器 el-color-picker (opens new window)

# 示例代码

<template>
    <el-scrollbar height="96vh">
        <el-form class="form-box" :model="items" label-width="120px" label-position="right">
            
            <!-- 以下四种输入框使用了 el-input -->
            <!-- input-attr 属性演示了如何添加 el-input 组件原有的属性 -->
            <FormItem
                label="string"
                type="string"
                v-model="items.string"
                :input-attr="{
                    maxlength: 10,
                    clearable: true,
                    // 事件以on开头,并使用大写驼峰的事件名称定义
                    onChange: onChangeString,
                    // 若需使用 $event 可以用此语法,index 是可以额外为函数传递的参数
                    onChange: ($event: string) => onChangeString($event, index),
                }"
                placeholder="Placeholder"
            />
            <FormItem
                label="password"
                type="password"
                v-model="items.password"
                :input-attr="{ maxlength: 10, clearable: true, showPassword: true }"
            />
            <FormItem label="number" type="number" v-model.number="items.number" :input-attr="{ clearable: true, size: 'large' }" />
            <FormItem label="textarea" type="textarea" v-model="items.textarea" :input-attr="{ showWordLimit: true, maxlength: 30, rows: 3 }" />

            <!-- 同时使用了 el-radio-group 和 el-radio -->
            <!-- 通过 data.content 配置了`选项`数据 -->
            <!-- 通过 attr 设置了el-radio-group 的 size 属性 -->
            <!-- 通过 data.childrenAttr 设置了 el-radio 的 border 属性 -->
            <FormItem
                label="radio"
                type="radio"
                v-model="items.radio"
                :input-attr="{ size: 'large' }"
                :data="{ childrenAttr: { border: true }, content: { a: '选项a', b: '选项b' } }"
            />

            <!-- 框架版本大于 v2.1.0 时,以上 radio 可以更简单,一股脑放到 input-attr 即可 -->
            <!-- 请注意 border 属性,它将被自动展开到 childrenAttr(属性附加给更内部的 el-radio),相似的还有一个 button 属性,可将 radio 渲染为按钮 -->
            <FormItem
                label="radio"
                type="radio"
                v-model="items.radio"
                :input-attr="{ size: 'large', border: true, content: { a: '选项a', b: '选项b' } }"
            />

            <!-- 同时使用了 el-checkbox-group 和 el-checkbox -->
            <!-- 本类型类似于 radio 只是它的绑定值是一个数组 -->
            <FormItem
                label="checkbox"
                type="checkbox"
                v-model="items.checkbox"
                :input-attr="{ size: 'large' }"
                :data="{ childrenAttr: { border: true }, content: { '0': '选项a', '1': '选项b' } }"
            />

            <!-- 框架版本大于 v2.1.0 时,以上 checkbox 可以更简单,一股脑放到 input-attr 即可 -->
            <FormItem
                label="checkbox"
                type="checkbox"
                v-model="items.checkbox"
                :input-attr="{ size: 'large', border: true, content: { '0': '选项a', '1': '选项b' } }"
            />

            <!-- 使用了 el-switch -->
            <FormItem label="switch" type="switch" v-model="items.switch" :input-attr="{ size: 'large' }" />

            <!-- 使用了自定义组件 /@/components/baInput/components/array.vue -->
            <FormItem label="array" type="array" v-model="items.array" />

            <!-- 以下三种输入框使用了 el-date-picker -->
            <FormItem label="datetime" type="datetime" v-model="items.datetime" />
            <FormItem label="year" type="year" v-model="items.year" />
            <FormItem label="date" type="date" v-model="items.date" />

            <!-- 使用了 el-time-picker -->
            <FormItem label="time" type="time" v-model="items.time" />

            <!-- 以下两种输入框使用了 el-select -->
            <FormItem label="select" type="select" v-model="items.select" :data="{ content: { '0': '选项0', '1': '选项1' } }" />
            <FormItem label="selects" type="selects" v-model="items.selects" :data="{ content: { '0': '选项0', '1': '选项1', '2': '选项2' } }" />

            <!-- 使用了自定义组件 /@/components/baInput/components/remoteSelect.vue -->
            <!-- 使用时,请确保pk(主键),field(字段),remote-url(api地址)配置正确 -->
            <FormItem
                label="remoteSelect"
                type="remoteSelect"
                v-model="items.remoteSelect"
                :input-attr="{
                    multiple: false,
                    pk: 'user.id',
                    field: 'nickname',
                    'remote-url': userUser + 'index',
                }"
                placeholder="点击选择远程数据-单选"
            />
            <FormItem
                label="remoteSelect"
                type="remoteSelect"
                v-model="items.remoteSelects"
                :input-attr="{
                    multiple: true,
                    pk: 'user.id',
                    field: 'nickname',
                    'remote-url': userUser + 'index',
                    placeholder: '点击选择远程数据-多选',
                }"
            />

            <!-- 使用了 el-cascader -->
            <FormItem label="city" type="city" v-model="items.city" />

            <!-- 以下四种输入框使用了 el-upload -->
            <!-- images 和 files 可以绑定数组类型的值 -->
            <FormItem label="image" type="image" v-model="items.image" />
            <FormItem label="images" type="images" v-model="items.images" />
            <FormItem label="file" type="file" v-model="items.file" />
            <FormItem label="files" type="files" v-model="items.files" />

            <!-- 使用了自定义组件 /@/components/editor/index.vue -->
            <FormItem label="editor" type="editor" v-model="items.editor" />

            <!-- 使用了自定义组件 /@/components/baInput/components/iconSelector.vue -->
            <!-- 具体使用请参考`字体图标` -->
            <FormItem label="icon" type="icon" v-model="items.icon" :input-attr="{ placement: 'top', 'show-icon-name': true }" />
        </el-form>
    </el-scrollbar>
</template>

<script setup lang="ts">
import { reactive } from 'vue'
import FormItem from '/@/components/formItem/index.vue'
import { userUser } from '/@/api/controllerUrls'

const items = reactive({
    string: '',
    password: '',
    number: 1,
    textarea: '',
    radio: 'a',
    checkbox: ['0', '1'],
    switch: 1,
    array: [{ key: '这里是key', value: '这里是Value' }],
    datetime: '',
    year: '',
    date: '',
    time: '',
    select: '0',
    selects: ['0', '1'],
    remoteSelect: '1',
    remoteSelects: ['1'],
    editor: '<p>默认内容</p>',
    city: '',
    image: 'http://localhost:1818/src/assets/logo.png',
    images: 'http://localhost:1818/src/assets/logo.png',
    file: 'http://localhost:1818/src/assets/logo.png',
    files: 'http://localhost:1818/src/assets/logo.png',
    icon: 'el-icon-Apple',
})
</script>

<style scoped lang="scss">
.form-box {
    width: 80vw;
    height: 96vh;
    margin: 40px auto;
}
</style>