hookehuyr

新增数字输入控件

1 +<!--
2 + * @Date: 2022-09-14 14:44:30
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-11-18 13:50:50
5 + * @FilePath: /data-table/src/components/NumberField/index.vue
6 + * @Description: 数字输入框
7 +-->
8 +<template>
9 + <div class="number-page">
10 + <div class="label">
11 + {{ item.component_props.label }}
12 + <span v-if="item.component_props.required">&nbsp;*</span>
13 + </div>
14 + <van-field
15 + v-model="item.value"
16 + :name="item.name"
17 + :placeholder="item.component_props.placeholder"
18 + :rules="rules"
19 + :required="item.component_props.required"
20 + readonly
21 + @touchstart.stop="showKeyboard"
22 + :border="false"
23 + >
24 + </van-field>
25 + <van-number-keyboard
26 + v-model="item.value"
27 + :show="showInteger"
28 + @blur="showInteger = false"
29 + @input="onInput"
30 + @delete="onDelete"
31 + />
32 + <van-number-keyboard
33 + v-model="item.value"
34 + :show="showDecimal"
35 + theme="custom"
36 + extra-key="."
37 + close-button-text="完成"
38 + @blur="showDecimal = false"
39 + @input="onInput"
40 + @delete="onDelete"
41 + />
42 + </div>
43 +</template>
44 +
45 +<script setup>
46 +const props = defineProps({
47 + item: Object,
48 +});
49 +
50 +const showKeyboard = () => {
51 + if (props.item.component_props.type === "decimal") {
52 + // 显示小数键盘
53 + showDecimal.value = true;
54 + } else {
55 + // 显示整数键盘
56 + showInteger.value = true;
57 + }
58 +};
59 +
60 +const showDecimal = ref(false);
61 +const showInteger = ref(false);
62 +
63 +// // 校验函数返回 true 表示校验通过,false 表示不通过
64 +// // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
65 +// const validator = (val) => {
66 +// if (!props.item.component_props.required) {
67 +// // 非必填
68 +// return true;
69 +// } else {
70 +// return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(val);
71 +// }
72 +// };
73 +// // 错误提示文案
74 +// const validatorMessage = (val, rule) => {
75 +// if (!val) {
76 +// return "身份证号码不能为空";
77 +// } else if (!/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(val)) {
78 +// return "请输入正确身份证号码";
79 +// }
80 +// };
81 +// const rules = [{ validator, message: validatorMessage }];
82 +
83 +const onInput = (value) => {};
84 +const onDelete = () => {};
85 +</script>
86 +
87 +<style lang="less" scoped>
88 +.number-page {
89 + .label {
90 + padding: 1rem 1rem 0 1rem;
91 + font-size: 0.9rem;
92 + font-weight: bold;
93 + span {
94 + color: red;
95 + }
96 + }
97 +}
98 +</style>
...@@ -16,6 +16,7 @@ import SignField from '@/components/SignField/index.vue' ...@@ -16,6 +16,7 @@ import SignField from '@/components/SignField/index.vue'
16 import RatePickerField from '@/components/RatePickerField/index.vue' 16 import RatePickerField from '@/components/RatePickerField/index.vue'
17 import CalendarField from '@/components/CalendarField/index.vue' 17 import CalendarField from '@/components/CalendarField/index.vue'
18 import IdentityField from '@/components/IdentityField/index.vue' 18 import IdentityField from '@/components/IdentityField/index.vue'
19 +import NumberField from '@/components/NumberField/index.vue'
19 20
20 /** 21 /**
21 * 生成自定义组件类型 22 * 生成自定义组件类型
...@@ -56,10 +57,14 @@ export function createComponentType(data) { ...@@ -56,10 +57,14 @@ export function createComponentType(data) {
56 item.autosize = true; 57 item.autosize = true;
57 item.component = TextareaField; 58 item.component = TextareaField;
58 } 59 }
60 + // if (item.component_props.name === 'number') {
61 + // item.type = 'number';
62 + // item.name = item.key;
63 + // item.component = TextField;
64 + // }
59 if (item.component_props.name === 'number') { 65 if (item.component_props.name === 'number') {
60 - item.type = 'number';
61 item.name = item.key; 66 item.name = item.key;
62 - item.component = TextField; 67 + item.component = NumberField;
63 } 68 }
64 if (item.component_props.name === 'radio') { 69 if (item.component_props.name === 'radio') {
65 item.component = RadioField; 70 item.component = RadioField;
......