vxe-from 使用多种布局方式,在表单中加边框,实现跟表格一样的效果
左右布局
<template>
<div>
<vxe-form v-bind="formOptions" v-on="formEvents" ></vxe-form>
</div>
</template>
<script setup>
import { reactive } from 'vue'
import { VxeUI } from 'vxe-pc-ui'
const formOptions = reactive({
data: {
name: 'test1',
nickname: 'Testing',
sex: '',
age: '',
address: ''
},
items: [
{ field: 'name', title: '名称', span: 24, itemRender: { name: 'VxeInput' } },
{ field: 'sex', title: '性别', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'age', title: '年龄', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'address', title: '地址', span: 24, itemRender: { name: 'VxeTextarea' } },
{
align: 'center',
span: 24,
itemRender: {
name: 'VxeButtonGroup',
options: [
{ type: 'submit', content: '提交', status: 'primary' },
{ type: 'reset', content: '重置' }
]
}
}
]
})
const formEvents = {
submit () {
VxeUI.modal.message({ content: '保存成功', status: 'success' })
},
reset () {
VxeUI.modal.message({ content: '重置事件', status: 'info' })
}
}
</script>
上下布局
<template>
<div>
<vxe-form v-bind="formOptions" v-on="formEvents" ></vxe-form>
</div>
</template>
<script setup>
import { reactive } from 'vue'
import { VxeUI } from 'vxe-pc-ui'
const formOptions = reactive({
vertical: true,
data: {
name: 'test1',
nickname: '',
sex: '',
age: '',
address: ''
},
items: [
{ field: 'name', title: '名称', span: 24, itemRender: { name: 'VxeInput' } },
{ field: 'sex', title: '性别', span: 24, itemRender: { name: 'VxeInput' } },
{ field: 'age', title: '年龄', span: 24, itemRender: { name: 'VxeInput' } },
{ field: 'address', title: '地址', span: 24, itemRender: { name: 'VxeTextarea' } },
{
align: 'center',
span: 24,
itemRender: {
name: 'VxeButtonGroup',
options: [
{ type: 'submit', content: '提交', status: 'primary' },
{ type: 'reset', content: '重置' }
]
}
}
]
})
const formEvents = {
submit () {
VxeUI.modal.message({ content: '保存成功', status: 'success' })
},
reset () {
VxeUI.modal.message({ content: '重置事件', status: 'info' })
}
}
</script>
带边框,模拟表格
<template>
<div>
<vxe-form v-bind="formOptions"></vxe-form>
</div>
</template>
<script setup>
import { reactive } from 'vue'
const sexItemRender = reactive({
name: 'VxeSelect',
options: [
{ label: '女', value: 'Women' },
{ label: '男', value: 'Man' }
]
})
const formOptions = reactive({
border: true,
verticalAlign: 'center',
titleWidth: 100,
data: {
name: 'test1',
nickname: '',
sex: '',
age: '',
address: ''
},
items: [
{ field: 'name', title: '名称', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'nickname', title: '昵称', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'sex', title: '性别', span: 12, itemRender: sexItemRender },
{ field: 'age', title: '年龄', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'address', title: '地址', span: 24, itemRender: { name: 'VxeTextarea' } }
]
})
</script>
带边框背景
<template>
<div>
<vxe-form v-bind="formOptions"></vxe-form>
</div>
</template>
<script setup>
import { reactive } from 'vue'
const sexItemRender = reactive({
name: 'VxeSelect',
options: [
{ label: '女', value: 'Women' },
{ label: '男', value: 'Man' }
]
})
const formOptions = reactive({
border: true,
titleBackground: true,
verticalAlign: 'center',
titleWidth: 100,
data: {
name: 'test1',
nickname: '',
sex: '',
age: '',
address: ''
},
items: [
{ field: 'name', title: '名称', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'nickname', title: '昵称', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'sex', title: '性别', span: 12, itemRender: sexItemRender },
{ field: 'age', title: '年龄', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'address', title: '地址', span: 24, itemRender: { name: 'VxeTextarea' } }
]
})
</script>
折叠表单
<template>
<div>
<vxe-form v-bind="formOptions" v-on="formEvents" ></vxe-form>
</div>
</template>
<script setup>
import { reactive } from 'vue'
import { VxeUI } from 'vxe-pc-ui'
const formOptions = reactive({
titleWidth: 100,
titleColon: true,
titleAlign: 'right',
data: {
name: 'test1',
role: '',
nickname: 'Testing',
sex: '',
age: '',
num: '',
createDate: '',
updateDate: ''
},
items: [
{ field: 'name', title: '名称', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'nickname', title: '昵称', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'role', title: '角色', span: 12, folding: true, itemRender: { name: 'VxeInput' } },
{ field: 'sex', title: '性别', span: 12, folding: true, itemRender: { name: 'VxeInput' } },
{ field: 'age', title: '年龄', span: 12, folding: true, itemRender: { name: 'VxeInput' } },
{ field: 'num', title: '大小', span: 12, folding: true, itemRender: { name: 'VxeInput' } },
{ field: 'createDate', title: '创建时间', span: 12, folding: true, itemRender: { name: 'VxeInput' } },
{ field: 'updateDate', title: '更新时间', span: 12, folding: true, itemRender: { name: 'VxeInput' } },
{
align: 'center',
span: 24,
collapseNode: true,
itemRender: {
name: 'VxeButtonGroup',
options: [
{ type: 'submit', content: '搜索', status: 'primary' },
{ type: 'reset', content: '重置' }
]
}
}
]
})
const formEvents = {
submit () {
VxeUI.modal.message({ content: '搜索', status: 'success' })
}
}
</script>
表单校验
<template>
<div>
<vxe-form v-bind="formOptions" v-on="formEvents" ></vxe-form>
</div>
</template>
<script setup>
import { reactive } from 'vue'
import { VxeUI } from 'vxe-pc-ui'
const formOptions = reactive({
data: {
name: 'test1',
nickname: 'Testing',
sex: '',
age: ''
},
rules: {
name: [
{ required: true, message: '请输入名称' },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符' }
],
sex: [
{ required: true, message: '请选择性别' }
],
age: [
{ required: true, message: '请输入年龄' },
{
validator ({ itemValue }) {
// 自定义校验
if (Number(itemValue) > 35 || Number(itemValue) < 18) {
return new Error('年龄在 18 ~ 35 之间')
}
}
}
]
},
items: [
{ field: 'name', title: '名称', span: 24, itemRender: { name: 'VxeInput' } },
{ field: 'sex', title: '性别', span: 12, itemRender: { name: 'VxeInput' } },
{ field: 'age', title: '年龄', span: 12, itemRender: { name: 'VxeInput' } },
{
align: 'center',
span: 24,
itemRender: {
name: 'VxeButtonGroup',
options: [
{ type: 'submit', content: '提交', status: 'primary' },
{ type: 'reset', content: '重置' }
]
}
}
]
})
const formEvents = {
submit () {
VxeUI.modal.message({ content: '保存成功', status: 'success' })
},
reset () {
VxeUI.modal.message({ content: '重置事件', status: 'info' })
}
}
</script>