PopupPicker 3.0.5

PopupPicker组件结合的组件,能够方便的创建一个可弹出的Picker。

使用说明

引用方式

import { PopupPicker } from '$yo-component';

// 如果你的项目中未使用最新的 ykit-config-yo 插件,可能无法使用上面这个语法糖
// 你仍然可以通过下面这种方式来引用
import PopupPicker from 'yo3/component/popuppicker';

基本用法

PopupPicker组件实际上由两部分组成,一部分是触发弹层打开的区域,另一部分是弹出的带“确定”和“取消”按钮的弹出式选择器。 这样会使 PopupPicker 看起来更像一个网页里的 <select> ,唯一的区别是你可以扩展弹出式选择器的样式而浏览器不能。

和其他表单组件一样,这个组件也是一个严格受控的组件,你需要同时定义 onChangevalue 属性才能让它正常工作。

你应该给 PopupPicker 传入一个唯一子元素,这个子元素将会作为触发区域的内容,同时你还需要通过 touchClass 指定它的触摸反馈效果。

const options = [
  { text: '零', value: 0 },
  { text: '一', value: 1 },
  { text: '二', value: 2 },
  { text: '三', value: 3 },
  { text: '四', value: 4 },
  { text: '五', value: 5 },
  { text: '六', value: 6 },
  { text: '七', value: 7 },
  { text: '八', value: 8 },
  { text: '九', value: 9 }
];

class Demo extends Component {
  constructor(props, context) {
    super(props, context);
    this.state = {
      value: null
    };
  }

  handleChange(value) {
    this.setState({ value });
  }

  render() {
    return (
      <div className="popuppicker-demo">
        <PopupPicker
          options={options}
          value={this.state.value}
          onChange={this.handleChange.bind(this)}
          touchClass="item-touch"
        >
          <div className="demo-item">
            <span className="title">选择序号</span>
            <span className="value">{this.state.value === null ? '请选择' : this.state.value}</span>
          </div>
        </PopupPicker>
      </div>
    );
  }
}

定制popup区域的Header

弹出式选择器的 Header 由确认、取消按钮和标题组成,这些按钮的显示值和可选的标题文本可以通过 popupHeader 定制。

popupHeader={{
  title: '欢迎使用Yo',
  cancelBtn: { text: 'Cancel', touchClass: 'myTouchClass' },
  okBtn: { text: 'OK', touchClass: 'myTouchClass' }
}}

popupHeader 可以设置 titlecancelBtnokBtn 值,它们分别代表位于 Header 中间的标题,Header 左边取消按钮和右边确认按钮的显示值。

如果没有设置 title 值,则不显示标题,左右两边的按钮的默认显示值为“取消”和“确认”,可以通过设置 cancelBtnokBtn 覆盖默认值。

图标按钮

上面介绍的 cancelBtnokBtn 不仅可以为字符串,也可以为一个 jsx 元素。可以将一个图标元素作为 cancelBtn 的值(见下例),这时的取消按钮就是一个叉状的图标了。

