基于Taro-UI二次封装的选择器

在Taro-UI中的Picker组件中,当选择了某个选项后,可以得到的是选择了的range 中的第几个,即为索引,比如选择器中的内容如下careSelector,若选择的是一对一,则返回的结果得到的为0,而我真正想要的是它所对应的value的值,对此,就对picker重新进行了封装。

const careSelector=[
 {
   value:1,
   label:'一对一'
 },{
   value:2,
   label:'一对多'
 }
]

 组件实现:

// AdvancedSelect.js

import {Picker, View} from "@tarojs/components";
import {Component} from "react";
import PropTypes from "prop-types";
import './AdvancedSelect.less'

class AdvancedSelect extends Component{
  static propTypes = {
    dataSource: PropTypes.array.isRequired,
    onSuperChange:PropTypes.func.isRequired,
    infoText:PropTypes.string.isRequired,
  };

  constructor(props) {
    super(props);
    this.state={
      selectLabel:"",
    }
  }
  componentDidMount() {
    this.getLabelFromValue();
  }

  componentDidUpdate(prevProps) {
    if (prevProps.defaultValue !== this.props.defaultValue) {
      this.getLabelFromValue();
    }
  }
  getLabelFromValue=()=>{
    const {dataSource=[],defaultValue="",valueType,textType} =this.props;
    let label=0;
    for(let i=0;i<dataSource.length;i++){
      if(defaultValue==dataSource[i][valueType]){
        label=dataSource[i][textType];
        break;
      }
    }
    this.setState({selectLabel:label||''});
  }
  onSelectChange=(e)=>{
    const {onSuperChange,dataSource=[],valueType,textType} =this.props;
    this.setState({selectLabel:dataSource[e.detail.value][textType]}||'')
    onSuperChange(dataSource[e.detail.value][valueType]);
  }
  render() {
    const {dataSource=[],infoText,textType,disabled,defaultValue} =this.props;
    const {selectLabel=''}= this.state;
    return (
      <>
        <View className='GetInfo'>
          <View className='GetInfoText'>{infoText}</View>
          <View className='GetInfoInput'>
            <Picker mode='selector'  range={dataSource} rangeKey={textType} onChange={this.onSelectChange} disabled={disabled}>
              <View className='PickerStyle'>
                {"\u00a0" + selectLabel}
              </View>
            </Picker>
          </View>
        </View>
      </>
    )
  }
}


export  default AdvancedSelect;
//AdvancedSelect.less

.ApplyInfoBox {

  #ApplyInfoHeader {
    width: 100%;
    height: 100rpx;
  }
}

.GetInfo{
  box-sizing: border-box;
  display: flex;
  font-size:small;
  justify-content: space-between;
  width: 100%;
  line-height: 100rpx;
  background: white;
  border-bottom: 1rpx solid rgba(141, 141, 141, 0.14);
  .GetInfoInput{
    width: 60%;
    margin-right: 20rpx;
    .PickerStyle{
      text-align: right;
      font-size: 32rpx;
    }
  }
  .GetInfoText{
    //display: flex;
    width: 40%;
    margin-left: 20rpx;
    font-size: 32rpx;
  }
  .payStyle{
    color: red;
    font-weight:bold;
    font-size: 36rpx;
    margin-right: 20rpx;
  }
}

 组件调用:

<AdvancedSelect
   infoText='陪护类型'
   dataSource={careSelector}
   valueType='value'
   extType='label'
   onSuperChange={(value) => this.handleCareTypeChange({careType:parseInt(value)})}
/>

 参数说明:

参数名称是否必须类型说明
dataSource必须array选择器展示的数据
valueType必须stringdataSource中返回数据的字段名
textType必须stringdataSource中返回数据显示文本的字段名
onSuperChange必须function选择器点击选择事件
infoText必须string选择器文本描述信息
defautValue不必须string选择器默认值value

 参考文档:

Taro-UI官网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值