
https://www.bilibili.com/video/BV1jomdBBE4H/

NumberInput 是控件库中专用于数字输入的组件,支持步进器、范围限制、精度控制等功能,适用于数量输入、价格输入、百分比输入等需要精确数字控制的场景。
数字输入框采用精确易用设计,具有以下特点:
import { NumberInput } from '../components/base'
@Entry
@Component
struct MyPage {
@State number: number = 0
build() {
Column({ space: 20 }) {
// 基础数字输入框
NumberInput({
value: $number,
placeholder: '请输入数字'
})
// 带标签的数字输入框
NumberInput({
value: $number,
placeholder: '请输入数量',
label: '数量'
})
// 带范围限制的数字输入框
NumberInput({
value: $number,
placeholder: '请输入0-100之间的数字',
label: '百分比',
min: 0,
max: 100
})
}
.width('100%')
.height('100%')
.padding(20)
.justifyContent(FlexAlign.Center)
}
}NumberInput 使用 @Link 实现双向绑定,需要使用 $variableName 语法:
@State number: number = 0
NumberInput({
value: $number // 使用 $ 创建双向绑定
})属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
value | @Link number | - | 数字值(必需,双向绑定) |
placeholder | string | '请输入数字' | 占位符文本 |
label | string | '' | 标签文本 |
hint | string | '' | 提示文本(显示在输入框下方) |
errorMessage | string | '' | 错误提示文本(优先级高于 hint) |
inputSize | 'small' | 'medium' | 'large' | 'medium' | 输入框尺寸 |
disabled | boolean | false | 是否禁用 |
readonly | boolean | false | 是否只读 |
required | boolean | false | 是否必填 |
min | number | Number.NEGATIVE_INFINITY | 最小值 |
max | number | Number.POSITIVE_INFINITY | 最大值 |
step | number | 1 | 步进值 |
precision | number | 0 | 精度(小数位数,0-10) |
showStepper | boolean | true | 是否显示步进器按钮 |
showBrand | boolean | true | 是否显示品牌标识 |
inputWidth | string | number | '100%' | 输入框宽度 |
尺寸 | 高度 | 字体大小 | 按钮大小 | 内边距(左右) |
|---|---|---|---|---|
small | 48vp | 14vp | 24vp | 12vp |
medium | 60vp | 16vp | 28vp | 14vp |
large | 72vp | 18vp | 32vp | 16vp |
@Entry
@Component
struct NumberExample1 {
@State number: number = 0
build() {
Column({ space: 15 }) {
NumberInput({
value: $number,
placeholder: '请输入数字'
})
Text(`当前值:${this.number}`)
.fontSize(14)
.fontColor('#666')
}
.width('100%')
.padding(20)
}
}@Entry
@Component
struct NumberExample2 {
@State number: number = 0
build() {
Column({ space: 15 }) {
NumberInput({
value: $number,
placeholder: '请输入数量',
label: '数量',
hint: '请输入1-100之间的数字'
})
NumberInput({
value: $number,
placeholder: '请输入价格',
label: '价格',
errorMessage: '价格不能为负数'
})
}
.width('100%')
.padding(20)
}
}@Entry
@Component
struct NumberExample3 {
@State percentage: number = 50
build() {
Column({ space: 15 }) {
NumberInput({
value: $percentage,
placeholder: '请输入0-100之间的数字',
label: '百分比',
min: 0,
max: 100,
hint: '范围:0-100'
})
Text(`当前值:${this.percentage}%`)
.fontSize(14)
.fontColor('#666')
}
.width('100%')
.padding(20)
}
}@Entry
@Component
struct NumberExample4 {
@State quantity: number = 0
build() {
Column({ space: 15 }) {
NumberInput({
value: $quantity,
placeholder: '步进值为5',
label: '数量',
step: 5,
min: 0,
max: 100,
hint: '每次增减5'
})
Text(`当前值:${this.quantity}(步进:5)`)
.fontSize(14)
.fontColor('#666')
}
.width('100%')
.padding(20)
}
}@Entry
@Component
struct NumberExample5 {
@State price: number = 0
build() {
Column({ space: 15 }) {
NumberInput({
value: $price,
placeholder: '保留2位小数',
label: '价格',
precision: 2,
min: 0,
step: 0.1,
hint: '保留2位小数'
})
Text(`当前价格:¥${this.price.toFixed(2)}`)
.fontSize(14)
.fontColor('#666')
}
.width('100%')
.padding(20)
}
}@Entry
@Component
struct NumberExample6 {
@State number1: number = 0
@State number2: number = 0
@State number3: number = 0
build() {
Column({ space: 15 }) {
NumberInput({
value: $number1,
placeholder: '小尺寸',
inputSize: 'small'
})
NumberInput({
value: $number2,
placeholder: '中等尺寸(默认)',
inputSize: 'medium'
})
NumberInput({
value: $number3,
placeholder: '大尺寸',
inputSize: 'large'
})
}
.width('100%')
.padding(20)
}
}@Entry
@Component
struct NumberExample7 {
@State number1: number = 0
@State number2: number = 100
@State number3: number = 200
build() {
Column({ space: 15 }) {
NumberInput({
value: $number1,
placeholder: '请输入数字',
label: '必填项',
required: true
})
NumberInput({
value: $number2,
placeholder: '请输入数字',
label: '禁用状态',
disabled: true
})
NumberInput({
value: $number3,
placeholder: '请输入数字',
label: '只读状态',
readonly: true
})
}
.width('100%')
.padding(20)
}
}@Entry
@Component
struct NumberExample8 {
@State number: number = 0
build() {
Column({ space: 15 }) {
NumberInput({
value: $number,
placeholder: '不显示步进器按钮',
label: '数字',
showStepper: false
})
Text('提示:隐藏步进器后,只能通过键盘输入')
.fontSize(14)
.fontColor('#666')
}
.width('100%')
.padding(20)
}
}@Entry
@Component
struct ProductQuantity {
@State quantity: number = 1
@State price: number = 99.99
build() {
Column({ space: 20 }) {
Text('商品信息')
.fontSize(24)
.fontWeight(FontWeight.Bold)
NumberInput({
value: $quantity,
placeholder: '请输入数量',
label: '数量',
min: 1,
max: 999,
step: 1,
hint: '范围:1-999'
})
NumberInput({
value: $price,
placeholder: '请输入价格',
label: '单价',
precision: 2,
min: 0,
step: 0.01,
hint: '保留2位小数'
})
Text(`总价:¥${(this.quantity * this.price).toFixed(2)}`)
.fontSize(18)
.fontWeight(FontWeight.Bold)
.fontColor('#007AFF')
}
.width('100%')
.padding(30)
}
}@Entry
@Component
struct ConfigForm {
@State width: number = 100
@State height: number = 100
@State opacity: number = 100
@State rotation: number = 0
build() {
Column({ space: 20 }) {
Text('参数配置')
.fontSize(24)
.fontWeight(FontWeight.Bold)
NumberInput({
value: $width,
placeholder: '请输入宽度',
label: '宽度',
min: 0,
max: 1000,
step: 1,
required: true
})
NumberInput({
value: $height,
placeholder: '请输入高度',
label: '高度',
min: 0,
max: 1000,
step: 1,
required: true
})
NumberInput({
value: $opacity,
placeholder: '请输入透明度',
label: '透明度',
min: 0,
max: 100,
step: 1,
hint: '范围:0-100'
})
NumberInput({
value: $rotation,
placeholder: '请输入旋转角度',
label: '旋转角度',
min: 0,
max: 360,
step: 1,
precision: 0,
hint: '范围:0-360度'
})
}
.width('100%')
.padding(30)
}
}NumberInput 的所有样式都通过 ComponentTheme 配置,所有配置都在代码中,不依赖JSON文件。
import { ComponentTheme } from '../theme/ComponentTheme'
// 修改主色(影响聚焦状态的边框颜色)
ComponentTheme.PRIMARY_COLOR = '#007AFF'
// 修改错误色(影响错误状态的边框和提示颜色)
ComponentTheme.ERROR_COLOR = '#FF3B30'
// 修改边框颜色
ComponentTheme.BORDER_COLOR = '#E5E5E5'
// 修改圆角
ComponentTheme.BORDER_RADIUS = 8import { ComponentTheme } from '../theme/ComponentTheme'
// 使用 setTheme 方法批量配置
ComponentTheme.setTheme({
primaryColor: '#007AFF',
errorColor: '#FF3B30',
borderRadius: 8,
spacing: 16
})推荐:根据使用场景选择尺寸
min 和 maxhint 说明范围要求step: 1 适用于数量、计数等step: 0.1 或 step: 0.01 适用于价格、百分比等precision: 0 适用于数量、计数等precision: 2 适用于金额、价格等precision: 1 或 precision: 2 适用于比例、折扣等showStepper: true,方便快速调整数值hint 提供输入要求说明errorMessage 显示明确的错误信息A: 不设置 min 和 max,或使用默认值:
NumberInput({
value: $number,
// 不设置 min 和 max,默认无限制
})A: 设置 showStepper: false:
NumberInput({
value: $number,
showStepper: false
})A: 使用 precision 属性:
NumberInput({
value: $price,
precision: 2 // 保留2位小数
})A: 使用 step 属性:
NumberInput({
value: $number,
step: 5 // 每次增减5
})A: 使用 inputWidth 属性:
NumberInput({
value: $number,
inputWidth: 300 // 固定宽度
})
NumberInput({
value: $number,
inputWidth: '100%' // 百分比宽度
})A: 输入无效值(如非数字字符)时:
A: 可以在外部监听 value 变化,进行自定义验证:
@State number: number = 0
@State errorMessage: string = ''
NumberInput({
value: $number,
errorMessage: this.errorMessage
})
// 在 aboutToUpdate 或其他地方验证
aboutToUpdate() {
if (this.number < 0) {
this.errorMessage = '不能为负数'
} else {
this.errorMessage = ''
}
}NumberInput 是控件库中专用于数字输入的组件,具有以下核心特性:
$variableName 创建双向绑定min 和 max 设置范围限制step 设置步进值precision 设置小数精度showStepper 控制步进器显示label 属性添加标签hint 或 errorMessage 显示提示inputSize 属性选择合适尺寸ComponentTheme 自定义全局样式下一篇预告:SearchInput(搜索输入框)详解
本文档属于《鸿蒙PC UI控件库开发系列文章》第9篇