Picker 选择器

在一组预设值中进行选择,eg:省市区选择。

规则

  • 尽量使用 Picker 来帮助用户完成输入,避免用户通过键盘直接输入。

  • DatePicker 是 Picker 的特定模式。

代码演示

基本

数据级联选择示例. (rc-form 文档)

  1. import { Picker, List, WhiteSpace } from 'antd-mobile';
  2. import { createForm } from 'rc-form';
  3. import { district, provinceLite as province } from 'antd-mobile-demo-data';
  4. // 如果不是使用 List.Item 作为 children
  5. const CustomChildren = (props) => (
  6. <div
  7. onClick={props.onClick}
  8. style={{ backgroundColor: '#fff', padding: '0 0.3rem' }}
  9. >
  10. <span style={{ display: 'inline-block', width: '40%' }}>{props.children}</span>
  11. <span style={{ height: '0.9rem', lineHeight: '0.9rem', float: 'right' }}>{props.extra}</span>
  12. </div>
  13. );
  14. let Test = React.createClass({
  15. getInitialState() {
  16. return {
  17. data: [],
  18. cols: 1,
  19. pickerValue: [],
  20. };
  21. },
  22. onClick() {
  23. setTimeout(() => {
  24. this.setState({
  25. data: province,
  26. });
  27. }, 120);
  28. },
  29. onPickerChange(val) {
  30. console.log(val);
  31. let colNum = 1;
  32. const d = [...this.state.data];
  33. if (val[0] === 'zj') {
  34. d.forEach(i => {
  35. if (i.value === 'zj') {
  36. colNum = 2;
  37. if (!i.children) {
  38. i.children = [{
  39. value: 'zj-nb',
  40. label: '宁波',
  41. }, {
  42. value: 'zj-hz',
  43. label: '杭州',
  44. }];
  45. } else if (val[1] === 'zj-hz') {
  46. i.children.forEach(j => {
  47. if (j.value === 'zj-hz') {
  48. j.children = [{
  49. value: 'zj-hz-xh',
  50. label: '西湖区',
  51. }];
  52. }
  53. });
  54. colNum = 3;
  55. }
  56. }
  57. });
  58. } else {
  59. colNum = 1;
  60. }
  61. this.setState({
  62. data: d,
  63. cols: colNum,
  64. });
  65. },
  66. // setVal() {
  67. // this.props.form.setFieldsValue({
  68. // district: ['340000', '340800', '340822'],
  69. // });
  70. // },
  71. render() {
  72. const { getFieldProps } = this.props.form;
  73. return (<div>
  74. <WhiteSpace size="lg" />
  75. <List style={{ backgroundColor: 'white' }} className="picker-list">
  76. <Picker extra="请选择(可选)" data={district} title="选择地区" {...getFieldProps('district', {
  77. initialValue: ['340000', '341500', '341502'],
  78. })}
  79. >
  80. <List.Item arrow="horizontal">省市区选择</List.Item>
  81. </Picker>
  82. <Picker
  83. data={this.state.data}
  84. cols={this.state.cols}
  85. {...getFieldProps('district2')}
  86. onPickerChange={this.onPickerChange}
  87. >
  88. <List.Item arrow="horizontal" onClick={this.onClick}>省市选择(异步加载)</List.Item>
  89. </Picker>
  90. <Picker data={district} cols={1} {...getFieldProps('district3')} className="forss">
  91. <List.Item arrow="horizontal">选择省份</List.Item>
  92. </Picker>
  93. </List>
  94. <WhiteSpace size="lg" />
  95. <Picker
  96. data={district}
  97. title="选择地区"
  98. extra="请选择(可选)"
  99. value={this.state.pickerValue}
  100. onChange={(v) => this.setState({ pickerValue: v })}
  101. >
  102. <CustomChildren>省市区选择(自定义 children)</CustomChildren>
  103. </Picker>
  104. </div>);
  105. },
  106. });
  107. Test = createForm()(Test);
  108. ReactDOM.render(<Test />, mountNode);
  1. .picker-list .am-list-item .am-list-line .am-list-extra {
  2. flex-basis: initial;
  3. }

Picker选择器 - 图1

API ( 适用平台:WEB、React-Native )

成员说明类型默认值
data数据源Array<{value, label, children: Array}>-
value值, 格式[value1, value2, value3], 对应数据源的N级valueArray-
format格式化选中值的函数(val): void(values) => { return values.join(','); }
cols列数Number3
onChange选中后的回调函数,如果使用rc-form,一般不需要自己处理(val): void-
onPickerChange每列数据选择变化后的回调函数(val): void-
children通常是 List.ItemObjectList.Item
okText选中的文案String确定
dismissText取消选中的文案String取消
title大标题String-
extraPicker children 建议是 List.Item, 如果不是,需要是自定义组件(组件内需处理onClick/extra属性)String请选择

更多参数及支持情况可参考:https://github.com/react-component/m-cascader