popupHeader={{
  title: '欢迎使用Yo',
  cancelBtn: { text: (<i className="regret yo-ico">&#xf077;</i>), touchClass: 'myTouchClass' },
  okBtn: { text: 'OK', touchClass: 'myTouchClass' }
}}

多列 Picker

如果你给 options 属性传入一个二维数组,例如:

const options = [
  [
    { value: 'javascript' },
    { value: 'java' },
    { value: 'c++' },
    { value: 'haskell' },
    { value: 'scheme' }
  ],
  [
    { value: 'functional' },
    { value: 'imperative' }
  ]
];

这时候 PopupPicker 将会变成一个多列的 Picker

<PopupPicker
  // value 可以为 null 或者传入一个数组,对应每一列picker的取值
  value={this.state.value}
  onChange={(value) => {
    // 你接收到的value将会是一个数组,包含了每一列 picker 的值
    this.setState({ value });
  }}
  // 以下这些属性都不变
  duration={200}
  options={options}
  pickerHeight={150}
  // looped 和 unit 现在也支持传入数组以定制每一列 picker 的对应属性,如果传入单个值,则会被应用于所有的 picker 上
  looped={[true, false]}
  unit={['language', 'paradigm']}
>
  {this.renderField(this.state.value)}
</PopupPicker>

beforePopupShow 属性

该属性传递的回调函数在点击触发区域后,Popup 弹层弹出前执行。当其返回值为 false 时,Popup 弹出层将不会弹出。

在业务中,PopupPickerPopupDateTimePicker 选择器的值可能跟其他项有关联。例如,当前选择器只能在上一个选择器有了选择值之后才能进行选择。若上一个选择器还没有选择值时,该选择器在点击时不能触发弹出层,同时还应该向用户展示一个提示。这个时候可以通过 beforePopupShow 属性传递一个函数调用 Toast.show 显示一条通知,并将其返回值设为 false 表示不触发弹出层。

render() {
  return (
    <div className="popuppicker-demo">
      <PopupPicker
        options={options}
        value={this.state.value}
        onChange={this.handleChange.bind(this)}
        beforePopupShow={() => {
          Toast.show('before popup show');
          return false;
        }}
        touchClass="item-touch"
      >
        <div className="demo-item">
          <span className="title">选择序号</span>
          <span className="value">{this.state.value === null ? '请选择' : this.state.value}</span>
        </div>
      </PopupPicker>
    </div>
  );
}

手动控制弹出式选择器的显示和隐藏

通过 React 的 ref 属性来获取 PopupPicker 组件的引用,然后调用该引用的 showhide 方法即可控制弹出式选择器的显示和隐藏。

render() {
  return (
    <div className="popuppicker-demo">
      <PopupPicker
        ref={component => {
            this.popupPickerCom = component;
        }}
        // ...
      >
        {/* ... */}
      </PopupPicker>
    </div>
  );
}

this.popupPickerCom.show(); // 显示弹出式选择器
this.popupPickerCom.hide(); // 隐藏弹出式选择器
属性

touchClass { String } #

定制触发区域和弹出式选择器触摸时附加的 className,必须

默认值: null

value { Number/String/Array } #

组件的 value,参考网页select标签的 value 属性。

value 是一个严格受控属性,只能通过的父组件改变,你需要设置 onChange 属性来控制 value 属性的变化。

在开启了多列模式的情况下(通过设置options属性为一个二维数组),这个属性也应该相应地传入一个数组,每个元素对应着该列的value。 如果value数组和options数组的length不相等,那么空缺的value会被设为null。

默认值: null

onChange { Function } #

弹出式选择器 Ok 按钮点击后的回调,必须。

方法参数:

参数名 类型 描述 支持版本
value 当前的 option 的 value,如果开启了多列模式,那么返回值将是一个包含了每一列value的数组。

onSelect { Function } 3.0.16 #

当选择器选择值发生改变时的回调。

方法参数:

参数名 类型 描述 支持版本
value 当前的 option 的 value,如果开启了多列模式,那么返回值将是一个包含了每一列value的数组。

options { Array/Array } #

Picker组件的 options 属性。数组形式,元素的格式为{text:string,value:string}

text 为 option 显示的文本,value 为 option 对应的真实值(参考网页 option 标签),

text 的缺省值为 value,value 必须传入,且只能为字符串/数字类型。

如果你传入一个二维数组,那么PopupPicker将会是一个多列的Picker,二维数组的每一个子数组将会作为对应列的option。

默认值: null

popupHeader { Object } #

popup 区域头部的标题和按钮定制,分别为 title、okBtn 和 cancelBtn,

通过 title 键值定制 Popup 组件头部的标题文本。

通过 text 和 touchClass 键值定制按钮显示的文本和触摸按钮时附加的 className

默认值: { title: '', okBtn: { text: '确定', touchClass: 'action-touch' }, cancelBtn: { text: '取消', touchClass: 'action-touch' } }

duration { Number } #

Popup组件的 duration 属性。组件内容显隐时,动画执行时间,单位:ms

默认值: 200ms

pickerHeight { Number } #

Picker组件的 height 属性。控制 Picker 组件显示的内容高度

默认值: 150

looped { Bool } #

Picker组件的 looped 属性。是否采用循环模式,默认为 true。

这个属性可以接收两种形式的参数,如果你传入Bool类型,那么将会应用于所有的列上(如果你使用了多列的Picker)。 如果传入一个数组,那么可以针对每一列的Picker分别定义。

默认值: true

unit { Number/String/Array } #

Picker组件的 unit 属性。显示在 picker 右侧的单位。

这个属性可以接收两种形式的参数,如果你传入Number或者String类型,那么将会应用于所有的列上(如果你使用了多列的Picker)。 如果传入一个数组,那么可以针对每一列的Picker分别定义。

默认值: null

popupExtraClass { String } #

附加 popup 区域根节点的额外 class

默认值: null

beforePopupShow { Function } 3.0.8 #

该函数在点击触发区域后,Popup 弹层弹出前执行。当其返回值为 false 时,Popup 弹层将不会弹出。

该属性主要用于 value 值的校验,当 value 值不合法时通过函数控制展示相应的提示。

默认值: null