react-native-picker 实现省市区 时间日期组件


github示例以及详细参数:https://github.com/beefe/react-native-picker  

先 安装 link

npm install react-native-picker

react-native link react-native-picker

然后就可以使用了,具体看文档

例如

import Picker from 'react-native-picker';
let data = [];
for(var i=0;i<100;i++){
    data.push(i);
}
 
Picker.init({
    pickerData: data,
    selectedValue: [59],
    onPickerConfirm: data => {
        console.log(data);
    },
    onPickerCancel: data => {
        console.log(data);
    },
    onPickerSelect: data => {
        console.log(data);
    }
});
Picker.show();

 

 

 

我自己用这个实现了,省市区3级联动 时间日期 选择组件

如图

 

使用示例:

<_Picker title='区域' 
                        cback={(data)=>this.selectPicker(data)}
                        type="provincialUrbanArea"
                    />

 

扩展代码

/*该组件只能在 react-native中使用
 * 先安装 yarn add  react-native-picker  
 * 然后 链接 react-native link react-native-picker
 * cback -- 选择后的回调方法 返回值
 * type -- 组件类型 看 pickerType() 方法定义
 * 还可以定义其他的,自己传数据,需要进行扩展,但是有缺陷,就是 只能按照这种格式,取到的值也是文字,而不能是id, * 如果后端需要id就不能用这个组件 * */ import React, { Component } from 'react'; import {StyleSheet, Text, TouchableHighlight } from 'react-native'; import Picker from 'react-native-picker'; const _Picker = null; class Index extends Component{ constructor(props) { super(props); this.state = { val:this.props.title, data:[] }; } //组件渲染前
 componentWillMount(){ } //组件渲染后
 componentDidMount() { } //组件销毁
 componentWillUnmount(){ _Picker.hide(); } pickerType = () => { //根据类型判断 要显示的 组件数据
        switch (this.props.type){ case 'time'://时间
                this.time(); break; case 'date'://日期
                this.dates(); break; case 'dateMonth'://日期选择年月份
                this.dateMonth(); break; case 'dateYear'://日期选择年份份
                this.dateYear(); break; case 'provincialUrbanArea'://省市区
                this.provincialUrbanArea(); break; case 'provincialUrban'://省市
                this.provincialUrban(); break; } } //时间
    time = () => { let date = new Date(); let h = date.getHours(); let m = date.getMinutes(); let data = [ [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23], [] ] for(let i = 0;i< 60;i++){ data[1].push(i); } this.pickerInit(data,[h,m],'时间选择'); } //日期 - 天
    dates = () => { let date = new Date(); let y = date.getFullYear(); let m = String(date.getMonth() + 1); let d = String(date.getDate()); let data = []; let year = null; let month = null; let maxY = y + 10; let minY = y - 10; for(let i = minY;i <= maxY;i++){ year = new Object(); year[i] = []; for(let j = 1;j<=12;j++){ month = new Object(); month[j] = []; let monthDay = currentMonth(j,i); let day = []; for(let k = 1;k <= monthDay; k++){ month[j].push(k); } year[i].push(month); } data.push(year); } this.pickerInit(data,[y,m,d],'日期选择'); } //日期 - 月份
    dateMonth = () => { let date = new Date(); let y = date.getFullYear(); let m = date.getMonth() + 1; let maxY = y + 10; let minY = y - 10; let data = [ [], [1,2,3,4,5,6,7,8,9,10,11,12], ] for(let i = minY;i <= maxY;i++){ data[0].push(i); } this.pickerInit(data,[y,m],'年月选择'); } //日期 - 年份
    dateYear = () => { let y = new Date().getFullYear(); let maxY = y + 10; let minY = y - 10; let data = [] for(let i = minY;i <= maxY;i++){ data.push(i); } this.setState({ data:data },function(){ this.pickerInit([y],'年份选择'); }.bind(this)); } //省市区
    provincialUrbanArea = () => { let jsonData = require('./area.json'); let data = []; for(let i in jsonData){ let obj = new Object(); obj[i] = jsonData[i]; data.push(obj); } this.pickerInit(data,['北京','北京','东城区'],'省市区'); } //省市
    provincialUrban = () => { let jsonData = require('./area.json'); let data = []; for(let i in jsonData){ let obj = new Object(); let arr = jsonData[i]; for(let j in arr){ obj[i] = []; for(let k in arr[j]){ obj[i].push(k); } } data.push(obj); } this.pickerInit(data,['北京','北京'],'省市'); } //显示Picker组件
    onPresss = () => { this.pickerType(); } render(){ return ( <TouchableHighlight underlayColor="#f1f1f1" style={styles.picker} onPress = {this.onPresss} >
            <Text style={styles.txt}> {this.state.val} </Text>
         </TouchableHighlight> ); } //组件初始化
    pickerInit = (data,selectedValue,title) => { Picker.init({ pickerData:data, selectedValue: selectedValue, pickerTitleText:title, pickerConfirmBtnText:'确定', pickerCancelBtnText:'取消', //确定
            onPickerConfirm: data => { switch (this.props.type){ case 'time'://时间
                        data = data.join(':'); break; case 'date'://日期
                        data = data.join('-'); break; case 'dateMonth'://日期选择年月份
                        data = data.join('-'); break; case 'dateYear'://日期选择年份
                        this.dateYear(); break; case 'provincialUrbanArea'://省市区
                        data = data.join(' '); break; case 'provincialUrban'://省市
                        data = data.join(' '); break; } this.setState({ val:data }); this.props.cback(data); }, //取消
            onPickerCancel: data => { console.log(data); }, //选择
            onPickerSelect: data => { console.log(data); } }); _Picker = Picker; _Picker.show(); } } const styles = StyleSheet.create({ picker:{ height:40, borderWidth:1, borderRadius:3, borderColor:'#ccc' }, txt:{ flex:1, lineHeight:38, textAlign:'center', color:'#444', fontSize:15, } }); //计算当月天数
currentMonth = (m,y) => { var monthDay  = 0; switch(m){ case 1: case 3: case 5: case 7: case 8: case 10: case 12:monthDay = 31;break; case 4: case 6: case 9: case 11:monthDay = 30;break; case 2: if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0){ monthDay = 29; }else{ monthDay = 28; } } return monthDay ; } export default Index;

 

代码地址 https://pan.baidu.com/s/1Qj-fxnDcnWNPlneQy-King

其中 省市区的 json 数据也在里面,可以更换,但是 需要修改数据格式,详细去看github上面的文档

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM