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=;i<;i++){
data.push(i);
} Picker.init({
pickerData: data,
selectedValue: [],
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 = [
[,,,,,,,,,,,,,,,,,,,,,,,],
[]
]
for(let i = ;i< ;i++){
data[].push(i);
}
this.pickerInit(data,[h,m],'时间选择');
}
//日期 - 天
dates = () => {
let date = new Date();
let y = date.getFullYear();
let m = String(date.getMonth() + );
let d = String(date.getDate());
let data = [];
let year = null;
let month = null;
let maxY = y + ;
let minY = y - ;
for(let i = minY;i <= maxY;i++){
year = new Object();
year[i] = [];
for(let j = ;j<=;j++){
month = new Object();
month[j] = [];
let monthDay = currentMonth(j,i);
let day = [];
for(let k = ;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() + ;
let maxY = y + ;
let minY = y - ;
let data = [
[],
[,,,,,,,,,,,],
]
for(let i = minY;i <= maxY;i++){
data[].push(i);
}
this.pickerInit(data,[y,m],'年月选择');
}
//日期 - 年份
dateYear = () => {
let y = new Date().getFullYear();
let maxY = y + ;
let minY = y - ;
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:,
borderWidth:,
borderRadius:,
borderColor:'#ccc'
},
txt:{
flex:,
lineHeight:,
textAlign:'center',
color:'#444',
fontSize:,
}
});
//计算当月天数
currentMonth = (m,y) => {
var monthDay = ;
switch(m){
case :
case :
case :
case :
case :
case :
case :monthDay = ;break;
case :
case :
case :
case :monthDay = ;break;
case :
if(y % == && y % != || y % == ){
monthDay = ; }else{
monthDay = ;
}
}
return monthDay ;
}
export default Index;
代码地址 https://pan.baidu.com/s/1Qj-fxnDcnWNPlneQy-King
其中 省市区的 json 数据也在里面,可以更换,但是 需要修改数据格式,详细去看github上面的文档
react-native-picker 实现省市区 时间日期组件的更多相关文章
- 基于React Native的Material Design风格的组件库 MRN
基于React Native的Material Design风格的组件库.(为了平台统一体验,目前只打算支持安卓) 官方网站 http://mrn.js.org/ Github https://git ...
- Yii 时间日期组件与composer 下载中出现的问题
首先本篇主要讲3点 一个Yii时间日期组件的两种用法 笔者使用composer下载该组件时出现问题的解决办法 1.composer下载出现的问题 file could not be downloade ...
- [RN] React Native 好用的时间线 组件
React Native 好用的时间线 组件 效果如下: 实现方法: 一.组件封装 CustomTimeLine.js "use strict"; import React, {C ...
- [React Native]高度自增长的TextInput组件
之前我们学习了从零学React Native之11 TextInput了解了TextInput相关的属性. 在开发中,我们有时候有这样的需求, 希望输入区域的高度随着输入内容的长度而增长, 如下: 这 ...
- React Native填坑之旅--Stateless组件
Stateless component也叫无状态组件.有三种方法可以创建无状态组件. 坑 一般一个组件是怎么定义的: 很久以前的方法: const Heading = createClass({ re ...
- React Native学习-调取摄像头第三方组件:react-native-image-picker
近期做的软件中图片处理是重点,那么自然也就用到了相机照相或者相册选取照片的功能. react-native中有image-picker这个第三方组件,但是0.18.10这个版本还不是太支持iPad. ...
- React Native 之轮播图swiper组件
注释:swiper组件是第三方组件 所以在使用之前应该先在命令行安装,然后将第三方的模块引入(第三方模块地址:https://github.com/leecade/react-native-swipe ...
- react native 传值方式之 :子组件通过调用 其父组件传来的方法 传值回其父组件
- beeshell —— 开源的 React Native 组件库
介绍 beeshell 是一个 React Native 应用的基础组件库,基于 0.53.3 版本,提供一整套开箱即用的高质量组件,包含 JavaScript(以下简称 JS)组件和复合组件(包含 ...
随机推荐
- TCP/IP学习20180624
计算机要互相通信.要有标准. TCP/IP协议,很多协议在一起.所以也叫TCP/IP协议族.经常接触的也就十几种. TCP/IP协议族按层次分为四层: 应用层(最上一层,http,ftp,pop3,i ...
- elasticsearch mapping demo
curl -XPUT localhost:9200/local -d '{ "settings" : { "analysis" : { "analyz ...
- boost::function用法详解
要开始使用 Boost.Function, 就要包含头文件 "boost/function.hpp", 或者某个带数字的版本,从 "boost/function/func ...
- C#创建自定义Object对象
, B=,J=}; 记录一下,老写成 var obj = new object() { O=0, B=0,J=0};
- mac nginx 一些资料
http://www.jianshu.com/p/918eb337a206 mac 的nginx 配置目录在/usr/local/etc/nginx 安装之前最好执行brew的update和upgra ...
- springboot(二 如何访问静态资源和使用模板引擎,以及 全局异常捕获)
在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static / ...
- 学习笔记之pandas
Python Data Analysis Library — pandas: Python Data Analysis Library https://pandas.pydata.org/ panda ...
- 廖雪峰Java2面向对象编程-6Java核心类-1字符串和编码
Java的字符串用String表示 1.String特点: 可以直接使用"..."表示一个字符串,不强制使用new String 内容不可变 String s1 = "h ...
- PowerDesigner最基础的使用方法入门学习(二)
1. 生成sql脚本 Database→Generate Database 选择要输出的文件路径,即文件存储路径,并根据需要修改文件名,单击确定后便会生成sql脚本. 在Options选项卡里,可以 ...
- 加入域的计算机重定向到指定的OU
在我曾经呆过一个企业里,我们使用的是AD环境,计算机加入域时,我们需要使用一个单独的加域工具,里面有需要将计算机加入到指定OU的选项.所以每次加域我们都需要找个这个工具,实现加域过程.最后我发现其实最 ...