zoukankan      html  css  js  c++  java
  • Picker组件封装

    在开发APP的过程中,我们可能会遇上软件中需要有很多下拉选择样式,就像之前我做的那个《房贷计算器》一样,有很多下拉选择,如果没有将Picker封装起来共用是很麻烦的。

    安装插件

    在React Native里这个组件叫Picker,目前(React Native0.25.1版本)来说,自带的Picker并不能很好的适应iOS和Android,所以在此借助第三方的插件:react-native-picker

    安装插件命令:npm install --save react-native-picker

    picker组件

    该插件有哪些具体的参数与方法查看官方文档:https://github.com/beefe/react-native-picker

    在该js文件中,主要是picker的定义;

    picker有show()方法,经过某个触发事件后执行,将picker展示出来给用户进行选择

    picker展示时,还需要将当前的值和供选择的值都传值过来

    export default class PickerModal extends React.Component {
    
        constructor(props) {
            super(props);
    
            this.state = {
                options: [0],
                currentOption: 0
            }
        }
    
        show(options, currentOption) {
            this.setState({options, currentOption});
            this.picker.show();
    
            return new Promise(
                (resolve, reject)=> {
                    this.resolve = resolve;
                    this.reject = reject;
                }
            );
        }
    
        render() {
            return (
                <Picker
                    ref={(picker)=>{this.picker = picker;}}
                    style={{position:'absolute', left:0, right:0, bottom:0, height: 270, backgroundColor:'#fff'}}
                    showMask={true}
                    pickerBtnText="确定"
                    pickerCancelBtnText="取消"
                    pickerBtnStyle={{color:'#000'}}
                    pickerData={this.state.options}
                    selectedValue={[this.state.currentOption]}
                    onPickerDone={(value)=>{ this.picker.hide(); this.resolve && this.resolve(value[0]); }}
                    onPickerCancel={()=>{ this.picker.hide(); this.reject && this.reject(); }}
                />
            )
        }
    }
    

    picker-field组件

    该js是 通过接受值来设计样式显示在页面上,当点击后,即可将上述的picker组件展示出来给用户选择;

    export default class PickerField extends React.Component {
       showPickerModal() {
            let { options, value } = this.props;
    
            global.pickerModal.show(options, value).then(
                (newValue)=> {
                    this.props.onValueChange(newValue);
                },
                (e)=> {
                    console.log(e)
                }
            )
        }
    
        render() {
            let { title, value } = this.props;
    
            return (
                <View style={{flex:1}}>
                    <View
                        style={{flexDirection:'row', alignItems:'center', height:47, borderBottomWidth:1, borderBottomColor:'#2b3138'}}>
                        <Text style={{flex:2, fontSize:16, color:'#c9c8c9'}}>{title}</Text>
    
                        <TouchableOpacity style={{flexDirection:'row', flex:2.1, alignItems:'center'}}
                                          onPress={()=>this.showPickerModal()}>
                            <Text style={{color:'#50c0ce', fontSize:16}}>{value}</Text>
    
                            <Text style={{flex:1, textAlign:'right'}}>
                                <Icon style={{color:'#c9c8c9'}} name="ios-arrow-down" size={26}/>
                            </Text>
                        </TouchableOpacity>
    
                    </View>
                </View>
            )
        }
    }
    

    在文件中有一个global.pickerModal,这个是需要我们在一个外层文件或公共文件中定义的:

    <PickerModal ref={(pickerModal)=>{global.pickerModal = pickerModal;}}/>
    

    给picker-field组件传值

    在需要的位置中将PickerField显示出来:

    <PickerField title="计算方式" value={this.state.calMethod}
                 onValueChange={(value)=>this.setState({calMethod:value})}
                 options={['贷款金额','住房面积']}/>
    

    具体的显示样式可以在picker-field组件那个js文件中修改,传值不同需要在显示的时候进行属性修改。

  • 相关阅读:
    javscript处理XML DOM(待续)
    js设计模式(12)---职责链模式
    js设计模式(11)---命令模式
    Openstack之Swift架构(Cloud Storage)
    javascript —— HTTP头文件详解
    Generator
    promise
    记一些浏览器缓存以前不太熟悉的东西
    hover
    调试手机上网页 (断点 console timeline 选择dom)
  • 原文地址:https://www.cnblogs.com/maoyazhi/p/5644631.html
Copyright © 2011-2022 走看看