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)组件和复合组件(包含 ...
随机推荐
- Unity单例
引自:http://www.unitymanual.com/thread-16916-1-1.html
- Espresso 开源了
Google Testing Blog上发布了一篇博客,Espresso 开源了 http://googletesting.blogspot.com/2013/10/espresso-for-andr ...
- bzoj3491: PA2007 Subsets
Description 有一个集合U={1,2,…,n),要从中选择k个元素作为一个子集A.若a∈A,则要有a*X不属于A,x是一个给定的数.求可选方案对M取模后的值. 1< = N< = ...
- mysql查询优化之三:查询优化器提示(hint)
目录: <MySQL中的两种临时表>--强制使用临时表 SQL_BUFFER_RESULT <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示( ...
- Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用
ylbtech-Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用 1.返回顶部 1. Java 实例 - enum 和 switch 语句 ...
- andriod InputType.TYPE_NUMBER_FLAG_DECIMAL只能输入数字和小数点无效问题
在java文件里edittext设置InputType.TYPE_NUMBER_FLAG_DECIMAL, 输入法能输入的是文本输入方式(数字.字母.符号等),和想要只能输入数字和小数点背道而驰. 在 ...
- 00013 - top命令详解
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不 ...
- echart力导向图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="GBK" ...
- arcgis连接Oracle数据库
arcgis连接Oracle数据库 配置声明:本人的电脑是win10 64位,安装的Oracle是oracleR11gr2 64 arcgis版本位10.2 安装是在同一台电脑上. 一.首先是安装O ...
- Navicat Premium 将sqlserver 数据库 导入mysql 中
1.新建 MySQL 数据库 2. 3 4 5 6 7 8 9一直点击下一步 10 成功