9 changed files with 258 additions and 4 deletions
@ -0,0 +1,183 @@ |
|||||
|
<script lang="ts" setup> |
||||
|
import { ref } from 'vue'; |
||||
|
|
||||
|
import { Page } from '@vben/common-ui'; |
||||
|
|
||||
|
import { Button, Card, Switch } from 'ant-design-vue'; |
||||
|
|
||||
|
import { useVbenForm } from '#/adapter/form'; |
||||
|
|
||||
|
defineOptions({ |
||||
|
name: 'ScrollToErrorTest', |
||||
|
}); |
||||
|
|
||||
|
const scrollEnabled = ref(true); |
||||
|
|
||||
|
const [Form, formApi] = useVbenForm({ |
||||
|
scrollToFirstError: scrollEnabled.value, |
||||
|
schema: [ |
||||
|
{ |
||||
|
component: 'Input', |
||||
|
componentProps: { |
||||
|
placeholder: '请输入用户名', |
||||
|
}, |
||||
|
fieldName: 'username', |
||||
|
label: '用户名', |
||||
|
rules: 'required', |
||||
|
}, |
||||
|
{ |
||||
|
component: 'Input', |
||||
|
componentProps: { |
||||
|
placeholder: '请输入邮箱', |
||||
|
}, |
||||
|
fieldName: 'email', |
||||
|
label: '邮箱', |
||||
|
rules: 'required', |
||||
|
}, |
||||
|
{ |
||||
|
component: 'Input', |
||||
|
componentProps: { |
||||
|
placeholder: '请输入手机号', |
||||
|
}, |
||||
|
fieldName: 'phone', |
||||
|
label: '手机号', |
||||
|
rules: 'required', |
||||
|
}, |
||||
|
{ |
||||
|
component: 'Input', |
||||
|
componentProps: { |
||||
|
placeholder: '请输入地址', |
||||
|
}, |
||||
|
fieldName: 'address', |
||||
|
label: '地址', |
||||
|
rules: 'required', |
||||
|
}, |
||||
|
{ |
||||
|
component: 'Input', |
||||
|
componentProps: { |
||||
|
placeholder: '请输入备注', |
||||
|
}, |
||||
|
fieldName: 'remark', |
||||
|
label: '备注', |
||||
|
rules: 'required', |
||||
|
}, |
||||
|
{ |
||||
|
component: 'Input', |
||||
|
componentProps: { |
||||
|
placeholder: '请输入公司名称', |
||||
|
}, |
||||
|
fieldName: 'company', |
||||
|
label: '公司名称', |
||||
|
rules: 'required', |
||||
|
}, |
||||
|
{ |
||||
|
component: 'Input', |
||||
|
componentProps: { |
||||
|
placeholder: '请输入职位', |
||||
|
}, |
||||
|
fieldName: 'position', |
||||
|
label: '职位', |
||||
|
rules: 'required', |
||||
|
}, |
||||
|
{ |
||||
|
component: 'Select', |
||||
|
componentProps: { |
||||
|
options: [ |
||||
|
{ label: '男', value: 'male' }, |
||||
|
{ label: '女', value: 'female' }, |
||||
|
], |
||||
|
placeholder: '请选择性别', |
||||
|
}, |
||||
|
fieldName: 'gender', |
||||
|
label: '性别', |
||||
|
rules: 'selectRequired', |
||||
|
}, |
||||
|
], |
||||
|
showDefaultActions: false, |
||||
|
}); |
||||
|
|
||||
|
// 测试 validateAndSubmitForm(验证并提交) |
||||
|
async function testValidateAndSubmit() { |
||||
|
await formApi.validateAndSubmitForm(); |
||||
|
} |
||||
|
|
||||
|
// 测试 validate(手动验证整个表单) |
||||
|
async function testValidate() { |
||||
|
await formApi.validate(); |
||||
|
} |
||||
|
|
||||
|
// 测试 validateField(验证单个字段) |
||||
|
async function testValidateField() { |
||||
|
await formApi.validateField('username'); |
||||
|
} |
||||
|
|
||||
|
// 切换滚动功能 |
||||
|
function toggleScrollToError() { |
||||
|
formApi.setState({ scrollToFirstError: scrollEnabled.value }); |
||||
|
} |
||||
|
|
||||
|
// 填充部分数据测试 |
||||
|
async function fillPartialData() { |
||||
|
await formApi.resetForm(); |
||||
|
await formApi.setFieldValue('username', '测试用户'); |
||||
|
await formApi.setFieldValue('email', 'test@example.com'); |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<template> |
||||
|
<Page |
||||
|
description="测试表单验证失败时自动滚动到错误字段的功能" |
||||
|
title="滚动到错误字段测试" |
||||
|
> |
||||
|
<Card title="功能测试"> |
||||
|
<template #extra> |
||||
|
<div class="flex items-center gap-2"> |
||||
|
<Switch |
||||
|
v-model:checked="scrollEnabled" |
||||
|
@change="toggleScrollToError" |
||||
|
/> |
||||
|
<span>启用滚动到错误字段</span> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<div class="space-y-4"> |
||||
|
<div class="rounded bg-blue-50 p-4"> |
||||
|
<h3 class="mb-2 font-medium">测试说明:</h3> |
||||
|
<ul class="list-inside list-disc space-y-1 text-sm"> |
||||
|
<li>所有验证方法在验证失败时都会自动滚动到第一个错误字段</li> |
||||
|
<li>可以通过右上角的开关控制是否启用自动滚动功能</li> |
||||
|
</ul> |
||||
|
</div> |
||||
|
|
||||
|
<div class="rounded border p-4"> |
||||
|
<h4 class="mb-3 font-medium">验证方法测试:</h4> |
||||
|
<div class="flex flex-wrap gap-2"> |
||||
|
<Button type="primary" @click="testValidateAndSubmit"> |
||||
|
测试 validateAndSubmitForm() |
||||
|
</Button> |
||||
|
<Button @click="testValidate"> 测试 validate() </Button> |
||||
|
<Button @click="testValidateField"> 测试 validateField() </Button> |
||||
|
</div> |
||||
|
<div class="mt-2 text-xs text-gray-500"> |
||||
|
<p>• validateAndSubmitForm(): 验证表单并提交</p> |
||||
|
<p>• validate(): 手动验证整个表单</p> |
||||
|
<p>• validateField(): 验证单个字段(这里测试用户名字段)</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="rounded border p-4"> |
||||
|
<h4 class="mb-3 font-medium">数据填充测试:</h4> |
||||
|
<div class="flex flex-wrap gap-2"> |
||||
|
<Button @click="fillPartialData"> 填充部分数据 </Button> |
||||
|
<Button @click="() => formApi.resetForm()"> 清空表单 </Button> |
||||
|
</div> |
||||
|
<div class="mt-2 text-xs text-gray-500"> |
||||
|
<p>• 填充部分数据后验证,会滚动到第一个错误字段</p> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<Form /> |
||||
|
</div> |
||||
|
</Card> |
||||
|
</Page> |
||||
|
</template> |
||||
Loading…
Reference in new issue