Git Product home page Git Product logo

react-native-wheel-picker's Introduction

react-native-wheel-picker

npm version npm version

前言

该库最开始基于react-native-wheel-picker ,修改和拓展了很多功能

android端基于WheelPicker 1.1.2版本(注意不要手动升级到1.1.3)进行封装

ios端基于RN自带的PickerIOS进行封装(从0.3.0已将PickerIOS的代码放在项目中)

在原库的基础上面,进行了下面的修改:

  • 修复几处严重bug,支持RN新版本
  • 添加typescript定义文件
  • 封装多Wheel支持(支持普通和级联模式)
  • 封装常用的DatePicker、RegionPicker、DateRangePicker组件

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

集成

npm i @yz1311/react-native-wheel-picker  moment react-native-modal --save

自动集成

RN>=0.60

cd ios
pod install

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()
        );
    }

React Native Web集成

参考react-native-web文档集成web打包配置: https://necolas.github.io/react-native-web/docs/multi-platform/

接入rn web可参考项目: jaredpalmer/razzlern-web-templateluna

介绍

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

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

基础Picker

  • WheelPicker: 单个的wheel,是所有其他picker的基础控件,基于原生封装(iOS是RN自带的PickerIOS,android封装自cn.aigestudio.wheelpicker:WheelPicker)

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

常用Picker

  • DatePicker: 基于CommonPicker封装的日期选择组件,支持日期/时间/日期+时间 三种模式

  • DateRangePicker: 基于CommonPicker封装的日期段选择组件,可以选择一个时间段

  • RegionPicker: 基于CommonPicker封装的地址选择组件,支持选择省市区,封装了2019/01月的省市区数据,支持自定义数据源

各组件的属性,请查看index.d.ts

例子

引用

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

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

  • 多wheel(parallel模式)

<CommonPicker
        pickerData={[['男','女'],['0~20岁','21~40岁','40~60岁','60岁以上']]}
        selectedValue={['']} />

  • 多wheel(cascade模式)

<CommonPicker
        pickerData={{
            '男': ['打游戏', '电子产品', '看球'],
            '女': ['买衣服', '买鞋子', '美妆', '自拍']
        }}
        selectedValue={['男','电子产品']} />

  • 日期选择(默认date模式,支持year/month/date/time/datetime)

注意: 不管是哪种模式,回调返回的数据都是一个date对象,具体的数值需要自己去转换

year: 选择年份

month: 选择年月

date: 选择年月日

time: 选择时分

datetime: 选择年月日时分(minDate和maxDate无法影响到时分,只能影响到日期,譬如:minDate设置为2010-01-01 08:00:00,依旧可以选择当天00:00~23:59的时间段)

<DatePicker
        mode={'date'}
        //date值可以不填,默认是当前时间
        date={new Date()}
        onPickerConfirm={(value)=>{
            //不管mode的值是哪一种, value均是一个Date对象, 需要转换为所需的值
            //譬如: 如果mode=='year', 则可以通过`moment(value).year()`
        }}
        />

  • 日期段选择

该库是仿照支付宝账单的时间段选择控件来的(支付宝: 我的-账单)

规则介绍(跟支付宝的并非完全一样):

  • 开始时间的选择范围: 当前时间的 前30年~后10年(跟DatePicker的范围一致)

  • 结束时间的范围范围: 选择的开始时间~当前时间的后10年,也就是必须先选择开始时间才能选择结束时间

  • 清空按钮,会设置开始时间为当前时间,结束时间为空

  • 如果已选择开始结束时间,再将开始时间选择为大于结束时间,则会清空结束时间

  • 通过startDate和endDate两个属性可以设置默认值(只能设置默认值,无法从外部更新值)

  • 默认只有同时选择了开始结束时间才会返回值,其中有任意一个没选择,返回的startDate和endDate都是null

