美文网首页
React Native之高性能Wheel Picker选择组件

React Native之高性能Wheel Picker选择组件

作者: yz1311 | 来源:发表于2020-01-08 11:26 被阅读0次

# 前言

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>

相关文章

网友评论

      本文标题:React Native之高性能Wheel Picker选择组件

      本文链接:https://www.haomeiwen.com/subject/pmckmqtx.html