zoukankan      html  css  js  c++  java
  • 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上面的文档

  • 相关阅读:
    解决“google快照无法打开”的简单而有效的方法~
    在Struts2里面嵌入Spring
    HDU
    设计模式大总结(二)
    Node.js入门笔记
    草图检索和识别[开源]
    2019-10-31-VisualStudio-断点调试详解
    2019-10-31-VisualStudio-断点调试详解
    2019-9-2-C#-设计模式-责任链
    2019-9-2-C#-设计模式-责任链
  • 原文地址:https://www.cnblogs.com/bruce-gou/p/8583793.html
Copyright © 2011-2022 走看看