Skip to content

输入组件(baInput)

除了 element plus 提供的各种输入组件外,BuildAdmin 系统还内置了以下输入组件。

数组组件

属性

属性名说明类型默认值
keyTitle键名标题string键名
valueTitle键值标题string键值
model-value / v-model绑定值array

使用示例

vue
<template>
    <div>
        <FormItem label="array" type="array" v-model="state.array" />

        <FormItem
            label="array"
            type="array"
            v-model="state.array"
            :input-attr="{
                keyTitle: '名称',
                valueTitle: '位置',
            }"
        />
    </div>
</template>

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

const state = reactive({
    array: [],
})
</script>

上传组件

上传组件内部是使用 /@/api/common 内的 fileUpload 函数完成上传请求的。

属性

属性名说明类型默认值
type类型image/images/file/filesimage
data上传请求时的额外携带数据anyObj{}
returnFullUrl上传成功返回文件绝对路径booleanfalse
hideSelectFile是否隐藏附件选择器booleanfalse
forceLocal是否强制上传到本地存储booleanfalse
model-value / v-model绑定值string/string[]
hideImagePlusOnOverLimit在上传数量达到限制时隐藏图片上传按钮booleanfalse

插槽/事件

  1. el-upload文档链接
  2. 注意使用插槽时,您不能使用 FormItem 组件,而是直接导入上传组件本身使用 import BaUpload from '/@/components/baInput/components/baUpload.vue'

使用示例

vue
<template>
    <div>
        <FormItem label="头像" type="image" v-model="state.avatar" />

        <FormItem
            label="头像"
            :input-attr="{
                hideSelectFile: true,
                onChange: onAvatarChange,
                onSuccess: onSuccess,
            }"
            type="image"
            v-model="state.avatar"
            prop="avatar"
        />

        <FormItem label="文件组" type="files" v-model="state.files" />
    </div>
</template>

<script setup lang="ts">
import { reactive } from 'vue'
import FormItem from '/@/components/formItem/index.vue'
import { UploadFile, UploadFiles } from 'element-plus'

const state = reactive({
    avatar: '',
    files: ['a/b.txt', 'b/c.xls'],
})

const onAvatarChange = (uploadFile: UploadFile) => {
    console.log(uploadFile)
}

const onSuccess = (res: ApiPromise, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
    console.log(res)
}
</script>

富文本编辑器

  • BuildAdmin >= v2.0.0 实现了多富文本编辑器共存。
  • 所有编辑器的代码位于 /@/components/mixins/editor 文件夹,一个文件为一种编辑器,文件名则为编辑器名称。

公共属性

属性名说明类型默认值
editorType编辑器类型(名称)string未安装任何编辑器取 default,安装后取第一个编辑器
model-value / v-model绑定值string

注意事项

每个编辑器拥有的属性是不尽相同的,请直接参考 /@/components/mixins/editor 中的对应编辑器的 props 定义

使用示例

vue
<FormItem label="编辑器" type="editor" v-model="state.editor" />

<!-- 使用 md 编辑器前,需要先于模块市场安装好 -->
<FormItem
    label="MarkDown"
    type="editor"
    v-model="state.editor"
    :input-attr="{
        editorType: 'md-v3',
    }"
/>

<!-- 使用 wang 编辑器前,需要先于模块市场安装好 -->
<FormItem
    label="wangEditor"
    type="editor"
    v-model="state.editor"
    :input-attr="{
        editorType: 'wang',
    }"
/>

字体图标选择器

属性

属性名说明类型默认值
size选择器自带输入框的大小default/small/largedefault
disabled是否禁用booleanfalse
title选择面板标题string请选择图标
type要选择的图标类型(默认值)ele/awe/ali/localele
placement选择面板打开的方向top/top-start/top-end/bottom/bottom-start/bottom-end/left/left-start/left-end/right/right-start/right-endbottom
showIconName是否显示图标名称booleanfalse
model-value / v-model绑定值,当前选择的图标名称string

事件

事件名说明类型
change选择图标(event: string) => void

使用示例

vue
<template>
    <div>
        <FormItem label="选择图标" type="icon" v-model="state.icon" />

        <FormItem
            type="icon"
            label="选择图标"
            v-model="state.icon"
            :input-attr="{
                showIconName: true,
                onChange: onIconChange,
            }"
        />
    </div>
</template>

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

const state = reactive({
    icon: '',
})

const onIconChange = (val: string) => {
    console.log(val)
}
</script>

远程下拉组件

属性

属性名说明类型默认值
pk下拉value字段stringid
field下拉label字段stringname
remoteUrl远程API的URL,通常为控制器URL,将自动请求该URL的 index 方法string
params请求下拉数据时,额外发送的参数anyObj{}
labelFormatter可对label进行渲染前格式化的函数(optionData: anyObj, optionKey: string) => string
tooltipParams鼠标放置于选项上时,显示选项的更多字段信息而不只是 labelanyObj{}
model-value / v-model绑定值string/number/string[]/number[]
escBlur按下ESC键时直接使下拉框脱焦booleantrue

远程下拉组件基于 el-select,所以它的大部分属性/事件也可以使用。

事件

事件名说明类型
row选项改变时,返回被选项的整行数据(val: any) => void

属性详细解释

model-value

双向绑定值,它具有 string | string[] 等多种类型,当 multipletrue 时,才应传递数组。

remoteUrl
  1. 控制器的URL,比如 admin 表对应的控制器URL为 /admin/auth.admin/index
  2. 只要数据表生成过CRUD代码,它就会拥有控制器,默认请求的是对应控制器的 index 方法(也就是后台查看请求的方法)
pk
  1. 数据源表的主键,作为 select 选项的 value
  2. 若控制器的 index 方法有关联表,pk 属性需要带有表名前缀,比如 ba_user.id
field

作为 select 选项的 label 字段,只需确保此字段在数据表内存在即可。

tooltipParams

  1. 假设选项 labelname,则用户只可以看到 name 这一个字段的值供选择
  2. 此属性的存在解决以上问题,请想象您将鼠标置入一个选项之上时,旁边出现一个面板,面板上显示了该选项的 id、mobile、nickname 等属性
  3. 它使用一个 object 配置要显示的字段的键值对,键为字段标题,值为字段名,请确保字段在数据表内存在,详见下方示例。

使用示例

vue
<template>
    <div>
        <!-- FormItem 中 type:remoteSelect=远程单选,remoteSelects=远程多选,无需额外设置 multiple 属性  -->

        <FormItem
            label="remoteSelect"
            type="remoteSelect"
            v-model="state.remoteSelect"
            :input-attr="{
                pk: 'ba_user.id',
                field: 'nickname',
                remoteUrl: '/admin/user.User/index',
                onRow: onRemoteSelectRow,
                onChange: onRemoteChange,
            }"
            placeholder="点击选择远程数据-单选"
        />

        <FormItem
            label="remoteSelects"
            type="remoteSelects"
            v-model="state.remoteSelects"
            :input-attr="{
                pk: 'ba_user.id',
                field: 'nickname',
                remoteUrl: '/admin/user.User/index',
                placeholder: '点击选择远程数据-多选',
                tooltipParams: {
                    联系人昵称: 'nickname',
                    交易地址: 'address',
                    联系人电话: 'phone',
                },
            }"
        />
    </div>
</template>

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

const state = reactive({
    remoteSelect: '',
    remoteSelects: ['1'],
})

const onRemoteSelectRow = (rowData: any) => {
    console.log(rowData)
}

const onRemoteChange = () => {
    console.log('onRemoteChange')
}
</script>