首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 11 章 使用动画
11.1 使用CSS 3创建动画
11.1.1 transition过渡动画
11.1.2 keyframes动画
11.2 使用JavaScript的方式实现动画效果
11.3 Vue过渡动画
11.3.1 定义过渡动画
11.3.2 设置动画过程中的监听回调
11.3.3 多个组件的过渡动画
11.3.4 列表过渡动画
11.4 实战:优化用户列表页面
第 12 章 Vue CLI工具的使用
12.1 Vue CLI工具入门
12.1.1 Vue CLI工具的安装
12.1.2 快速创建Vue项目
12.2 Vue CLI项目模板工程
12.2.1 模板工程的目录结构
12.2.2 运行Vue项目工程
12.2.3 vue-class-component库简介
12.3 在项目中使用依赖
12.4 工程构建
12.5 新一代前端构建工具Vite
12.5.1 Vite与Vue CLI
12.5.2 体验Vite构建工具
第 13 章 Element Plus基于Vue 3的UI组件库
13.1 Element Plus入门
13.1.1 Element Plus的安装与使用
13.1.2 按钮组件
13.1.3 标签组件
13.1.4 空态图与加载占位图组件
13.1.5 图片与头像组件
13.2 表单类组件
13.2.1 单选框与多选框
13.2.2 标准输入框组件
13.2.3 带推荐列表的输入框组件
13.2.4 数字输入框
13.2.5 选择列表
13.2.6 多级列表组件
13.3 开关与滑块组件
13.3.1 开关组件
13.3.2 滑块组件
13.4 选择器组件
13.4.1 时间选择器
13.4.2 日期选择器
13.4.3 颜色选择器
13.5 提示类组件
13.5.1 警告组件
13.5.2 消息提示
13.5.3 通知组件
13.6 数据承载相关组件
13.6.1 表格组件
13.6.2 导航组件
13.6.3 标签页组件
13.6.4 抽屉组件
13.6.5 布局容器组件
13.7 实战:教务系统学生表
当前位置:
首页>>
技术小册>>
TypeScript和Vue从入门到精通(四)
小册名称:TypeScript和Vue从入门到精通(四)
### 13.2.4 数字输入框 在Web开发中,数字输入框(Number Input)是一种常用的表单元素,它允许用户输入数字。结合TypeScript的严格类型系统和Vue.js的响应式数据绑定,我们可以创建出既高效又类型安全的数字输入框组件。本章节将深入探讨如何在Vue项目中利用TypeScript实现一个功能丰富的数字输入框组件,包括基本功能、验证、以及如何与Vue表单集成。 #### 13.2.4.1 引言 数字输入框(`<input type="number">`)是HTML5引入的一种输入类型,它提供了对数字输入的直接支持,包括上下箭头调整值、只允许输入数字等特性。然而,原生`<input type="number">`在某些情况下可能不满足我们的需求,比如限制输入范围、格式化显示(如货币格式)、或者结合Vue的双向绑定进行更复杂的逻辑处理。因此,基于Vue和TypeScript自定义一个数字输入框组件是非常有意义的。 #### 13.2.4.2 基本实现 首先,我们从一个基本的数字输入框组件开始,它接受一个`value`作为`prop`,并通过`v-model`实现双向绑定。 ```vue <template> <div> <input type="number" :value="computedValue" @input="updateValue($event.target.valueAsNumber)" :min="min" :max="max" /> </div> </template> <script lang="ts"> import { defineComponent, PropType, ref, computed } from 'vue'; export default defineComponent({ name: 'NumberInput', props: { modelValue: { type: Number as PropType<number | null>, required: true, default: null }, min: { type: Number, default: Number.MIN_SAFE_INTEGER }, max: { type: Number, default: Number.MAX_SAFE_INTEGER } }, setup(props, { emit }) { const internalValue = ref(props.modelValue); const computedValue = computed({ get: () => internalValue.value, set: (newValue) => { if (newValue >= props.min && newValue <= props.max) { internalValue.value = newValue; emit('update:modelValue', newValue); } } }); const updateValue = (value: number) => { computedValue.value = value; }; return { computedValue, updateValue }; } }); </script> ``` **注意**:这里使用了Vue 3的Composition API,并通过`computed`来处理值的获取与设置,确保它符合`min`和`max`的限制。然而,直接在模板中使用`:value`和`@input`来双向绑定可能无法完全按照预期工作,因为`valueAsNumber`可能不是所有浏览器都支持,且`@input`在某些情况下(如粘贴非数字文本)可能不会触发。因此,在实际应用中,可能需要更复杂的逻辑来处理这些情况。 #### 13.2.4.3 改进双向绑定 为了改进双向绑定的处理,我们可以使用Vue 3的`v-model`修饰符,或者完全自定义双向绑定的行为。这里,我们采用自定义双向绑定的方式,通过监听`input`和`change`事件来更新内部值,并适当使用`emit`来通知父组件。 ```vue <template> <div> <input type="number" :value="internalValue" @input="handleInput" @change="handleChange" :min="min" :max="max" /> </div> </template> <script lang="ts"> // ...(省略部分代码,与上例相似) setup(props, { emit }) { // ...(省略部分代码,与上例相似) const handleInput = (event: Event) => { const target = event.target as HTMLInputElement; const newValue = target.valueAsNumber || 0; // 处理非数字输入 if (newValue >= props.min && newValue <= props.max) { internalValue.value = newValue; } }; const handleChange = (event: Event) => { emit('update:modelValue', internalValue.value); }; // ...(省略部分代码,与上例相似) return { internalValue, handleInput, handleChange }; } </script> ``` #### 13.2.4.4 格式化显示 在某些情况下,我们可能希望数字以特定格式显示(如货币格式),但在内部处理时仍然使用原始数字。这可以通过计算属性来实现。 ```vue <template> <div> <input type="text" <!-- 改为text以允许格式化显示 --> :value="formattedValue" @input="handleInput" readonly /> </div> </template> <script lang="ts"> // ...(省略部分代码) import { formatNumber } from './utils'; // 假设这是一个格式化数字的工具函数 setup(props, { emit }) { // ...(省略部分代码) const formattedValue = computed(() => { return formatNumber(internalValue.value, { locale: 'en-US', style: 'currency', currency: 'USD' }); }); const handleInput = (event: Event) => { // 这里需要实现更复杂的逻辑来解析用户输入并更新internalValue // ... }; // ...(省略部分代码) return { // ...(省略部分代码) formattedValue }; } </script> ``` 注意,当输入框类型改为`text`时,我们需要自己处理输入验证和格式化逻辑,这可能会更复杂,特别是当用户粘贴或输入非数字文本时。 #### 13.2.4.5 验证与错误处理 数字输入框的验证通常包括检查输入是否在指定范围内,以及是否为有效的数字格式。在Vue中,我们可以使用计算属性或watcher来实时检查输入值,并在不满足条件时显示错误信息。 ```vue <template> <div> <input type="number" :value="computedValue" @input="updateValue($event.target.valueAsNumber)" :min="min" :max="max" /> <span v-if="errorMessage" class="error">{{ errorMessage }}</span> </div> </template> <script lang="ts"> // ...(省略部分代码) setup(props, { emit }) { // ...(省略部分代码) const errorMessage = computed(() => { if (isNaN(internalValue.value) || internalValue.value < props.min || internalValue.value > props.max) { return '请输入有效的数字,并在指定范围内。'; } return ''; }); // ...(省略部分代码) return { // ...(省略部分代码) errorMessage }; } </script> ``` #### 13.2.4.6 总结 通过本章节的学习,我们了解了如何在Vue和TypeScript环境下实现一个功能丰富的数字输入框组件。从基本的双向绑定到格式化显示,再到验证与错误处理,我们逐步构建了一个既符合用户期望又类型安全的组件。在实际项目中,根据具体需求,你可能还需要添加更多的特性,如触摸设备支持、键盘导航优化等。希望本章节的内容能为你的Vue和TypeScript之旅提供有价值的参考。
上一篇:
13.2.3 带推荐列表的输入框组件
下一篇:
13.2.5 选择列表
该分类下的相关小册推荐:
Vue.js从入门到精通(一)
TypeScript和Vue从入门到精通(五)
vue项目构建基础入门与实战
TypeScript和Vue从入门到精通(三)
Vue源码完全解析
Vue原理与源码解析
移动端开发指南
VUE组件基础与实战
TypeScript和Vue从入门到精通(二)
Vue.js从入门到精通(四)
Vue3技术解密
Vue面试指南