diff --git a/.vscode/settings.json b/.vscode/settings.json
index 31cbff6..941a79d 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,5 +1,8 @@
{
"editor.defaultFormatter": "dprint.dprint",
"dprint.path": "node_modules/dprint/dprint",
- "unocss.root": "example"
+ "unocss.root": "example",
+ "[typescript]": {
+ "editor.defaultFormatter": "dbaeumer.vscode-eslint"
+ }
}
diff --git a/README.md b/README.md
index 773ab98..a8c9f71 100644
--- a/README.md
+++ b/README.md
@@ -169,7 +169,7 @@ dirtyFields.value /* value: {} */
### Validating rules for form
-Use `rule` to define the validation rules for form fields. The verification process will be take placed automatically when values of fields have been changed, the validation result will be stored and provided in `status[key].isError` and `status[key].message` properties. If one fields requires more then one rule, it can be declared by using function arrays.
+Use `rule` to define the validation rules for form fields. The verification process will be take placed automatically when values of fields have been changed, the validation result will be stored and provided in `status[key].isError` and `status[key].message` properties. If one fields requires more than one rule, it can be declared by using function arrays.
> You can also maintain your rule collections on your own, and import them where they are needed.
@@ -299,6 +299,38 @@ const { form, status } = useForm({
+Lazy rule validation
+
+
+You can set `lazy` to `true` to prevent rules from being automatically verified when data changes.
+
+In this case, consider call `verify()` or `status[fieldName].verify()` to manually validate fields.
+
+```ts
+const { form, status, verify } = useForm({
+ form: () => ({
+ userName: '',
+ /* ... */
+ }),
+
+ rule: {
+ userName: v => v.length < 3,
+ },
+
+ lazy: true,
+})
+
+form.userName = 'abc'
+status.userName.isError // false
+
+verify()
+
+status.userName.isError // true
+```
+
+
+
+
### Submission
`submitter` accepts a callback function as argument which returns the function that be able to triggered this callback function and a state variable that indicates the function is running. The callback function passed into `submitter` can get all the states and functions returned by the `useForm`, which allows you to put the callback function into separate code or even write generic submission functions for combination easily.
diff --git a/README.zh-Hans.md b/README.zh-Hans.md
index 90c7253..eb85871 100644
--- a/README.zh-Hans.md
+++ b/README.zh-Hans.md
@@ -297,6 +297,38 @@ const { form, status } = useForm({
+规则懒校验
+
+
+将 `lazy` 设置为 `true` 可以阻止数据变化时规则自动校验。
+
+此时, 可以考虑调用 `verify()` 或 `status[fieldName].verify()` 来手动校验字段。
+
+```ts
+const { form, status, verify } = useForm({
+ form: () => ({
+ userName: '',
+ /* ... */
+ }),
+
+ rule: {
+ userName: v => v.length < 3,
+ },
+
+ lazy: true,
+})
+
+form.userName = 'abc'
+status.userName.isError // false
+
+verify()
+
+status.userName.isError // true
+```
+
+
+
+
### 提交
`submitter` 接受一个回调函数参数,返回触发这个回调函数的函数和表示函数运行中的状态变量;传入 `submitter` 的回调函数可以拿到 `useForm` 函数返回的所有状态和函数,这样可以将回调函数放到单独的代码中,甚至编写通用的提交函数,方便组合使用。
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0f32d0c..7d838bf 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,4 +1,4 @@
-lockfileVersion: 5.4
+lockfileVersion: 5.3
importers:
@@ -34,7 +34,7 @@ importers:
vue-tsc: ^0.34.15
yup: ^0.32.11
devDependencies:
- '@antfu/eslint-config': 0.23.1_5wsz2tb7zzudmaqxfve53vbauu
+ '@antfu/eslint-config': 0.23.1_eslint@8.14.0+typescript@4.6.3
'@iconify-json/carbon': 1.1.5
'@iconify-json/noto-v1': 1.1.1
'@types/jsdom': 16.2.14
@@ -86,16 +86,16 @@ packages:
'@jridgewell/trace-mapping': 0.3.13
dev: true
- /@antfu/eslint-config-basic/0.23.1_6hdztapqwtdsalm3rwopparvki:
+ /@antfu/eslint-config-basic/0.23.1_eslint@8.14.0+typescript@4.6.3:
resolution: {integrity: sha512-9h0hqK+E/upIrSVTo2Nt2SQoKRqouDhiJcrdkOx3RgvQkcZItuZnpWI2WGDMWQ3WTjE4fYyd+F4p7Mx/QHvX8w==}
peerDependencies:
eslint: '>=7.4.0'
dependencies:
eslint: 8.14.0
- eslint-plugin-antfu: 0.23.1_5wsz2tb7zzudmaqxfve53vbauu
+ eslint-plugin-antfu: 0.23.1_eslint@8.14.0+typescript@4.6.3
eslint-plugin-eslint-comments: 3.2.0_eslint@8.14.0
eslint-plugin-html: 6.2.0
- eslint-plugin-import: 2.26.0_oz6osdgn6jjjcjha4ebiuibanm
+ eslint-plugin-import: 2.26.0_eslint@8.14.0
eslint-plugin-jsonc: 2.2.1_eslint@8.14.0
eslint-plugin-markdown: 2.2.1_eslint@8.14.0
eslint-plugin-n: 15.2.0_eslint@8.14.0
@@ -105,73 +105,64 @@ packages:
jsonc-eslint-parser: 2.1.0
yaml-eslint-parser: 0.5.0
transitivePeerDependencies:
- - '@typescript-eslint/parser'
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- supports-color
- typescript
dev: true
- /@antfu/eslint-config-react/0.23.1_5wsz2tb7zzudmaqxfve53vbauu:
+ /@antfu/eslint-config-react/0.23.1_eslint@8.14.0+typescript@4.6.3:
resolution: {integrity: sha512-mg/wcl3AxvHljpnFGji6+7i2uyBqtL3YnCeLcjM6pvOq6DqhMkIsWUYiVonaqEOdTczcNGTvjwZpLlElBAOOgQ==}
peerDependencies:
eslint: '>=7.4.0'
dependencies:
- '@antfu/eslint-config-ts': 0.23.1_5wsz2tb7zzudmaqxfve53vbauu
+ '@antfu/eslint-config-ts': 0.23.1_eslint@8.14.0+typescript@4.6.3
eslint: 8.14.0
eslint-plugin-react: 7.29.4_eslint@8.14.0
transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- supports-color
- typescript
dev: true
- /@antfu/eslint-config-ts/0.23.1_5wsz2tb7zzudmaqxfve53vbauu:
+ /@antfu/eslint-config-ts/0.23.1_eslint@8.14.0+typescript@4.6.3:
resolution: {integrity: sha512-n/CZU17ZSbHKLKojX3QKuUxHhpbXXbxmOMQQP9W20/bsYo0ewpPotBwF0hjeN1B7D7uH8NGp+CoGzhnN7UyffA==}
peerDependencies:
eslint: '>=7.4.0'
typescript: '>=3.9'
dependencies:
- '@antfu/eslint-config-basic': 0.23.1_6hdztapqwtdsalm3rwopparvki
- '@typescript-eslint/eslint-plugin': 5.23.0_6hdztapqwtdsalm3rwopparvki
- '@typescript-eslint/parser': 5.23.0_5wsz2tb7zzudmaqxfve53vbauu
+ '@antfu/eslint-config-basic': 0.23.1_eslint@8.14.0+typescript@4.6.3
+ '@typescript-eslint/eslint-plugin': 5.23.0_f1c79981f0b4c7202d9b8d9cf7823552
+ '@typescript-eslint/parser': 5.23.0_eslint@8.14.0+typescript@4.6.3
eslint: 8.14.0
typescript: 4.6.3
transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- supports-color
dev: true
- /@antfu/eslint-config-vue/0.23.1_5wsz2tb7zzudmaqxfve53vbauu:
+ /@antfu/eslint-config-vue/0.23.1_eslint@8.14.0+typescript@4.6.3:
resolution: {integrity: sha512-rkOSQuHHoYuB64qRuIwGqK1cdKi6UabfUHxjZSQn586f8fKzcDGoLWFZkHx6e66lEAECKLlVc4VmrKIVuUX2jw==}
peerDependencies:
eslint: '>=7.4.0'
dependencies:
- '@antfu/eslint-config-ts': 0.23.1_5wsz2tb7zzudmaqxfve53vbauu
+ '@antfu/eslint-config-ts': 0.23.1_eslint@8.14.0+typescript@4.6.3
eslint: 8.14.0
eslint-plugin-vue: 8.7.1_eslint@8.14.0
transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- supports-color
- typescript
dev: true
- /@antfu/eslint-config/0.23.1_5wsz2tb7zzudmaqxfve53vbauu:
+ /@antfu/eslint-config/0.23.1_eslint@8.14.0+typescript@4.6.3:
resolution: {integrity: sha512-yHx9wiEnGrb22qil15U/2tIyFa+AbpHRdDn6xpyaONsRsa5FphrP/v1imbiF278HJZOzZ9qWvnrihKVtfOaPSw==}
peerDependencies:
eslint: '>=7.4.0'
dependencies:
- '@antfu/eslint-config-react': 0.23.1_5wsz2tb7zzudmaqxfve53vbauu
- '@antfu/eslint-config-vue': 0.23.1_5wsz2tb7zzudmaqxfve53vbauu
- '@typescript-eslint/eslint-plugin': 5.23.0_6hdztapqwtdsalm3rwopparvki
- '@typescript-eslint/parser': 5.23.0_5wsz2tb7zzudmaqxfve53vbauu
+ '@antfu/eslint-config-react': 0.23.1_eslint@8.14.0+typescript@4.6.3
+ '@antfu/eslint-config-vue': 0.23.1_eslint@8.14.0+typescript@4.6.3
+ '@typescript-eslint/eslint-plugin': 5.23.0_f1c79981f0b4c7202d9b8d9cf7823552
+ '@typescript-eslint/parser': 5.23.0_eslint@8.14.0+typescript@4.6.3
eslint: 8.14.0
eslint-plugin-eslint-comments: 3.2.0_eslint@8.14.0
eslint-plugin-html: 6.2.0
- eslint-plugin-import: 2.26.0_oz6osdgn6jjjcjha4ebiuibanm
+ eslint-plugin-import: 2.26.0_eslint@8.14.0
eslint-plugin-jsonc: 2.2.1_eslint@8.14.0
eslint-plugin-n: 15.2.0_eslint@8.14.0
eslint-plugin-promise: 6.0.0_eslint@8.14.0
@@ -181,8 +172,6 @@ packages:
jsonc-eslint-parser: 2.1.0
yaml-eslint-parser: 0.5.0
transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- supports-color
- typescript
dev: true
@@ -685,7 +674,7 @@ packages:
resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
dev: true
- /@typescript-eslint/eslint-plugin/5.23.0_6hdztapqwtdsalm3rwopparvki:
+ /@typescript-eslint/eslint-plugin/5.23.0_f1c79981f0b4c7202d9b8d9cf7823552:
resolution: {integrity: sha512-hEcSmG4XodSLiAp1uxv/OQSGsDY6QN3TcRU32gANp+19wGE1QQZLRS8/GV58VRUoXhnkuJ3ZxNQ3T6Z6zM59DA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@@ -696,10 +685,10 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/parser': 5.23.0_5wsz2tb7zzudmaqxfve53vbauu
+ '@typescript-eslint/parser': 5.23.0_eslint@8.14.0+typescript@4.6.3
'@typescript-eslint/scope-manager': 5.23.0
- '@typescript-eslint/type-utils': 5.23.0_5wsz2tb7zzudmaqxfve53vbauu
- '@typescript-eslint/utils': 5.23.0_5wsz2tb7zzudmaqxfve53vbauu
+ '@typescript-eslint/type-utils': 5.23.0_eslint@8.14.0+typescript@4.6.3
+ '@typescript-eslint/utils': 5.23.0_eslint@8.14.0+typescript@4.6.3
debug: 4.3.3
eslint: 8.14.0
functional-red-black-tree: 1.0.1
@@ -712,7 +701,7 @@ packages:
- supports-color
dev: true
- /@typescript-eslint/parser/5.23.0_5wsz2tb7zzudmaqxfve53vbauu:
+ /@typescript-eslint/parser/5.23.0_eslint@8.14.0+typescript@4.6.3:
resolution: {integrity: sha512-V06cYUkqcGqpFjb8ttVgzNF53tgbB/KoQT/iB++DOIExKmzI9vBJKjZKt/6FuV9c+zrDsvJKbJ2DOCYwX91cbw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@@ -740,7 +729,7 @@ packages:
'@typescript-eslint/visitor-keys': 5.23.0
dev: true
- /@typescript-eslint/type-utils/5.23.0_5wsz2tb7zzudmaqxfve53vbauu:
+ /@typescript-eslint/type-utils/5.23.0_eslint@8.14.0+typescript@4.6.3:
resolution: {integrity: sha512-iuI05JsJl/SUnOTXA9f4oI+/4qS/Zcgk+s2ir+lRmXI+80D8GaGwoUqs4p+X+4AxDolPpEpVUdlEH4ADxFy4gw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@@ -750,7 +739,7 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/utils': 5.23.0_5wsz2tb7zzudmaqxfve53vbauu
+ '@typescript-eslint/utils': 5.23.0_eslint@8.14.0+typescript@4.6.3
debug: 4.3.3
eslint: 8.14.0
tsutils: 3.21.0_typescript@4.6.3
@@ -785,7 +774,7 @@ packages:
- supports-color
dev: true
- /@typescript-eslint/utils/5.23.0_5wsz2tb7zzudmaqxfve53vbauu:
+ /@typescript-eslint/utils/5.23.0_eslint@8.14.0+typescript@4.6.3:
resolution: {integrity: sha512-dbgaKN21drqpkbbedGMNPCtRPZo1IOUr5EI9Jrrh99r5UW5Q0dz46RKXeSBoPV+56R6dFKpbrdhgUNSJsDDRZA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
@@ -1581,22 +1570,12 @@ packages:
/debug/2.6.9:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
dependencies:
ms: 2.0.0
dev: true
/debug/3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
dependencies:
ms: 2.1.2
dev: true
@@ -2307,40 +2286,20 @@ packages:
dependencies:
debug: 3.2.7
resolve: 1.22.0
- transitivePeerDependencies:
- - supports-color
dev: true
- /eslint-module-utils/2.7.3_cphntlaow2spielwlvsegonsm4:
+ /eslint-module-utils/2.7.3:
resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==}
engines: {node: '>=4'}
- peerDependencies:
- '@typescript-eslint/parser': '*'
- eslint-import-resolver-node: '*'
- eslint-import-resolver-typescript: '*'
- eslint-import-resolver-webpack: '*'
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
- eslint-import-resolver-node:
- optional: true
- eslint-import-resolver-typescript:
- optional: true
- eslint-import-resolver-webpack:
- optional: true
dependencies:
- '@typescript-eslint/parser': 5.23.0_5wsz2tb7zzudmaqxfve53vbauu
debug: 3.2.7
- eslint-import-resolver-node: 0.3.6
find-up: 2.1.0
- transitivePeerDependencies:
- - supports-color
dev: true
- /eslint-plugin-antfu/0.23.1_5wsz2tb7zzudmaqxfve53vbauu:
+ /eslint-plugin-antfu/0.23.1_eslint@8.14.0+typescript@4.6.3:
resolution: {integrity: sha512-GCc4hqHqPPVM4xIFHUKJFpOZbl9C48t9SupePiNjFisUHAxrZj/c1EHCt0LV0TONJHtSZDR53NNWMuB3O2USSg==}
dependencies:
- '@typescript-eslint/utils': 5.23.0_5wsz2tb7zzudmaqxfve53vbauu
+ '@typescript-eslint/utils': 5.23.0_eslint@8.14.0+typescript@4.6.3
transitivePeerDependencies:
- eslint
- supports-color
@@ -2375,24 +2334,19 @@ packages:
htmlparser2: 7.2.0
dev: true
- /eslint-plugin-import/2.26.0_oz6osdgn6jjjcjha4ebiuibanm:
+ /eslint-plugin-import/2.26.0_eslint@8.14.0:
resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==}
engines: {node: '>=4'}
peerDependencies:
- '@typescript-eslint/parser': '*'
eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
dependencies:
- '@typescript-eslint/parser': 5.23.0_5wsz2tb7zzudmaqxfve53vbauu
array-includes: 3.1.5
array.prototype.flat: 1.3.0
debug: 2.6.9
doctrine: 2.1.0
eslint: 8.14.0
eslint-import-resolver-node: 0.3.6
- eslint-module-utils: 2.7.3_cphntlaow2spielwlvsegonsm4
+ eslint-module-utils: 2.7.3
has: 1.0.3
is-core-module: 2.8.1
is-glob: 4.0.3
@@ -2400,10 +2354,6 @@ packages:
object.values: 1.1.5
resolve: 1.22.0
tsconfig-paths: 3.14.1
- transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- - supports-color
dev: true
/eslint-plugin-jsonc/2.2.1_eslint@8.14.0:
diff --git a/src/defineStatus.ts b/src/defineStatus.ts
index ea6848c..704a55c 100644
--- a/src/defineStatus.ts
+++ b/src/defineStatus.ts
@@ -1,6 +1,6 @@
import type { Ref, UnwrapNestedRefs, WatchStopHandle } from 'vue'
import { computed, reactive, watchEffect } from 'vue'
-import type { RuleItem, UseFormDefaultMessage, UseFormRule } from './type/form'
+import type { RuleItem, UseFormDefaultMessage, UseFormLazy, UseFormRule } from './type/form'
import type { StatusItem } from './type/formStatus'
import { deepEqual } from './util/deepEqual'
import { invoke } from './util/invoke'
@@ -12,6 +12,7 @@ export function initStatus(
formObj: UnwrapNestedRefs,
initialForm: Ref,
formDefaultMessage: UseFormDefaultMessage,
+ formLazy: UseFormLazy,
formRule?: UseFormRule,
) {
for (const key in formObj) {
@@ -28,7 +29,7 @@ export function initStatus(
message: formDefaultMessage,
isError: false,
isDirty: computed(() => !deepEqual((initialForm.value as any)[key], formObj[key])),
- ...statusControl(key, status, formObj, fieldRules, formDefaultMessage),
+ ...statusControl(key, status, formObj, fieldRules, formDefaultMessage, formLazy),
})
}
}
@@ -39,6 +40,7 @@ function statusControl(
formObj: UnwrapNestedRefs,
fieldRules: RuleItem[] | undefined,
formDefaultMessage: UseFormDefaultMessage,
+ formLazy: UseFormLazy,
) {
function setError(message: string, isError = true) {
status[key].message = message
@@ -74,8 +76,11 @@ function statusControl(
// Initialization rule check
const init = () => {
- // Determine if it has been initialized
- if (!fieldRules || stopEffect)
+ if (
+ !fieldRules
+ || stopEffect // Determine if it has been initialized
+ || formLazy
+ )
return
// monitor changes
diff --git a/src/index.test.ts b/src/index.test.ts
index 2926b46..26bd378 100644
--- a/src/index.test.ts
+++ b/src/index.test.ts
@@ -392,6 +392,37 @@ describe('useForm', () => {
wrapper.unmount()
})
+
+ it('can be lazy so that rule won\'t be automaticlly verified when data changes', async () => {
+ const wrapper = useSetup(() => {
+ const { form, status, isError, verify, dirtyFields } = useForm({
+ form: () => ({
+ name: '',
+ age: '',
+ }),
+ rule: {
+ age: val => !isNaN(+val) || 'expect numbers',
+ },
+ lazy: true,
+ })
+ return { form, status, isError, verify, dirtyFields }
+ })
+
+ wrapper.form.age = 'abc'
+ expect(wrapper.status.age.isDirty).toBe(true)
+
+ await nextTick()
+
+ expect(wrapper.status.age.isError).toBe(false)
+ expect(wrapper.isError).toBe(false)
+ expect(wrapper.status.age.message).toBe('')
+
+ wrapper.verify()
+
+ expect(wrapper.status.age.isError).toBe(true)
+ expect(wrapper.isError).toBe(true)
+ expect(wrapper.status.age.message).toBe('expect numbers')
+ })
})
describe('object type field', () => {
diff --git a/src/index.ts b/src/index.ts
index 26353ed..ae6f641 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -3,12 +3,13 @@ import type { Ref, UnwrapNestedRefs } from 'vue'
import { isHasOwn } from './util/is'
import { initStatus } from './defineStatus'
import type { StatusItem } from './type/formStatus'
-import type { UseFormBuilder, UseFormDefaultMessage, UseFormParam, UseFormReturn } from './type/form'
+import type { UseFormBuilder, UseFormDefaultMessage, UseFormLazy, UseFormParam, UseFormReturn } from './type/form'
import { useDirtyFields, useIsError } from './getters'
import { createSubmitter } from './submitter'
-const defaultParam: Required<{ defaultMessage: UseFormDefaultMessage }> = {
+const defaultParam: Required<{ defaultMessage: UseFormDefaultMessage; lazy: UseFormLazy }> = {
defaultMessage: '',
+ lazy: false,
}
/**
@@ -19,13 +20,13 @@ const defaultParam: Required<{ defaultMessage: UseFormDefaultMessage }> = {
*/
export function useForm(param: UseFormParam): UseFormReturn {
const options = Object.assign({}, defaultParam, param)
- const { form: formBuilder, rule: formRule, defaultMessage: formDefaultMessage } = options
+ const { form: formBuilder, rule: formRule, defaultMessage: formDefaultMessage, lazy: formLazy } = options
const initialForm = ref(formBuilder()) as Ref
const form = reactive(formBuilder())
const status = reactive({} as Record)
- initStatus(status, form, initialForm, formDefaultMessage, formRule)
+ initStatus(status, form, initialForm, formDefaultMessage, formLazy, formRule)
const formData = {
form,
diff --git a/src/type/form.ts b/src/type/form.ts
index 4f5fc7e..3f0bf5b 100644
--- a/src/type/form.ts
+++ b/src/type/form.ts
@@ -9,6 +9,7 @@ export type UseFormRule = {
readonly [K in keyof FormT]?: RuleItem | RuleItem[]
}
export type UseFormDefaultMessage = string
+export type UseFormLazy = boolean
export interface UseFormParam {
/** Initial form value */
@@ -17,6 +18,13 @@ export interface UseFormParam {
rule?: UseFormRule
/** Default error message */
defaultMessage?: UseFormDefaultMessage
+ /**
+ * Prevent rules from being automatically verified when data changes,
+ * Unless `verify()` or `status[fieldName].verify()` is called manually to validate the rule.
+ *
+ * @default false
+ * */
+ lazy?: UseFormLazy
}
export interface UseFormReturn {