表单构建
快速开始
安装
sh
pnpm add @howuse/element-plus-form
sh
npm i @howuse/element-plus-form
sh
yarn add @howuse/element-plus-form
简单查询示例
<template>
<ProForm :columns="formColumns" :span="8" @ok="submit"/>
</template>
<script setup lang="ts">
import { createProForm, ProForm } from '@howuse/element-plus-form'
const { formColumns } = createProForm([
{
label: "姓名",
key: "name",
value: "",
is: "ElInput",
},
{
label: "年龄",
key: "age",
value: "",
is: "ElInput",
},
{
label: "体重",
key: "weight",
value: "",
is: "ElInput",
},
{
label: "城市",
key: "city",
value: "",
is: "ElSelect",
data: [{ label: "北京", value: 1 }, { label: "上海", value: 2 }],
optionLabel: "label",
optionValue: "value",
},
])
function submit(raw) {
alert(JSON.stringify(raw))
}
</script>
修改按钮位置
<template>
<ElSpace>
<ElButton v-for="p in ps" type="primary" @click="btnPosition = p">{{ p }}</ElButton>
</ElSpace>
<div style="margin-top: 10px;"></div>
<ProForm :columns="formColumns" :span="8" :btn-position="btnPosition" @ok="submit" />
</template>
<script setup lang="ts">
import { createProForm, ProForm } from '@howuse/element-plus-form'
import { ElSpace, ElButton } from 'element-plus'
import { ref } from 'vue';
const { formColumns } = createProForm([
{
label: "姓名",
key: "name",
value: "",
is: "ElInput",
},
{
label: "年龄",
key: "age",
value: "",
is: "ElInput",
},
])
function submit(raw) {
alert(JSON.stringify(raw))
}
// === 按钮位置修改 ===
const btnPosition = ref("right")
const ps = ["right", "left", "center", "float-end", "col"]
</script>
表单验证
<template>
<ProForm :columns="formColumns" :span="12" ok-text="保存" @ok="submit" :display-expend="false" :btn-position="'center'" />
</template>
<script setup lang="ts">
import { createProForm, ProForm } from '@howuse/element-plus-form'
const { formColumns } = createProForm([
{
label: "姓名",
key: "name",
value: "",
is: "ElInput",
rules: [
{ required: true, message: "请输入姓名" },
]
},
{
label: "年龄",
key: "age",
value: "",
is: "ElInput",
rules: [
{ required: true, message: "请输入年龄" },
]
},
{
label: "体重",
key: "weight",
value: "",
is: "ElInput",
rules: [
{ required: true, message: "请输入体重" },
]
},
{
label: "城市",
key: "city",
value: "",
is: "ElSelect",
data: [{ label: "北京", value: 1 }, { label: "上海", value: 2 }],
optionLabel: "label",
optionValue: "value",
rules: [
{ required: true, message: "请选择城市" },
]
},
])
function submit(raw) {
alert(JSON.stringify(raw))
}
</script>
弹窗操作
clickOkClose 用于点击确定后关闭弹窗,默认是 false。
额外的数据值,指的是没有在createProForm当中声明的值,但是进行了赋值。
<template>
<ProFormDialog v-model:visible="visible" clickOkClose title="编辑">
<ProForm :columns="formColumns" :span="8" :btn-position="'center'" ok-text="保存" @ok="submit">
</ProForm>
</ProFormDialog>
<ProFormDialog v-model:visible="visible2" title="编辑">
<ProForm :columns="formColumns" :span="8" :btn-position="'center'" @ok="submit">
<template #suffix-btn="{ close }">
<ElButton @click="close()">关闭</ElButton>
</template>
</ProForm>
</ProFormDialog>
<ProFormDialog v-model:visible="visible3" :title="formModel3.id > 0 ? '编辑' : '新增'">
<ProForm :columns="formColumns3" :span="8" :btn-position="'center'" @ok="submit">
<template #suffix-btn="{ close }">
<ElButton @click="close()">关闭</ElButton>
</template>
</ProForm>
</ProFormDialog>
<ElSpace>
<ElButton @click="visible = true">打开弹窗</ElButton>
<ElButton @click="visible2 = true">打开弹窗 自定义关闭按钮</ElButton>
</ElSpace>
<div><b>根据额外的数据值判断给定弹窗标题</b></div>
<ElSpace>
<ElButton @click="openAdd()" type="primary">新增</ElButton>
<ElButton @click="openEdit()" type="warning">编辑</ElButton>
</ElSpace>
</template>
<script setup lang="ts">
import { createProForm, ProForm, ProFormDialog } from '@howuse/element-plus-form'
import { ElButton, ElMessage, ElSpace } from 'element-plus';
import { ref } from 'vue';
const visible = ref(false)
const visible2 = ref(false)
const visible3 = ref(false)
const { formColumns } = createProForm([
{
label: "姓名",
key: "name",
value: "",
is: "ElInput",
},
{
label: "年龄",
key: "age",
value: "",
is: "ElInput",
},
])
const { formColumns: formColumns3, formModel: formModel3, setValue } = createProForm([
{
label: "姓名",
key: "name",
value: "",
is: "ElInput",
},
{
label: "年龄",
key: "age",
value: "",
is: "ElInput",
},
])
function submit(raw) {
ElMessage.success(JSON.stringify(raw))
}
// 新增
function openAdd() {
formModel3.value = {
name: '',
age: '',
}
visible3.value = true
}
// 编辑
function openEdit() {
formModel3.value = {
name: '张三',
age: '100',
id: 1,
}
visible3.value = true
}
</script>
抽屉操作
clickOkClose 用于点击确定后关闭弹窗,默认是 false。
<template>
<ProFormDrawer v-model:visible="visible" clickOkClose title="编辑">
<ProForm :columns="formColumns" :span="24" :btn-position="'center'" :display-expend="false" @ok="submit">
</ProForm>
</ProFormDrawer>
<ProFormDrawer v-model:visible="visible2" clickOkClose title="编辑">
<ProForm :columns="formColumns" :span="24" :btn-position="'center'" :display-expend="false" @ok="submit">
<template #suffix-btn="{ close }">
<ElButton @click="close()">关闭</ElButton>
</template>
</ProForm>
</ProFormDrawer>
<ElSpace>
<ElButton @click="visible = true">打开抽屉</ElButton>
<ElButton @click="visible2 = true">打开抽屉 自定义关闭按钮</ElButton>
</ElSpace>
</template>
<script setup lang="ts">
import { createProForm, ProForm, ProFormDrawer } from '@howuse/element-plus-form'
import { ElButton, ElMessage, ElSpace } from 'element-plus';
import { ref } from 'vue';
const visible = ref(false)
const visible2 = ref(false)
const { formColumns } = createProForm([
{
label: "姓名",
key: "name",
value: "",
is: "ElInput",
},
{
label: "年龄",
key: "age",
value: "",
is: "ElInput",
},
])
function submit(raw) {
ElMessage.success(JSON.stringify(raw))
}
</script>
Api
ProForm
属性
属性名 | 说明 | 类型 | 默认值 |
---|---|---|---|
span | 对应el-row的span属性 | number | 4 |
okText | 查询按钮文字 | string | 查询 |
displayExpend | 是否展示展开按钮,常用于搜索项折叠 | boolean | false |
btnPosition | 按钮位置,可选值:"right","left","center","float-end","col","none"。 | string | right |
isRule | 是否开启表单验证 | boolean | true |
hiddenReset | 是否隐藏重置按钮 | boolean | false |
immediate | 是否立即执行 | boolean | true |
事件
属性名 | 说明 | 类型 | 默认值 |
---|---|---|---|
ok | 点击查询按钮触发 | (raw: any)=> void | {} |
插槽
属性名 | 说明 | 类型 | 默认值 |
---|---|---|---|
prefix-btn | 在重置按钮之前加入新的元素, 调用 close 可关闭按钮 | - | - |
suffix-btn | 在查询按钮之后加入新的元素, 调用 close 可关闭按钮 | - | - |
createProForm
参数:
typescript
{
label: string;
key: string; // 向后端提交的数据的键值
value: any; // 必要字段,向后端提交的数据
resetVal?: any; // 默认值,需要和value保持一致,如果value没有设置,则赋值resetVal
rules?: Recordable[];
span?: number; // 表单占据的宽度, 参数取值于 el-col
is: FormItemType, // element或者自定义组件名称
optionLabel?: MaybeRef<string> | ComputedRef<string>; // 下拉框使用
optionValue?: string; // 下拉框使用
optionChildren?: string; // 下拉框使用
data?: any; // 数据源,下拉框使用
props?: Recordable;
formItemProps?: Recordable;
hidden?: MaybeRef<boolean>;//是否隐藏
}[]
返回值:
属性名 | 说明 | 默认值 |
---|---|---|
formModel | 表单数据 | - |
formColumns | ProForm组件对应的columns属性 | - |
setValue | 设置某个key值对应的value | - |
getValue | 获取对应key的值 | - |
updateRestValue | 更新触发重置时,输入框的默认值 | value 对应的值 |
ProFormDialog
属性
属性名 | 说明 | 默认值 |
---|---|---|
v-model:visible | 打开/关闭弹窗 | - |
clickOkClose | 点击ProForm的查询/保存按钮时,关闭弹窗 | - |
ProFormDrawer
属性
属性名 | 说明 | 默认值 |
---|---|---|
v-model:visible | 打开/关闭抽屉 | - |
clickOkClose | 点击ProForm的查询/保存按钮时,关闭抽屉 | - |
btnFixedBtm | 操作按钮是否固定底部 , 默认固定在底部 | - |
FAQ
Uncaught SyntaxError: The requested module '/node_modules/.pnpm/dayjs@1.11.10/node_modules/dayjs/dayjs.min.js?v=2e96311a' does not provide an export named 'default'
这个错误出现在element-plus 自带 dayjs 的 1.x 版本,如果不是此版本,请尝试本方法或者寻找新的解决方案。
安装 pnpm add dayjs@1
vite 配置
ts
export default defineConfig({
optimizeDeps: {
include: [
'dayjs',
'dayjs/plugin/*'
]
},
})