wms-antdvue/.svn/pristine/ee/eefbea876065b7bd8e06e2a26ec2d6ea4f90e3e5.svn-base
2024-11-07 16:33:03 +08:00

249 lines
5.9 KiB
Plaintext

<template>
<div>
<div class="n-layout-page-header">
<a-card :bordered="false" title="基础表单">
基础表单,用于向用户收集表单信息,并展示 Password 组件使用示例</a-card
>
</div>
<a-card :bordered="false" class="mt-4 proCard">
<div class="BasicForm">
<BasicForm
ref="basicFormRef"
submitButtonText="提交预约"
:labelCol="{ span: 4 }"
:rowProps="{ gutter: [16, 0] }"
:colProps="{ span: 24 }"
:schemas="schemas"
actInheritLabelCol
@submit="handleSubmit"
@reset="handleReset"
>
<template #statusSlot="{ model, field }">
<a-input v-model:value="model[field]" placeholder="请输入状态" />
</template>
<template #passwordSlot="{ model, field }">
<Password
ref="passwordRef"
v-model:value="model[field]"
@change="changePassword"
block
repeat
/>
</template>
</BasicForm>
</div>
</a-card>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { BasicForm, FormSchema } from '@/components/Form/index';
import { message } from 'ant-design-vue';
import { Password } from '@/components/Password';
import { getClassifyList } from '@/api/select/select';
const params = {
type: 1,
};
async function loadSelectData(res) {
//这里可以进行数据转换处理
return (await getClassifyList({ ...res, ...params })).map((item, index) => {
return {
...item,
index,
};
});
}
const schemas: FormSchema[] = [
{
name: 'name',
component: 'Input',
label: '姓名',
labelMessage: '这是一个提示',
componentProps: {
placeholder: '请输入姓名',
onInput: (e: any) => {
console.log(e);
},
},
rules: [{ required: true, message: '请输入姓名', trigger: ['blur'] }],
},
{
name: 'user.basic.age',
component: 'InputNumber',
label: '年龄',
labelMessage: '这是一个field对象演示',
componentProps: {
placeholder: '请输入年龄',
},
rules: [{ required: true, type: 'number', message: '请输入年龄', trigger: ['blur'] }],
},
{
name: 'mobile',
component: 'InputNumber',
label: '手机',
componentProps: {
placeholder: '请输入手机号码',
showButton: false,
onInput: (e: any) => {
console.log(e);
},
},
},
{
name: 'type',
component: 'Select',
label: '类型',
labelMessage: '选择类型会出现预约时间表单',
componentProps: {
placeholder: '请选择类型',
allowClear: true,
options: [
{
label: '舒适性',
value: 1,
},
{
label: '经济性',
value: 2,
},
],
onUpdateValue: (e: any) => {
console.log(e);
},
},
},
{
name: 'classify',
component: 'BasicSelect',
label: '动态分类',
componentProps: {
placeholder: '请选择分类',
request: loadSelectData,
block: true,
onChange: (e: any) => {
console.log(e);
},
},
rules: [{ required: true, message: '请选择动态分类', trigger: ['change'] }],
},
{
name: 'makeDate',
component: 'DatePicker',
label: '预约时间',
defaultValue: '',
componentProps: {
type: 'date',
onUpdateValue: (e: any) => {
console.log(e);
},
},
// 根据 上面选择的类型,获取页面其他逻辑字段 处理显示表单
// 可用字段 schema, values, model, field
hidden: ({ model }) => {
return !model.type;
},
rules: [{ required: true, type: 'number', message: '请选择预约时间', trigger: ['change'] }],
},
{
name: 'makeTime',
component: 'TimePicker',
label: '停留时间',
componentProps: {
onUpdateValue: (e: any) => {
console.log(e);
},
},
},
{
name: 'makeProject',
component: 'Checkbox',
label: '预约项目',
componentProps: {
placeholder: '请选择预约项目',
options: [
{
label: '种牙',
value: 1,
},
{
label: '补牙',
value: 2,
},
{
label: '根管',
value: 3,
},
],
onUpdateValue: (e: any) => {
console.log(e);
},
},
},
{
name: 'makeSource',
component: 'RadioGroup',
label: '来源',
componentProps: {
options: [
{
label: '网上',
value: 1,
},
{
label: '门店',
value: 2,
},
],
onUpdateValue: (e: any) => {
console.log(e);
},
},
},
{
name: 'status',
label: '状态',
//插槽
slot: 'statusSlot',
},
{
name: 'password',
label: '密码',
slot: 'passwordSlot',
},
];
const passwordRef = ref();
const basicFormRef = ref();
function handleSubmit(values: Recordable) {
// const isVal = passwordRef.value.isValidator();
// if (!isVal) {
// return passwordRef.value.showValidator();
// }
console.log(basicFormRef.value);
message.success(JSON.stringify(values));
}
function handleReset(values: Recordable) {
console.log(values);
}
function changePassword(value) {
console.log(value);
}
</script>
<style lang="less" scoped>
.BasicForm {
width: 550px;
margin: 0 auto;
overflow: hidden;
padding-top: 20px;
}
</style>