<DateRangePicker
        //错误信息(可选)
        errorMessage={this.state.errorMessage}
        onPickerConfirm={(startDate, endDate)=>{
            //注意: startDate和endDate是Date对象, 但是均可能为null
            //如果有需求,必须同时选择开始结束时间的,可以通过判断这两个值是否为空来控制后续操作(譬如不让用户关闭Modal)
        }
       />

  • 地址选择

项目的数据来自于Administrative-divisions-of-Chinapca-code.json,

项目里面已经自带该数据源,也可以用data={require('pca-code.json')}的方式自定义数据源,但必须符合格式

如果需要四级、五级等其它联动模式,可以直接按照RegionPicker改写一下就行了(数据量过大,不宜内置进库)

<RegionPicker
        //模式,'p' | 'pc' | 'pca'三个值分别代表省、省市、省市区 三种模式,默认是pca
        mode="pca"
        onPickerConfirm={(names, codes)=>{
            //names: ["上海市", "市辖区", "黄浦区"],根据mode的不同返回不同长度的数组
            //codes: ["31", "3101", "310101"],根据mode的不同返回不同长度的数组
        }}
        selectedValue={['']} />

* ### 结合Modal使用

大部分情况下Picker都不是只作为view使用,而是底部弹窗选择,下面是react-native-modal 为例的代码:

    <Modal
        style={{flex:1, justifyContent:'flex-end',margin: 0}}
        isVisible={selectDateVisible}
        onBackdropPress={()=>{
            setSelectDateVisible(false);
        }}
        onBackButtonPress={()=>{
            setSelectDateVisible(false);
        }}
        >
        //所有的picker是默认显示header的
        <DatePicker
            pickerTitle='预约时间'
            date={ruleForm.appointmentTime}
            mode={'datetime'}
            onPickerCancel={()=>{
                setSelectDateVisible(false);
            }}
            onPickerConfirm={date=>{
                setRuleForm(prevState => ({
                    ...prevState,
                    appointmentTime: date
                }));
                setSelectDateVisible(false);
            }}
            //大部分情况下不用关注date改变时的数据,下面方法可以删除
            onDateChange={()=>{}}
        />
    </Modal>

在0.2.6版本开始,自带Modal模式

    <DatePicker
        pickerTitle='预约时间'
        date={ruleForm.appointmentTime}
        mode={'datetime'}
        //开启modal模式
        isModal={true}
        //可以自定义modal的一些属性
        modalProps={{
            
        }}
        modalVisible={selectDateVisible}
        //modalVisible回调函数
        onModalVisibleChange={visible => {
            setSelectDateVisible(visible);
        }}
        onPickerCancel={()=>{
            setSelectDateVisible(false);
        }}
        onPickerConfirm={date=>{
            setRuleForm(prevState => ({
                ...prevState,
                appointmentTime: date
            }));
            setSelectDateVisible(false);
        }}
        //大部分情况下不用关注date改变时的数据,下面方法可以删除
        onDateChange={()=>{}}
    />

开发计划

  • CommonPicker支持传入对象数组而不是仅仅纯string/number数组
  • RegionPicker添加省市选择模式
  • 所有的Picker增加自带Modal模式,减少代码量

截图(android/iOS)

datePicker

dateRangePicker

regionPicker

react-native-wheel-picker's People

Contributors

aijason avatar dependabot[bot] avatar hiscc avatar rtpryv010 avatar songhlc avatar yatessss avatar yz1311 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

react-native-wheel-picker's Issues

PickerData的数据类型定义可以从any进一步细化

根据文档用例中的描述,建议将ICommonPickerProps接口中的PickerData类型改为:

type PickerDataBase = string | number
type PickerDataGroup = {[k:string]: PickerDataBase[] | PickerDataGroup}

pickerData: PickerDataBase[] | PickerDataBase[][] | PickerDataGroup

rn0.63 报错

error: Error: Unable to resolve module create-react-class from node_modules/@yz1311/react-native-wheel-picker/WheelCurvedPicker.android.js: create-react-class could not be found within the project.

DatePicker 性能如何优化

低端设备上运行开启DatePicker mode = date min 1950-01-01 5秒才能打开
测试设备:华为C5
有办法优化吗?

WheelPicker组件缺少类型定义,也无法由外部正常使用,建议取消导出

经过对此项目的研究,我发现CommonPicker才是最低层的可以由用户正常访问并使用的组件,WheelPicker并不是为使用这个组件库的用户服务的,而仅仅是组件内部的一个“工具组件”。

在这种情况下,在文档中介绍WheelPicker,并且把WheelPicker作为模块的默认导出,不是一个开箱即用友好型的策略。

我建议把它从文档里彻底删去,并取消export。

有些时候显示的不是想要的,比如展示name,要id

有些时候显示的不是想要的,比如展示name,要id或者其他,是否像ant那样可以支持以下的数据结构,选择的时候返回{ label: '周一', value: 'Mon' }这个每一项整体

export const basicColumns = [ [     { label: '周一', value: 'Mon' },     { label: '周二', value: 'Tues' },     { label: '周三', value: 'Wed' },     { label: '周四', value: 'Thur' },     { label: '周五', value: 'Fri' },   ],   [     { label: '上午', value: 'am' },     { label: '下午', value: 'pm' },   ], ]

ios error

<RegionPicker mode='pca' onPickerConfirm={(names, codes) => {}} selectedValue={['']} />
TypeError: wheelData.findIndex is not a function

Support for react native version 0.66.1

I tried to install the dependencies on my project but I get issue of version conflicts with "react native" and "@gorhom/bottom-sheet". My package.json dependency are,

"@apollo/client": "^3.3.20",
"@gorhom/bottom-sheet": "^4.1.3",
"@gregfrench/react-native-wheel-picker": "^1.2.18",
"@react-native-async-storage/async-storage": "^1.15.9",
"@react-native-community/hooks": "^2.6.0",
"@react-native-community/masked-view": "^0.1.11",
"@react-native-firebase/app": "^12.1.0",
"@react-native-firebase/messaging": "^12.1.0",
"@react-native-picker/picker": "^2.2.0",
"@react-navigation/bottom-tabs": "^6.0.9",
"@react-navigation/core": "^6.1.0",
"@react-navigation/drawer": "^6.1.8",
"@react-navigation/native": "^6.0.6",
"@react-navigation/native-stack": "^6.2.5",
"@react-navigation/stack": "^6.0.11",
"@sentry/react-native": "^2.6.0",
"indicative": "^7.4.4",
"intl": "^1.2.5",
"jwt-decode": "^3.1.2",
"lint-staged": "^11.2.6",
"metro-config": "^0.66.2",
"moment": "^2.29.1",
"react": "^17.0.2",
"react-intl": "^5.20.4",
"react-native": "^0.66.1",
"react-native-appearance": "^0.3.4",
"react-native-config": "^1.4.2",
"react-native-elements": "^3.4.1",
"react-native-event-listeners": "^1.0.7",
"react-native-gesture-handler": "^1.10.3",
"react-native-keyboard-aware-scroll-view": "^0.9.4",
"react-native-keychain": "^7.0.0",
"react-native-linear-gradient": "^2.5.6",
"react-native-markdown-display": "^6.1.6",
"react-native-pager-view": "^5.2.1",
"react-native-progress": "^4.1.2",
"react-native-radio-buttons-group": "^2.2.5",
"react-native-reanimated": "^2.2.3",
"react-native-safe-area-context": "^3.2.0",
"react-native-screens": "^3.4.0",
"react-native-segmented-picker": "^2.0.2",
"react-native-svg": "^12.1.1",
"react-native-tab-view": "^3.0.1",
"react-native-toast-message": "^1.4.9",
"react-native-vector-icons": "^8.1.0",
"react-native-version-number": "^0.3.6",
"victory-native": "^33.0.0"

I get below errors,

npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: [email protected]
npm ERR! Found: [email protected]
npm ERR! node_modules/react-native
npm ERR! react-native@"^0.66.1" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react-native@"^0.63.4" from @yz1311/[email protected]
npm ERR! node_modules/@yz1311/react-native-wheel-picker
npm ERR! @yz1311/react-native-wheel-picker@"*" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!

是否有计划分离出相对纯净的版本?

你好,我看了好多类似的组件,看了你掘金的文章,这个组件很棒!请问是否有计划分离出一个不依赖 Moment 和 Modal 的相对纯净的版本,因为我可能偏向选择 dayjs,然后基于你的组件自行封装日期选择组件。

wheel

image

省市区选择 出现这个错误:
以下是代码
<RegionPicker
onPickerConfirm={(names, codes) => {
console.log(names)
console.log(codes)
//names: ["上海市", "市辖区", "黄浦区"]
//codes: ["31", "3101", "310101"]
}}
selectedValue={''}
/>

68版本好像不能用了?

Could not determine the dependencies of task ':yz1311_react-native-wheel-picker:compileDebugAidl'.

Could not resolve all task dependencies for configuration ':yz1311_react-native-wheel-picker:debugCompileClasspath'.
Could not resolve cn.aigestudio.wheelpicker:WheelPicker:1.1.2.
Required by:
project :yz1311_react-native-wheel-picker
> Could not resolve cn.aigestudio.wheelpicker:WheelPicker:1.1.2.
> Could not get resource 'https://www.jitpack.io/cn/aigestudio/wheelpicker/WheelPicker/1.1.2/WheelPicker-1.1.2.pom'.
> Could not GET 'https://www.jitpack.io/cn/aigestudio/wheelpicker/WheelPicker/1.1.2/WheelPicker-1.1.2.pom'. Received status code 401 from server: Unauthorized

能否开放PickerItem的样式设置


WheelCurvedPicker之下有
textColor: ColorPropType,
textSize: PropTypes.number,
itemStyle: PropTypes.object,
itemSpace: PropTypes.number....等等

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.