Appearance
InputNumber 数字输入
用于金额、数量、比例等需要数值约束的输入场景。
基础用法
vue
<template>
<x-input-number v-model="value" :min="0" :max="100" />
<x-input-number :default-value="32" :min="0" :max="100" />
<x-input-number :default-value="500" disabled />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(12);
</script>按钮模式
vue
<template>
<x-input-number v-model="value" :min="0" :max="100" />
<x-input-number v-model="value" mode="button" :min="0" :max="100" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(12);
</script>尺寸
四种尺寸的高度分别为 24px、28px、32px、36px;mode="button" 时两侧按钮与输入框等高。
vue
<template>
<x-input-number v-model="value" size="mini" />
<x-input-number v-model="value" size="small" />
<x-input-number v-model="value" size="medium" />
<x-input-number v-model="value" size="large" />
<x-input-number v-model="value" mode="button" size="mini" />
<x-input-number v-model="value" mode="button" size="small" />
<x-input-number v-model="value" mode="button" size="medium" />
<x-input-number v-model="value" mode="button" size="large" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(12);
</script>精度和步长
3.6
vue
<template>
<x-input-number v-model="value" :step="1.2" :precision="2" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(12);
</script>格式化展示
12000
vue
<template>
<x-input-number
v-model="value"
:min="0"
:formatter="formatter"
:parser="parser"
/>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(12000);
const formatter = (value: string) => {
const values = value.split('.');
values[0] = values[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
return values.join('.');
};
const parser = (value: string) => value.replace(/,/g, '');
</script>前缀和后缀
按钮模式下的前后置内容
mode="button" 时左右两端是加减按钮,prepend / append 插槽会被按钮占用。 需要自定义前后置内容时,请同时指定 hide-button(如上例第四项)。
vue
<template>
<x-input-number v-model="value" allow-clear>
<template #prefix>¥</template>
</x-input-number>
<x-input-number v-model="value" allow-clear hide-button>
<template #suffix>%</template>
</x-input-number>
<x-input-number v-model="value">
<template #prepend>数量</template>
<template #append>件</template>
</x-input-number>
<x-input-number v-model="value" mode="button" hide-button>
<template #prepend>数量</template>
<template #append>件</template>
</x-input-number>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(12);
</script>自定义图标
vue
<template>
<x-input-number v-model="value" :min="0" :max="100">
<template #plus>+</template>
<template #minus>-</template>
</x-input-number>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(12);
</script>触发时机
15
vue
<template>
<x-input-number
v-model="value"
:min="10"
:max="100"
model-event="input"
/>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(12);
</script>状态
vue
<template>
<x-input-number :default-value="12" read-only />
<x-input-number :default-value="12" error />
<x-input-number :default-value="12" disabled />
<x-input-number :default-value="12" mode="button" read-only />
<x-input-number :default-value="12" mode="button" error />
<x-input-number :default-value="12" mode="button" disabled />
</template>事件回调
等待操作
vue
<template>
<x-input-number
v-model="value"
allow-clear
@input="handleInput"
@change="handleChange"
@clear="handleClear"
/>
<p role="status">{{ eventLog }}</p>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(12);
const eventLog = ref('等待操作');
const handleInput = (value: number | undefined, inputValue: string) => {
eventLog.value = `input: ${inputValue || '空'} / ${value ?? '空'}`;
};
const handleChange = (value: number | undefined) => {
eventLog.value = `change: ${value ?? '空'}`;
};
const handleClear = () => {
eventLog.value = 'clear';
};
</script>方法
vue
<template>
<x-input-number ref="inputNumberRef" v-model="value" />
<x-button @click="inputNumberRef?.focus()">聚焦</x-button>
<x-button @click="inputNumberRef?.blur()">失焦</x-button>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(12);
const inputNumberRef = ref();
</script>在 Form 中校验
组件放进 x-form-item 后会自动继承 Form 的尺寸与禁用状态,并按 FormItem 的校验规则展示错误。默认 validateTrigger 为 change,即值变化时触发校验。
vue
<template>
<x-form ref="formRef" :model="formState" :rules="formRules">
<x-form-item field="quantity" label="数量">
<x-input-number v-model="formState.quantity" :min="1" placeholder="请输入数量" />
</x-form-item>
<x-form-item>
<x-space>
<x-button type="primary" @click="handleValidate">校验</x-button>
<x-button @click="handleReset">重置</x-button>
</x-space>
</x-form-item>
</x-form>
<p role="status">{{ validateResult }}</p>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import type { FormInstance, FieldRule } from 'x-next';
const formState = reactive({ quantity: undefined as number | undefined });
const formRules: Record<string, FieldRule[]> = {
quantity: [{ required: true, type: 'number', min: 1, message: '数量至少为 1' }],
};
const formRef = ref<FormInstance>();
const validateResult = ref('');
const handleValidate = async () => {
const errors = await formRef.value!.validate();
validateResult.value = errors
? `校验失败:${Object.values(errors).map((error) => error.message).join(';')}`
: '校验通过';
};
const handleReset = () => {
formRef.value!.resetFields();
validateResult.value = '已重置';
};
</script>按需导入
ts
import { InputNumber } from 'x-next';样式按需引入(base.css 为共享基础层,多个组件只需引入一次):
ts
import 'x-next/style/base.css';
import 'x-next/style/form-input-number.css';Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
modelValue | 绑定值 | number | - |
defaultValue | 默认值,非受控模式 | number | - |
mode | 按钮模式 | 'embed' | 'button' | 'embed' |
precision | 数字精度 | number | - |
step | 数字变化步长 | number | 1 |
disabled | 是否禁用 | boolean | false |
error | 是否错误状态 | boolean | false |
max | 最大值 | number | Infinity |
min | 最小值 | number | -Infinity |
formatter | 展示值格式化 | (value: string) => string | - |
parser | 将展示值解析为数字字符串 | (value: string) => string | - |
placeholder | 占位提示 | string | - |
hideButton | 是否隐藏步进按钮;mode="button" 时同时用于让出 prepend / append 插槽 | boolean | false |
size | 输入框尺寸 | 'mini' | 'small' | 'medium' | 'large' | 跟随全局配置 |
allowClear | 是否允许清空 | boolean | false |
modelEvent | 触发 v-model 更新的事件 | 'change' | 'input' | 'change' |
readOnly | 是否只读 | boolean | false |
inputAttrs | 内部 input 元素属性 | object | - |
Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
update:modelValue | 值更新时触发 | value |
change | 值变化时触发 | value, event |
input | 输入时触发 | value, inputValue, event |
focus | 获取焦点时触发 | event |
blur | 失去焦点时触发 | event |
clear | 点击清除按钮时触发 | event |
keydown | 按下键盘时触发 | event |
Slots
| 插槽名 | 说明 |
|---|---|
prefix | 前缀内容 |
suffix | 后缀内容 |
prepend | 前置标签 |
append | 后置标签 |
plus | 自定义增加按钮图标 |
minus | 自定义减少按钮图标 |
Methods
| 方法 | 说明 |
|---|---|
focus | 使输入框获取焦点 |
blur | 使输入框失去焦点 |