From 95b37590a37d5f2835fcc2f554b43f444282c399 Mon Sep 17 00:00:00 2001 From: zcj <18137693952@163.com> Date: Tue, 9 Aug 2022 21:59:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(input-number):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=AD=A3=E5=88=99=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__tests__/input-number.spec.tsx | 30 ++++++++- .../input-number/src/input-number-types.ts | 4 ++ .../input-number/src/use-input-number.ts | 6 ++ .../docs/components/input-number/index.md | 65 +++++++++++++++---- 4 files changed, 93 insertions(+), 12 deletions(-) diff --git a/packages/devui-vue/devui/input-number/__tests__/input-number.spec.tsx b/packages/devui-vue/devui/input-number/__tests__/input-number.spec.tsx index cad428e6ee..54162dc613 100644 --- a/packages/devui-vue/devui/input-number/__tests__/input-number.spec.tsx +++ b/packages/devui-vue/devui/input-number/__tests__/input-number.spec.tsx @@ -1,5 +1,5 @@ import { mount } from '@vue/test-utils'; -import { ref } from 'vue'; +import { nextTick, ref } from 'vue'; import DInputNumber from '../src/input-number'; import { useNamespace } from '../../shared/hooks/use-namespace'; @@ -116,4 +116,32 @@ describe('d-input-number', () => { expect(inputWrap.classes()).toContain(noDotNs.m('lg')); wrapper.unmount(); }); + + + it('regular expression check', async () => { + const num = ref(2); + const wrapper = mount({ + setup() { + // 1到50 + const regStr = '^([1-9]|[1-4][0-9]|50)$'; + return () => ; + }, + }); + + const inputInner = wrapper.find(ns.e('input-box')); + expect((inputInner.element as HTMLInputElement).value).toBe('2'); + + num.value = 51; + expect((inputInner.element as HTMLInputElement).value).toBe('2'); + + num.value = 10; + await nextTick(); + expect((inputInner.element as HTMLInputElement).value).toBe('10'); + + // 0 不符合要求返回上次结果 10 + num.value = 0; + expect((inputInner.element as HTMLInputElement).value).toBe('10'); + + wrapper.unmount(); + }); }); diff --git a/packages/devui-vue/devui/input-number/src/input-number-types.ts b/packages/devui-vue/devui/input-number/src/input-number-types.ts index 314f23f508..6e250269c5 100644 --- a/packages/devui-vue/devui/input-number/src/input-number-types.ts +++ b/packages/devui-vue/devui/input-number/src/input-number-types.ts @@ -32,6 +32,10 @@ export const inputNumberProps = { precision: { type: Number, }, + reg: { + type: [RegExp, String] as PropType, + default: '', + }, } as const; export type InputNumberProps = ExtractPropTypes; diff --git a/packages/devui-vue/devui/input-number/src/use-input-number.ts b/packages/devui-vue/devui/input-number/src/use-input-number.ts index d688dbd5cc..56d353f565 100644 --- a/packages/devui-vue/devui/input-number/src/use-input-number.ts +++ b/packages/devui-vue/devui/input-number/src/use-input-number.ts @@ -107,6 +107,12 @@ export function useEvent(props: InputNumberProps, ctx: SetupContext, inputRef: R }; const correctValue = (value: number | string | undefined | null) => { + // 校验正则 + const valueStr = value + ''; + if (props.reg && !valueStr.match(new RegExp(props.reg))) { + return undefined; + } + let newVal = Number(value); // 不是0 是假值或者是NaN返回undefined if (newVal !== 0 && (!Number(value) || Number.isNaN(newVal))) { diff --git a/packages/devui-vue/docs/components/input-number/index.md b/packages/devui-vue/docs/components/input-number/index.md index 7388029140..2f32e27072 100644 --- a/packages/devui-vue/docs/components/input-number/index.md +++ b/packages/devui-vue/docs/components/input-number/index.md @@ -159,7 +159,7 @@ export default defineComponent({ import { defineComponent, ref } from 'vue'; export default defineComponent({ - setup(props) { + setup() { const num1 = ref(1); const num2 = ref(2); const num3 = ref(3); @@ -181,18 +181,61 @@ export default defineComponent({ ::: +### 正则限制 + +:::demo 允许传入正则或正则字符串限制输入,输入时会优先匹配传入的正则,不输入则不限制。 + +```vue + + + +``` + +::: + ### InputNumber 参数 -| 参数名 | 类型 | 默认值 | 说明 | 跳转 Demo | -| :---------- | :-------------- | :-------- | :----------------------- | :-------------------- | -| v-model | `number` | -- | 可选,文本框的值 | [基本用法](#基本用法) | -| step | `number` | 1 | 可选,步数 | [步数](#步数) | -| placeholder | `string` | -- | 可选,文本框 placeholder | [基本用法](#基本用法) | -| max | `number` | Infinity | 可选,输入框的最大值 max | [数值范围](#数值范围) | -| min | `number` | -Infinity | 可选,输入框的最小值 min | [数值范围](#数值范围) | -| disabled | `boolean` | false | 可选,文本框是否被禁用 | [禁用状态](#禁用状态) | -| precision | `number` | -- | 可选,数值精度 | [精度](#精度) | -| size | [ISize](#isize) | 'md' | 可选,文本框尺寸 | [尺寸](#尺寸) | +| 参数名 | 类型 | 默认值 | 说明 | 跳转 Demo | +|:------------|:----------------|:-----------|:-------------------|:-------------------| +| v-model | `number` | -- | 可选,文本框的值 | [基本用法](#基本用法) | +| step | `number` | 1 | 可选,步数 | [步数](#步数) | +| placeholder | `string` | -- | 可选,文本框 placeholder | [基本用法](#基本用法) | +| max | `number` | Infinity | 可选,输入框的最大值 max | [数值范围](#数值范围) | +| min | `number` | -Infinity | 可选,输入框的最小值 min | [数值范围](#数值范围) | +| disabled | `boolean` | false | 可选,文本框是否被禁用 | [禁用状态](#禁用状态) | +| precision | `number` | -- | 可选,数值精度 | [精度](#精度) | +| size | [ISize](#isize) | 'md' | 可选,文本框尺寸 | [尺寸](#尺寸) | +| reg | `RegExp\| string` | -- | 可选,用于限制输入的正则或正则字符串 | [正则限制](#正则限制)| ### InputNumber 事件