zoukankan      html  css  js  c++  java
  • react native中利用Picker自定义日期组件(只包含年和月)

    因为业务需求,定义只包含年月的日期,react-native自带组件不符合,第三方鸡肋,于是自己写一个,安卓和IOS样式不同,自己体验
    调用方法示例:
    import PickerData from '..//Picker';
    <PickerData
    visible={store.visibleReferee}
    onCancel={
    () => {
    store.visibleReferee = false;
    return null;
    }
    }
    onRequestClose={
    () => {
    store.visibleReferee = false;
    return null;
    }
    }
    onComfig={(time) => store.comfigTimeReferee(time)}
    />
    // 传递参数:
    visible:  true   false   控制此组件显示和隐藏
    // 回调函数
    onCancel():  点击取消
    onRequestClose(): 物理键返回,此属性不设置会报警告
    onComfig(): 点击确认,回调带参数选择的日期 time (2018-02-01)


    组件代码:

    Picker.js


    import React, { PureComponent } from 'react';
    import {
    View,
    Picker,
    StyleSheet,
    Dimensions,
    Modal,
    TouchableOpacity,
    Alert,

      Text
    } from 'react-native';

    // 默认获取本地时间
    const dataObj = new Date();
    class PickerData extends PureComponent {
    constructor(props) {
    super(props);
    // 默认获取显示本地当前时间
    this.state = {
    datetimeYear: dataObj.getFullYear() + '',
    datetimeMoth: ((dataObj.getMonth() + 1) + '').length <= 1 ?
    ('0' + (dataObj.getMonth() + 1)) : ((dataObj.getMonth() + 1) + ''),
    };
    }
    // 生成列表
    // start 开始时间
    // ender 结束时间

    // str 日期单位

    _renderDeal = (start, ender, str) => {
    const dealRow = [];
    for (let i = start; i < ender; i++) {
    // 月份碰到小于10的加0,例如07月
    if ((i + '').length <= 1) {
    dealRow.push(
    <Picker.Item label={'0' + i + str} value={'0' + i} key={i} />
    );
    } else {
    dealRow.push(
    <Picker.Item label={i + str} value={'' + i} key={i} />
    );
    }
    }
    return dealRow;
    };

    // 格式化日期
    // 两位数月份
    dateFormatting = (temp) => {
    const month = (temp.getMonth() + 1) + '';
    if (month.length <= 1) {
    return temp.getFullYear() + '0' + month;
    } else {
    return temp.getFullYear() + '' + month;
    }
    };

    // 点击确认回调方法onComfig
      comfig = () => {
    const yeartime = this.dateFormatting(dataObj);
    const yeartimeer = this.state.datetimeYear + this.state.datetimeMoth;
    // 用户点错月份
    if (yeartime < yeartimeer) {
    Alert.alert('错误提示', '当月没有记录,请重新选择日期', [{ text: '确定' }]);
    } else {
    // 回调
    this.props.onComfig(yeartimeer);
    }
    };
    render() {
    const { visible } = this.props;

    return (
    <Modal
    visible={visible}
    transparent={true}
    onRequestClose={() => this.props.onRequestClose()}
    >
    <View style={styles.modelSelect}>
    <View style={styles.ViewStyle}>
    <View style={{ borderBottomWidth: 1, borderBottomColor: 'rgb(75,139,249)', padding: 20 }}>
    <Text style={{ fontSize: 20, color: '#000' }}>
    {this.state.datetimeYear + '年' + this.state.datetimeMoth + '月'}
    </Text>
    </View>
    <View style={styles.main}>
    <Picker
    prompt={'请选择年份'}
    mode="dialog"
    selectedValue={this.state.datetimeYear}
    onValueChange={(lang) => { this.setState({ datetimeYear: lang }); }}
    style={styles.switchStyle}
    >
    {this._renderDeal(2016, dataObj.getFullYear() + 1, '年')}
    </Picker>
    <Picker
    prompt={'请选择月份'}
    mode="dialog"
    selectedValue={this.state.datetimeMoth}
    onValueChange={(lang) => { this.setState({ datetimeMoth: lang }); }}
    style={styles.switchStyle}
    >
    {this._renderDeal(1, 13, '月')}
    </Picker>
    </View>
    <View style={{ flexDirection: 'row', borderTopWidth: 1, borderTopColor: 'rgb(75,139,249)' }}>
    <TouchableOpacity onPress={() => this.props.onCancel()}>
    <View style={[styles.cancelStyle, { borderRightWidth: 1, borderRightColor: 'rgb(75,139,249)' }]}>
    <Text style={{ fontSize: 16 }}>取消</Text>
    </View>
    </TouchableOpacity>
    <TouchableOpacity
    onPress={() => { this.comfig(loading); }}
    >
    <View style={styles.cancelStyle}>
    <Text style={{ fontSize: 16, color: '#000' }}>确认</Text>
    </View>
    </TouchableOpacity>
    </View>
    </View>
    </View>
    </Modal>

    );
    }
    }
    const styles = StyleSheet.create({
    main: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center',
    height: 40,
    marginVertical: 20
    },
    switchStyle: {
    140,

    },
    modelSelect: {
    flex: 1,
    justifyContent: 'center',
    backgroundColor: 'rgba(0, 0, 0, 0.5)',
    },
    ViewStyle: {
    Dimensions.get('window').width - 30,
    alignSelf: 'center',
    height: __ANDROID__ ? 240 : 300,
    justifyContent: 'center',
    borderRadius: 10,
    marginHorizontal: 15,
    backgroundColor: '#fff'
    },
    cancelStyle: {
    justifyContent: 'center',
    alignItems: 'center',
    height: 60,
    (Dimensions.get('window').width - 30) / 2,
    }
    });
    export default PickerData;
  • 相关阅读:
    用Python发生RestFul API POST和GET请求
    C# 8.0中的新功能
    A股数据分析之收集数据:股票列表和股价
    A股数据分析之收集数据:公司详细信息
    VS 2019中修改C#语言版本
    Weak Event Manager
    在WPF中使用MVVM的方式关闭窗口
    C# GDI绘制仪表盘(纯代码实现)
    C#中实现文件拖放打开的方法
    C#设置自定义文件图标实现双击启动
  • 原文地址:https://www.cnblogs.com/zhuyupingit/p/9436471.html
Copyright © 2011-2022 走看看