From 378b5071119f11b08a623d588bf0595a67dd90c5 Mon Sep 17 00:00:00 2001 From: danranVm Date: Sat, 16 Jan 2021 18:28:40 +0800 Subject: [PATCH] feat(cdk:forms): add utils (#141) re #115 --- packages/cdk/forms/__tests__/utils.spec.ts | 55 ++++++++++++++++++++++ packages/cdk/forms/docs/index.zh.md | 16 +++---- packages/cdk/forms/index.ts | 1 + packages/cdk/forms/src/utils.ts | 15 ++++++ 4 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 packages/cdk/forms/__tests__/utils.spec.ts create mode 100644 packages/cdk/forms/src/utils.ts diff --git a/packages/cdk/forms/__tests__/utils.spec.ts b/packages/cdk/forms/__tests__/utils.spec.ts new file mode 100644 index 000000000..b5c65103f --- /dev/null +++ b/packages/cdk/forms/__tests__/utils.spec.ts @@ -0,0 +1,55 @@ +import { flushPromises, mount } from '@vue/test-utils' +import { ComponentOptions } from 'vue' +import { AbstractControl } from '../src/controls/abstractControl' +import { useFormControl, useFormGroup } from '../src/useForms' +import { injectControl, provideControl } from '../src/utils' + +const notFindText = 'not find control' + +const getComp = () => { + return { + template: `
{{ modelRef }}
`, + setup() { + const { modelRef } = injectControl('control') || { modelRef: notFindText } + return { modelRef } + }, + } +} + +const getApp = (Comp: ComponentOptions, control: AbstractControl) => { + return mount({ + components: { Comp }, + template: ``, + setup() { + provideControl(control) + }, + }) +} + +describe('utils.ts', () => { + test('basic work', async () => { + const control = useFormControl('text') + const group = useFormGroup({ control }) + const app = getApp(getComp(), group) + + expect(app.text()).toEqual('text') + + control.setValue('text1') + await flushPromises() + + expect(app.text()).toEqual('text1') + }) + + test('not find control work', async () => { + const group = useFormGroup({}) + const app = getApp(getComp(), group) + + expect(app.text()).toEqual(notFindText) + }) + + test('not provide work', async () => { + const app = mount(getComp()) + + expect(app.text()).toEqual(notFindText) + }) +}) diff --git a/packages/cdk/forms/docs/index.zh.md b/packages/cdk/forms/docs/index.zh.md index f0ecd409c..7c4c4a879 100644 --- a/packages/cdk/forms/docs/index.zh.md +++ b/packages/cdk/forms/docs/index.zh.md @@ -8,9 +8,9 @@ cover: 参考自 [@angular/forms](https://angular.cn/guide/forms-overview) -- 显式创建表单模型 -- 函数式的表单验证:内置常用的,提供扩展接口 -- 表单状态管理:valid,invalid, validing,untouched,touched +- 显示创建表单模型: `FormGroup`, `FormArray`, `FormControl` +- 易扩展的表单验证: `Validators`, `ValidatorFn`, `ValidatorFn` +- 响应式的表单状态: `valid`, `invalid`, `validating`, `blurred`, `unblurred` ## 何时使用 @@ -35,9 +35,9 @@ cover: | `required` | 验证表单控件具有非空值 | - | - | 验证失败返回 `{ required: { message: '' } }`| | `requiredTrue` | 验证表单控件的值为 `true` | - | - | 验证失败返回 `{ requiredTrue: { message: '', actual: value } }`| | `email` | 验证表单控件的值是否为 `email` | - | - | 验证失败返回 `{ email: { message: '', actual: value } }`| -| `min()` | 验证表单控件的值大于或等于指定的数字 | number | - | 验证失败返回 `{ min: { message: '', min, actual: value } }`| -| `max()` | 验证表单控件的值小于或等于指定的数字 | number | - | 验证失败返回 `{ max: { message: '', min, actual: value } }`| -| `minLength()` | 验证表单控件的值的长度大于或等于指定的数字 | number | - | 验证失败返回 `{ minLength: { message: '', minLength, actual: value.length } }`| -| `maxLength()` | 验证表单控件的值的长度小于或等于指定的数字 | number | - | 验证失败返回 `{ maxLength: { message: '', maxLength, actual: value.length } }`| +| `min()` | 验证表单控件的值大于或等于指定的数字 | `number` | - | 验证失败返回 `{ min: { message: '', min, actual: value } }`| +| `max()` | 验证表单控件的值小于或等于指定的数字 | `number` | - | 验证失败返回 `{ max: { message: '', min, actual: value } }`| +| `minLength()` | 验证表单控件的值的长度大于或等于指定的数字 | `number` | - | 验证失败返回 `{ minLength: { message: '', minLength, actual: value.length } }`| +| `maxLength()` | 验证表单控件的值的长度小于或等于指定的数字 | `number` | - | 验证失败返回 `{ maxLength: { message: '', maxLength, actual: value.length } }`| | `pattern()` | 验证表单控件的值匹配一个正则表达式 | `string \| RegExp` | - | 验证失败返回 `{ pattern: { message: '', pattern, actual: value } }`| -| `setMessages()` | 设置验证失败的提示信息 | ErrorMessages | - | 每次设置的 `messages` 会跟之前的进行合并 | +| `setMessages()` | 设置验证失败的提示信息 | `ErrorMessages` | - | 每次设置的 `messages` 会跟之前的进行合并 | diff --git a/packages/cdk/forms/index.ts b/packages/cdk/forms/index.ts index a8d8322d1..baddc78a9 100644 --- a/packages/cdk/forms/index.ts +++ b/packages/cdk/forms/index.ts @@ -4,4 +4,5 @@ export * from './src/controls/formControl' export * from './src/controls/formGroup' export * from './src/types' export * from './src/useForms' +export * from './src/utils' export * from './src/validators' diff --git a/packages/cdk/forms/src/utils.ts b/packages/cdk/forms/src/utils.ts new file mode 100644 index 000000000..5a662fd18 --- /dev/null +++ b/packages/cdk/forms/src/utils.ts @@ -0,0 +1,15 @@ +import type { InjectionKey } from 'vue' +import type { AbstractControl } from './controls/abstractControl' + +import { inject, provide } from 'vue' + +const token: InjectionKey = Symbol() + +export function provideControl(control: AbstractControl): void { + provide(token, control) +} + +export function injectControl(path: Array | string): AbstractControl | null { + const controlParent = inject(token) + return controlParent ? controlParent.get(path) : null +}