美文网首页
ReactNative 原生日期picker,由于项目需要自己写

ReactNative 原生日期picker,由于项目需要自己写

作者: AlwaysLuckyMa | 来源:发表于2020-11-27 13:24 被阅读0次
    日期Picker
    <MCDatePicker
      // 默认日期
      normalDate={2020/11/09} 
      // 是否隐藏
      isHide={this.state.isShow}
      // 选择完回调
      getReturnValue={this.datePickerTitle.bind(this)}
      // 取消picker
      callBackValue={this.callbackCancle.bind(this)}
    />
    
    constructor(props) {
        super(props);
        this.state = { 
          isShow: false, // 显示Picker
          normalDate: "", // 显示文字 
        };
      }
      datePickerTitle(value) {
          this.setState({
            normalDate: value,
          });
      }
      // 所有 Picker 取消回调
      callbackCancle(value) {
        this.setState({
          isShow: value,
        });
      }
    
    
    import React, { Component } from "react";
    import {
      View,
      Text,
      StyleSheet,
      Dimensions,
      Picker,
      Modal,
      Platform,
      TouchableOpacity,
    } from "react-native";
    
    const { height, width } = Dimensions.get("window");
    
    const itemHeight = 80;
    
    var type;
    Platform.OS === "android" ? (type = 0) : (type = 1);
    
    export default class MCDatePicker extends Component {
      constructor(props) {
        super(props);
        dateArr = this.props.normalDate
          ? this.props.normalDate.split("/")
          : ["2020", "11", "9"];
    
        this.state = {
          yearTitle: String(Number(dateArr[0])) + "年", // 年 year
          monthTitle: String(Number(dateArr[1])) + "月", // 月 month
          dayTitle: String(Number(dateArr[2])) + "日", // 日 day
          yearIndex: Number(dateArr[0]) - YearInfo[0],
          monthIndex: Number(dateArr[1]) - 1,
          dayIndex: Number(dateArr[2]) - 1,
        };
      }
    
      UNSAFE_componentWillReceiveProps(nextProps) {
        dateArr = nextProps.normalDate
          ? nextProps.normalDate.split("/")
          : ["2020", "11", "9"];
    
        this.setState({
          yearTitle: String(Number(dateArr[0])) + "年", // 年 year
          monthTitle: String(Number(dateArr[1])) + "月", // 月 month
          dayTitle: String(Number(dateArr[2])) + "日", // 日 day
          yearIndex: Number(dateArr[0]) - YearInfo[0],
          monthIndex: Number(dateArr[1]) - 1,
          dayIndex: Number(dateArr[2]) - 1,
        });
      }
    
      // 取消按钮
      cancle = () => {
        this.props.callBackValue(false);
      };
    
      // 确定按钮
      isOK = () => {
        this.props.getReturnValue(
          YearInfo[this.state.yearIndex] +
            "/" +
            MonthInfo[this.state.monthIndex] +
            "/" +
            DayInfo[this.state.dayIndex]
        );
        this.props.callBackValue(false);
      };
    
      render() {
        const { isHide } = this.props;
        return (
          <Modal
            animationType="fade"
            transparent={true}
            visible={isHide}
            onShow={() => {}}
            onRequestClose={() => {
              this.props.callBackValue(false);
            }}
          >
            <TouchableOpacity
              style={currentViewStyle.modalStyle}
              onPress={() => this.cancle()}
              hitSlop={{ bottom: type === 0 ? -itemHeight : null }}
              activeOpacity={1}
            >
              {/* 确定 取消 */}
              <View style={{ flexDirection: "row", backgroundColor: "white" }}>
                <TouchableOpacity
                  style={currentViewStyle.TOLeftStyle}
                  onPress={() => this.cancle()}
                >
                  <Text>{"取消"}</Text>
                </TouchableOpacity>
    
                <View style={currentViewStyle.lineStyle} />
    
                <TouchableOpacity
                  style={currentViewStyle.TORightStyle}
                  onPress={() => this.isOK()}
                >
                  <Text style={currentViewStyle.TORightTextStyle}>{"确定"}</Text>
                </TouchableOpacity>
              </View>
    
              {/* 日期Picker */}
              <View
                style={{
                  flexDirection: "row",
                  height: type === 0 ? itemHeight : null,
                }}
              >
                {/* 年Picker */}
                <Picker
                  selectedValue={this.state.yearTitle} // 选中状态
                  style={currentViewStyle.pickerStyle}
                  onValueChange={(itemValue, itemIndex) => {
                    this.setState({
                      yearTitle: itemValue, // 选中状态
                      yearIndex: itemIndex, // 当前选中的年份
                    });
                    // // YearInfo MonthInfo DayInfo
                    // this.props.getReturnValue(
                    //   YearInfo[itemIndex] +
                    //     "/" +
                    //     MonthInfo[this.state.monthIndex] +
                    //     "/" +
                    //     DayInfo[this.state.dayIndex]
                    // );
                  }}
                >
                  {YearInfo.map((info, index) => {
                    return (
                      <Picker.Item
                        label={String(info) + "年"}
                        value={String(info) + "年"}
                      />
                    );
                  })}
                </Picker>
    
                {/* 月Picker */}
                <Picker
                  selectedValue={this.state.monthTitle}
                  style={currentViewStyle.pickerStyle}
                  onValueChange={(itemValue, itemIndex) => {
                    this.setState({
                      monthTitle: itemValue,
                      monthIndex: itemIndex,
                    });
                    // YearInfo MonthInfo DayInfo
                    // this.props.getReturnValue(
                    //   YearInfo[this.state.yearIndex] +
                    //     "/" +
                    //     MonthInfo[itemIndex] +
                    //     "/" +
                    //     DayInfo[this.state.dayIndex]
                    // );
                  }}
                >
                  {MonthInfo.map((info, index) => {
                    return (
                      <Picker.Item
                        label={String(info) + "月"}
                        value={String(info) + "月"}
                      />
                    );
                  })}
                </Picker>
    
                {/* 日Picker */}
                <Picker
                  selectedValue={this.state.dayTitle}
                  style={currentViewStyle.pickerStyle}
                  onValueChange={(itemValue, itemIndex) => {
                    this.setState({
                      dayTitle: itemValue,
                      dayIndex: itemIndex,
                    });
                    // YearInfo MonthInfo DayInfo
                    // this.props.getReturnValue(
                    //   YearInfo[this.state.yearIndex] +
                    //     "/" +
                    //     MonthInfo[this.state.monthIndex] +
                    //     "/" +
                    //     DayInfo[itemIndex]
                    // );
                  }}
                >
                  {DayInfo.map((info, index) => {
                    return (
                      <Picker.Item
                        label={String(info) + "日"}
                        value={String(info) + "日"}
                      />
                    );
                  })}
                </Picker>
              </View>
            </TouchableOpacity>
          </Modal>
        );
      }
    }
    
    const currentViewStyle = StyleSheet.create({
      // modal的样式
      modalStyle: {
        backgroundColor: "rgba(1,1,1,0.5)",
        justifyContent: "flex-end",
        flex: 1,
      },
      TOLeftStyle: {
        paddingLeft: 20,
        flex: 4,
        height: 40,
        backgroundColor: "white",
        justifyContent: "center",
      },
      lineStyle: { height: 40, width: 1, backgroundColor: "#F2F2F2" },
      TORightStyle: {
        paddingRight: 20,
        flex: 4,
        height: 40,
        backgroundColor: "white",
        justifyContent: "center",
      },
      TORightTextStyle: {
        textAlign: "right",
        backgroundColor: "white",
      },
      pickerStyle: {
        width: width / 3,
        height: type === 0 ? itemHeight : null,
        backgroundColor: "#F2F2F2",
      },
    });
    
    // YearInfo MonthInfo DayInfo
    // 年
    const YearInfo = [
      "1900",
      "1901",
      "1902",
      "1903",
      "1904",
      "1905",
      "1906",
      "1907",
      "1908",
      "1909",
      "1910",
      "1911",
      "1912",
      "1913",
      "1914",
      "1915",
      "1916",
      "1917",
      "1918",
      "1919",
      "1920",
      "1921",
      "1922",
      "1923",
      "1924",
      "1925",
      "1926",
      "1927",
      "1928",
      "1929",
      "1930",
      "1931",
      "1932",
      "1933",
      "1934",
      "1935",
      "1936",
      "1937",
      "1938",
      "1939",
      "1940",
      "1941",
      "1942",
      "1943",
      "1944",
      "1945",
      "1946",
      "1947",
      "1948",
      "1949",
      "1950",
      "1951",
      "1952",
      "1953",
      "1954",
      "1955",
      "1956",
      "1957",
      "1958",
      "1959",
      "1960",
      "1961",
      "1962",
      "1963",
      "1964",
      "1965",
      "1966",
      "1967",
      "1968",
      "1969",
      "1970",
      "1971",
      "1972",
      "1973",
      "1974",
      "1975",
      "1976",
      "1977",
      "1978",
      "1979",
      "1980",
      "1981",
      "1982",
      "1983",
      "1984",
      "1985",
      "1986",
      "1987",
      "1988",
      "1989",
      "1990",
      "1991",
      "1992",
      "1993",
      "1994",
      "1995",
      "1996",
      "1997",
      "1998",
      "1999",
      "2000",
      "2001",
      "2002",
      "2003",
      "2004",
      "2005",
      "2006",
      "2007",
      "2008",
      "2009",
      "2010",
      "2011",
      "2012",
      "2013",
      "2014",
      "2015",
      "2016",
      "2017",
      "2018",
      "2019",
      "2020",
      "2021",
      "2022",
      "2023",
      "2024",
      "2025",
      "2026",
      "2027",
      "2028",
      "2029",
      "2030",
      "2031",
      "2032",
      "2033",
      "2034",
      "2035",
      "2036",
      "2037",
      "2038",
      "2039",
      "2040",
      "2041",
      "2042",
      "2043",
      "2044",
      "2045",
      "2046",
      "2047",
      "2048",
      "2049",
    ];
    
    // 月
    const MonthInfo = [
      "1",
      "2",
      "3",
      "4",
      "5",
      "6",
      "7",
      "8",
      "9",
      "10",
      "11",
      "12",
    ];
    
    // 日
    const DayInfo = [
      "1",
      "2",
      "3",
      "4",
      "5",
      "6",
      "7",
      "8",
      "9",
      "10",
      "11",
      "12",
      "13",
      "14",
      "15",
      "16",
      "17",
      "18",
      "19",
      "20",
      "21",
      "22",
      "23",
      "24",
      "25",
      "22",
      "27",
      "28",
      "29",
      "30",
      "31",
    ];
    

    相关文章

      网友评论

          本文标题:ReactNative 原生日期picker,由于项目需要自己写

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