React-native 下拉弹框选择根据网上省 市 区插件改写

/**  * Created on 2017/2/27.  */  import React,{ PropTypes } from 'react';
import {
    View,Text,Modal,Dimensions,Picker,StyleSheet,TouchableOpacity,Platform,} from 'react-native';

import BaseComponent from './BaseComponent';
import HttpHelper  from '../Utils/HttpHelper';

const windowWidth = Dimensions.get('window').width;
const windowHeight = Dimensions.get('window').height;

const isIos = Platform.OS === 'ios';

export default class WheelPicker extends BaseComponent {

    constructor(props) {
        super(props);
        this._bind(
            'open','close','_handleProvinceChange','_handleCityChange','_handleSubmit','_handleCancel'  );

        this.state = {
            isVisible: this.props.isVisible,provinces: [],citys: [],selectedProvince: this.props.selectedProvince,selectedCity: this.props.selectedCity,selectedProvinceName: this.props.selectedProvinceName,selectedCityName: this.props.selectedCityName,transparent: true,};
    }

    
    _filterAllProvinces() {
        return this._regionAllData.map((item) => {
            return item;
        });
    }

    _filterCitys(provinceId) {
        const provinceData = this._regionAllData.find(item => item.area.id == provinceId);
        return provinceData.ports;
    }

    //_regionAllData 为了提高数据显示速度,该变量在应用启动时异步已经获取,并放入global中存入,另外_regionAllData需要按照固定的json格式返回
     {"area":{"id":10,"name":"东北"},"ports":[{"id":94,"name":"鲅鱼圈","areaId":10},{"id":84,"name":"丹东","areaId":10}
             }]
       }
componentDidMount() {
let
parentThis = this;
parentThis._regionAllData = global.root.regionAllData;
const
provinces = parentThis._filterAllProvinces();
if
(!parentThis.state.selectedProvince) {
parentThis.state.selectedProvince = provinces[0].area.id;
parentThis.state.selectedProvinceName = provinces[0].area.name;
}
const
citys = parentThis._filterCitys(parentThis.state.selectedProvince);
if
(!parentThis.state.selectedCity) {
parentThis.state.selectedCity = citys[0].id;
parentThis.state.selectedCityName = citys[0].name;
}
parentThis.setState({
provinces,
citys,
});
global.root.requestCity();
}
componentWillReceiveProps
(props) {
if
(props.isVisible !== this.props.isVisible) {
if
(props.isVisible) {
this.open();
} else {
this.close();
}
}else if((props.isVisible && this.props.isVisible)==true){
this
.setState({isVisible: props.isVisible});
}
}
close
() {
this
.setState({ isVisible: false });
}
open
() {
this.setState({ isVisible: true });
}
_handleProvinceChange(provinceId,position) {
const cities = this._filterCitys(provinceId);
this.setState({
selectedProvince
: provinceId,
selectedProvinceName:this.state.provinces[position].area.name,
selectedCity: cities[0].id,
selectedCityName:cities[0].name,
citys
:cities
});
}
_handleCityChange(city,position) {
this
.setState({
selectedCity
: city,
selectedCityName
:this.state.citys[position].name
});
}
_handleCancel() {
if (this.props.onCancel) {
this
.props.onCancel();
}
}
_handleSubmit() {
if
(this.props.onSubmit) {
this
.props.onSubmit({
areaId
: this.state.selectedProvince,
areaName
:this.state.selectedProvinceName,
portId: this.state.selectedCity,
portName
:this.state.selectedCityName
});
}
}
renderPicker
() {
const { navBtnColor } = this.props;
return
(
<View style={styles.overlayStyle}>
<View style={[styles.pickerContainer]}>
<View style={styles.navWrap}>
<
TouchableOpacity style={[styles.navBtn,{ borderColor: navBtnColor }]}
activeOpacity={0.85} onPress={this._handleCancel} >
<
Text style={[styles.text,{ color: navBtnColor }]}>取消</Text>
</TouchableOpacity>
<TouchableOpacity style={[styles.navBtn,{ backgroundColor: navBtnColor,borderColor: navBtnColor }]}
activeOpacity={0.85} onPress={this._handleSubmit} >
<
Text style={[styles.text,{ color: 'white' }]}>确认</Text>
</TouchableOpacity>
</
View>
<View style={styles.pickerWrap}>
<Picker style={styles.pickerItem} onValueChange={this._handleProvinceChange}
selectedValue={this.state.selectedProvince} >
{this.state.provinces.map((province,index) => {
return (
<Picker.Item value={province.area.id+''} label={province.area.name} key={index}/>
); })}
</Picker>
<Picker style={styles.pickerItem} onValueChange={this._handleCityChange}
selectedValue={this.state.selectedCity} >
{this.state.citys.map((city,index) => {
return (
<Picker.Item value={city.id+''} label={city.name} key={index}/>
);
})}
</
Picker>
</View>
</View>
</View >
);
}
render
() {
const modal = (
<Modal transparent={this.state.transparent} visible={this.state.isVisible}
onRequestClose={this.close}
animationType={this.props.animationType} >
{this.renderPicker()}
</Modal>
);
return (
<View> {modal}
<TouchableOpacity onPress={this.open}>
{this.props.children}
</TouchableOpacity>
</View>
);
}
}

WheelPicker.propTypes = {
isVisible
: PropTypes.bool,
selectedProvince
: PropTypes.string,
selectedCity: PropTypes.string,
navBtnColor: PropTypes.string,
animationType: PropTypes.string,
transparent
: PropTypes.bool,
onSubmit: PropTypes.func,
onCancel: PropTypes.func,
androidPickerHeight: PropTypes.number,
};

WheelPicker.defaultProps = {
isVisible
: false,
selectedProvince
: '',
selectedCity: '',
navBtnColor
: 'blue',
animationType: 'slide',
transparent: true,
onSubmit: () => {},
onCancel
: () => {},
androidPickerHeight: 50
};
const
styles = StyleSheet.create({
overlayStyle: {
flex: 1,
width: windowWidth,
height: windowHeight,
left: 0,
position: 'absolute',
backgroundColor: 'rgba(0,0.65)',
},
pickerContainer: {
flex: 1,
marginTop: windowHeight * 3 / 5,
backgroundColor: '#FFF',
navWrap: {
paddingHorizontal
: 15,
paddingVertical: 8,
justifyContent
: 'space-between',
alignItems: 'center',
flexDirection: 'row',
borderBottomWidth: 1,
borderTopWidth
: 1,
borderColor
: '#ccc'
},
navBtn
: {
paddingVertical: 5,
paddingHorizontal: 20,
borderWidth: 1,
borderRadius: 4
},
text: {
fontSize: 18,
},
pickerWrap
: {
flexDirection
: 'row'
},
pickerItem
: { flex: 1}});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom