React Native之高性能Wheel Picker选择组件(日期、省市区)

# 前言

wheel原本是iOS上面的组件,但是在android上面也有很多仿照实现。目前该组件不管是App还是Web端都是比较常用的组件了。在React Native中,目前有下面几种:

* ### 纯js组件

> 譬如[teaset](https://github.com/rilyu/teaset)中的[wheel](https://github.com/rilyu/teaset/blob/master/docs/cn/Wheel.md)组件,如果对性能要求不高或者对UI定制化较高(因为js代码可以随便改),可以使用该组件。

> 或者使用`react-native-picker`的[纯js版本](https://github.com/beefe/react-native-picker/tree/pure-javascript-version)

* ### 纯原生组件 - 自带modal

[react-native-picker](https://github.com/beefe/react-native-picker)

> 很长一段时间均使用该组件,两端均是原生封装,但是该库是将底部弹出的效果也封装在原生了,拓展度很低,如果只需要`底部弹出效果`这种需求,可以使用该组件。

![](https://user-gold-cdn.xitu.io/2020/1/2/16f644beac4c78f3?w=508&h=454&f=jpeg&s=28319)

* ### 纯原生组件 - 纯wheel组件

[react-native-wheel-picker](https://github.com/yatessss/react-native-wheel-picker)

> 该库只是wheel组件,android端使用[https://github.com/AigeStudio/WheelPicker](https://github.com/AigeStudio/WheelPicker)进行封装,iOS使用的RN自带的PickerIOS,根据PickerIOS统一了两端的api(实际上android端的属性比iOS多很多)

<figure class="half" style="display:flex;">

    <img src="https://user-gold-cdn.xitu.io/2020/1/2/16f644beae093ca7?w=368&h=682&f=jpeg&s=15129" width="45%"/>

    <div style="width:10px;"></div>

    <img src="https://user-gold-cdn.xitu.io/2020/1/2/16f644beaf6baee7?w=400&h=640&f=jpeg&s=23458" width="45%"/>

</figure>

# 介绍

上面的库中[https://github.com/AigeStudio/WheelPicker](https://github.com/AigeStudio/WheelPicker)是最符合我的要求的,只是wheel view组件,可以很方便的进行拓展,但是该库目前存在几个问题

* 作者已不在维护了,存在几个很严重的bug,并且并不支持RN的新版本了

* 只有单wheel,我们一般都需要多wheel的支持,并且需要封装一些常用的功能

所以基于以上原因,根据该库修改和拓展了下面功能:

* <span style="color: #006AB1;">修复几处严重bug,支持RN新版本</span>

* <span style="color: #006AB1;">添加typescript定义文件</span>

* <span style="color: #006AB1;">封装多Wheel支持(支持普通和级联模式)</span>

* <span style="color: #006AB1;">封装常用的DatePicker、RegionPicker、DateRangePicker组件</span>

由于两端均是原生组件,性能较好,所有的其他组件均是单个wheel在js端实现,后面bug修复可以直接修改js,方便热更新。

<span style="color: red;">该库的缺点:</span>

* iOS和android端的UI并不完全一致(原生组件决定,具体效果可以看最下面的效果图)

* PickerIOS不支持的功能,该库均不支持, 譬如修改分隔符的颜色(这个在的暗黑模式下可能需要),虽然android端可以实现,但为了两端统一并未宝露出api,看后面的需求

如有任何问题,可以去这里反馈

[https://github.com/yz1311/react-native-wheel-picker](https://github.com/yz1311/react-native-wheel-picker)

# demo

https://github.com/yz1311/code-push-server-app/blob/dev/src/pages/demo/wheelPickerDemo.tsx

![](https://user-gold-cdn.xitu.io/2020/1/3/16f6b32f45123b8a?w=388&h=712&f=jpeg&s=26415)

# 集成

该版本api可能会有变更,所以处于测试阶段,需要安装beta版本

```Javascript

npm i @yz1311/react-native-wheel-picker@0.2.0-beta15 --save

```

### 自动集成

RN>=0.60,会自动auto linking,无需操作

RN<0.60

```

react-native link @yz1311/react-native-wheel-picker

```

### 手动集成

Add in settings.gradle

```

include ':react-native-wheel-picker'

project(':react-native-wheel-picker').projectDir = new File(settingsDir, '../node_modules/@yz1311/react-native-wheel-picker/android')

Add in app/build.gradle

compile project(':react-native-wheel-picker')

Modify MainApplication

import com.zyu.ReactNativeWheelPickerPackage;

......

protected List<ReactPackage> getPackages() {

    return Arrays.<ReactPackage>asList(

        new MainReactPackage(), new ReactNativeWheelPickerPackage()

    );

}

```

# 简介

该库(>=0.2.0)提供了多种Picker,全部均是view,相比直接提供Modal+picker的模式,单纯的picker view更加灵活,想怎么组合都行

```

import WheelPicker ,{CommonPicker,DateRangePicker,DatePicker,RegionPicker} from "@yz1311/react-native-wheel-picker";

```

### 基础Picker

* <font color='#E50F42'>WheelPicker:</font> 单个的wheel,是所有其他picker的基础控件,基于原生封装(iOS是RN自带的PickerIOS,android封装自cn.aigestudio.wheelpicker:WheelPicker)

* <font color='#E50F42'>CommonPicker:</font>

基于`WheelPicker`封装的多Wheel picker组件,支持`parallel`(wheel间不关联)和`cascade`(wheel间关联)两种模式,基本所有单、多wheel组件均可以直接使用

该组件或者在该组件上封装

### 常用Picker

* <font color='#E50F42'>DatePicker:</font> 基于`CommonPicker`封装的日期选择组件,支持日期/时间/日期+时间 三种模式

* <font color='#E50F42'>DateRangePicker:</font> 基于`CommonPicker`封装的日期段选择组件,可以选择一个时间段

* <font color='#E50F42'>RegionPicker:</font> 基于`CommonPicker`封装的地址选择组件,支持选择省市区,封装了2019/01月的省市区数据,支持自定义数据源

各组件的具体属性,请查看[index.d.ts](https://juejin.im/post/index.d.ts)

# 例子

### 引用

```

import WheelPicker ,{CommonPicker,DateRangePicker,DatePicker,RegionPicker} from "@yz1311/react-native-wheel-picker";

```

* ### 单wheel

```

<CommonPicker

    pickerData={['刘备', '张飞', '关羽', '赵云', '黄忠', '马超', '魏延', '诸葛亮']}

    selectedValue={['']} />

```

![](https://user-gold-cdn.xitu.io/2020/1/2/16f644beaf402943?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)

* ### 多wheel(parallel模式)

```

<CommonPicker

    pickerData={[['男','女'],['0~20岁','21~40岁','40~60岁','60岁以上']]}

    selectedValue={['']} />

```

![](https://user-gold-cdn.xitu.io/2020/1/2/16f644beb07b2308?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)

* ### 多wheel(cascade模式)

```

<CommonPicker

    pickerData={{

        '男': ['打游戏', '电子产品', '看球'],

        '女': ['买衣服', '买鞋子', '美妆', '自拍']

        }}

        selectedValue={['男','电子产品']} />

```

![](https://user-gold-cdn.xitu.io/2020/1/2/16f644beb1b7846b?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)

* ### 日期选择(默认date模式,支持date/time/datetime)

```

<DatePicker

    mode={'date'}

    />

```

**<span style='color:#FF4E2E'>date模式:</span>**

![](https://user-gold-cdn.xitu.io/2020/1/2/16f644bed67f8dbb?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)

**<span style='color:#FF4E2E'>time模式:</span>**

![](https://user-gold-cdn.xitu.io/2020/1/2/16f644bed9bd8b8a?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)

**<span style='color:#FF4E2E'>datetime模式:</span>**

![](https://user-gold-cdn.xitu.io/2020/1/2/16f644bedfa9527c?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)

* ### 日期段选择

```

<DateRangePicker

    />

```

![](https://user-gold-cdn.xitu.io/2020/1/2/16f644bedf9ea8c1?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)

* ### 地址选择

```

<RegionPicker

        onPickerConfirm={(names, codes)=>{

            //names: ["上海市", "市辖区", "黄浦区"]

            //codes: ["31", "3101", "310101"]

        }}

        selectedValue={['']} />

```

![](https://user-gold-cdn.xitu.io/2020/1/2/16f644bee0608177?imageView2/0/w/1280/h/960/format/webp/ignore-error/1)

# 截图(android/iOS)

* ## datePicker

<div>

    <img src='https://user-gold-cdn.xitu.io/2020/1/2/16f644bee415c6bc?imageView2/0/w/1280/h/960/format/webp/ignore-error/1' width='45%' />

    <img src='https://user-gold-cdn.xitu.io/2020/1/2/16f644befbc4d5ac?imageView2/0/w/1280/h/960/format/webp/ignore-error/1' width='45%' />

</div>

* ## dateRangePicker

<div>

    <img src='https://user-gold-cdn.xitu.io/2020/1/2/16f644bf05c3744e?imageView2/0/w/1280/h/960/format/webp/ignore-error/1' width='45%' />

    <img src='https://user-gold-cdn.xitu.io/2020/1/2/16f644bf0bb8aaf3?imageView2/0/w/1280/h/960/format/webp/ignore-error/1' width='45%' />

</div>

* ## regionPicker

<div>

    <img src='https://user-gold-cdn.xitu.io/2020/1/2/16f644bf0f2f7c0f?imageView2/0/w/1280/h/960/format/webp/ignore-error/1' width='45%' />

    <img src='https://user-gold-cdn.xitu.io/2020/1/2/16f644bf0f814241?imageView2/0/w/1280/h/960/format/webp/ignore-error/1' width='45%' />

</div>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容