NumberPicker 数字输入框

如果项目中使用的是 0.x 版本的基础组件(@icedesign/base, @ali/ice, @alife/next),请在左侧导航顶部切换组件版本。

安装方法

  1. 在命令行中执行以下命令npm install @alifd/next@latest -S

开发指南

何时使用

数字选择器,并对输入的数据做正确性检查、自动订正。

注意事项

  • 自动订正可能会导致onChange返回值和你输入的数据不一样。

  • 其中有些中间输入状态无法触发onChange,主要考虑到自动订正可能永远无法到达想要的值了。例如:

    • 0=>0.=>0.0=>0.01 中间两步不会触发onChange,因为如果订正会一直停留在0导致永远无法到达想要的值

    • min=10 的情况下, 输入 1=>12 第一步 1 不会触发onChange也不会订正数据,因为数字是一个一个输入的

  • 如果输入时没触发onChange,会在onBlur检测数据正确性并触发onChange

API

NumberPicker

参数说明类型默认值
size大小可选值:'large', 'medium'Enum'medium'
type设置类型可选值:'normal'(普通)'inline'(内联)Enum'normal'
value当前值Number-
defaultValue默认值Number-
disabled是否禁用Boolean-
step步长Number/String1
precision保留小数点后位数Number0
editable用户是否可以输入Booleantrue
autoFocus自动焦点Boolean-
onChange数值被改变的事件签名:Function(value: Number, e: Event) => void参数:value: {Number} 数据e: {Event} DOM事件对象Functionfunc.noop
onKeyDown键盘按下签名:Function() => voidFunctionfunc.noop
onFocus焦点获得签名:Function() => voidFunction-
onBlur焦点失去签名:Function() => voidFunctionfunc.noop
onCorrect数值订正后的回调签名:Function(obj: Object) => void参数:obj: {Object} {currentValue,oldValue:String}Functionfunc.noop
max最大值NumberInfinity
min最小值Number-Infinity
format格式化当前值签名:Function(value: Number) => String/Number参数:value: {Number} null返回值:{String/Number} nullFunction-
upBtnProps增加按钮的propsObject-
downBtnProps减少按钮的propsObject-
label内联 labelReactNode-
innerAfterinner afterReactNode-

ARIA and KeyBoard

按键说明
Up Arrow数字增加
Down Arrow数字减小

代码示例

基本用法

onChange 第二个参数 e.type 可以获取事件类型。

如果是点击+ - 触发,可以通过 e.triggerType 获取

NumberPicker 数字输入框 - 图1

查看源码在线预览

  1. import { NumberPicker } from '@alifd/next';
  2. function onChange(value, e) {
  3. console.log(value, e.type, e.triggerType);
  4. }
  5. ReactDOM.render(
  6. <div>
  7. <NumberPicker onChange={onChange}/>
  8. <br/><br/>
  9. <NumberPicker defaultValue={0} type="inline" onChange={onChange}/>
  10. </div>,
  11. mountNode
  12. );

不可直接输入

用户不可直接输入编辑数据

NumberPicker 数字输入框 - 图2

查看源码在线预览

  1. import { NumberPicker, Button } from '@alifd/next';
  2. class App extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. this.state = {
  6. editable: false,
  7. value: 0
  8. };
  9. }
  10. toogle() {
  11. this.setState({
  12. editable: !this.state.editable
  13. });
  14. }
  15. onChange(value) {
  16. console.log('changed', value);
  17. this.setState({
  18. value: value
  19. });
  20. }
  21. render() {
  22. return (<div>
  23. <NumberPicker onChange={this.onChange.bind(this)} value={this.state.value}
  24. editable={this.state.editable}/><br/><br/>
  25. <Button onClick={this.toogle.bind(this)}>Toggle to {!this.state.editable ? 'editable' : 'uneditable'}</Button>
  26. </div>);
  27. }
  28. }
  29. ReactDOM.render(<App/>, mountNode);

最大最小值

min max 来限制value的最大最小值。

当数据自动订正会触发 onCorrect

NumberPicker 数字输入框 - 图3

查看源码在线预览

  1. import { NumberPicker } from '@alifd/next';
  2. function onChange(value, e) {
  3. console.log('onChange', value, e);
  4. }
  5. function onCorrect(obj) {
  6. console.log('onCorrect', obj);
  7. }
  8. ReactDOM.render(
  9. <div>
  10. <NumberPicker type="inline" step={3} min={6} max={30} defaultValue={6}
  11. onChange={onChange} onCorrect={onCorrect}/>
  12. </div>,
  13. mountNode
  14. );

步长

通过step控制每次加减步长

NumberPicker 数字输入框 - 图4

查看源码在线预览

  1. import { NumberPicker } from '@alifd/next';
  2. function onChange(value) {
  3. console.log('changed', value);
  4. }
  5. function onCorrect(obj) {
  6. console.log(obj);
  7. }
  8. ReactDOM.render(
  9. <div>
  10. <NumberPicker defaultValue={0} onChange={onChange} onCorrect={onCorrect} step={.01}/>
  11. </div>, mountNode);

精度

通过 precision 控制小数点位数

NumberPicker 数字输入框 - 图5

查看源码在线预览

  1. import { NumberPicker } from '@alifd/next';
  2. function onChange(value) {
  3. console.log('changed', value);
  4. }
  5. function onCorrect(obj) {
  6. console.log(obj);
  7. }
  8. ReactDOM.render(
  9. <div>
  10. <NumberPicker defaultValue={-3.99} onChange={onChange} onCorrect={onCorrect} step={2} precision={2}/>
  11. </div>, mountNode);

大小

NumberPicker 数字输入框 - 图6

查看源码在线预览

  1. import { NumberPicker } from '@alifd/next';
  2. ReactDOM.render(
  3. <div>
  4. <NumberPicker defaultValue={0} size="large" />
  5. <br/><br/>
  6. <NumberPicker defaultValue={0} size="large" type="inline" />
  7. </div>,
  8. mountNode
  9. );

不可用

不可用的 number picker。

NumberPicker 数字输入框 - 图7

查看源码在线预览

  1. import { NumberPicker } from '@alifd/next';
  2. ReactDOM.render(
  3. <div>
  4. <NumberPicker defaultValue={0} disabled/>
  5. <br/><br/>
  6. <NumberPicker defaultValue={0} type="inline" disabled />
  7. </div>,
  8. mountNode
  9. );

格式化

NumberPicker 数字输入框 - 图8

查看源码在线预览

  1. import { NumberPicker } from '@alifd/next';
  2. const intlize = val => Intl.NumberFormat('en-US').format(val);
  3. ReactDOM.render(
  4. <div>
  5. <NumberPicker format={intlize} defaultValue={5000} />
  6. <br/><br/>
  7. <NumberPicker label="p:" format={val => `${val}%`} defaultValue={85} />
  8. <br/><br/>
  9. <NumberPicker innerAfter="%" />
  10. </div>,
  11. mountNode
  12. );

无障碍

组件内置了部分支持无障碍, 但是额外需要开发者手动设置才能完整支持无障碍: 设置upBtnprops以及downBtnprops,使得读屏软件可以正确表达按键的具体功能。设置aria-live目的是NumberPicker组件值发生改变时,读屏软件会进行读取。

NumberPicker 数字输入框 - 图9

查看源码在线预览

  1. import { NumberPicker } from '@alifd/next';
  2. class App extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. this.state = {
  6. value: 0,
  7. tip: '',
  8. };
  9. this.onChange = this.onChange.bind(this);
  10. }
  11. onChange(value, e) {
  12. let num = '';
  13. if(value >= 0){
  14. num = value;
  15. }else {
  16. num = `negative ${value * -1}`;
  17. }
  18. this.setState({
  19. value: value,
  20. tip: `${num}`,
  21. });
  22. }
  23. render() {
  24. const { value, tip } = this.state;
  25. return (<div>
  26. <span id="a11y-number-picker" aria-live="assertive" aria-label={tip}></span>
  27. <NumberPicker type="inline" value={value} onChange={this.onChange} upBtnProps={{'aria-label':'increasing button'}} downBtnProps={{'aria-label':'decreasing button'}} aria-labelledby="a11y-number-picker" />
  28. </div>);
  29. }
  30. }
  31. ReactDOM.render(<App/>, mountNode);

相关区块

NumberPicker 数字输入框 - 图10

暂无相关区块