react-native省市区吸顶选择

第一次发文章,代码有点low将就着看吧

json数据下面给地址,自己下载改改路径或者直接fetch过来

地址json

/*

* @Author: panyang

* @Date: 2018-08-30 14:58:31

* @LastEditors: panyang

* @LastEditTime: 2018-08-30 15:05:08

* @Description: AdressPicker component

*/

    import React,{Component}from 'react';

    import{

        View,

        Text,

        StyleSheet,

        TouchableOpacity

    }from 'react-native';

    import AdressData from '../data/adress.json';

    //样式表

    const LEVEL_NORMAL_COLOR = '#eee'; //选择省市县按钮的颜色

    const LEVEL_ACTIVE_COLOR = 'lightblue';

    const ADRESS_COLOR = '#eee';//地址的颜色

    const ADRESS_ACTIVE_COLOR = 'orange';

    const styles = StyleSheet.create({

        rowContainer:{`请输入代码`

            display:'flex',

            flexDirection:'row',

            justifyContent:'space-around',

            borderWidth:1,

            borderColor:'#ddd',

            marginRight:3,

            marginLeft:3,

        },

        buttonStyle:{

            height:35,

        },

        buttonsTextContainer:{

            height:35,

            display:'flex',

            flexDirection:'column',

            justifyContent:'center',

            alignSelf:'center'

        },

        buttonsText:{

            color:'#FFFFFF',

            textAlign:'center',

        },

        adressContainer:{

            flex:1,

            display:'flex',

            flexDirection:'row',

            padding:5,

            flexWrap:'wrap',

        },

        adressButton:{

            padding:8,

            paddingLeft:12,

            paddingRight:12,

            borderWidth:1,

            borderColor:'#CCC',

            borderRadius:5,

            backgroundColor:'#eee',

            margin:5,

        }

    })

    export default class AdreesPicker extends Component{

      constructor(props){

          super(props);

          this.state={

            currentAdressLevel:1, //当前选择的地区级别(省、市、县)

            maxAdressLevel:4,//最大可选地区的级别

            buttonsText:['省','市','县','镇'],//按钮的提示文字

            levelIndex:0,//当前渲染的等级(省:0,市:1,县:2,镇:3,村:4)

            provinceData:[],

            citesData:[],

            areasData:[],

            streetData:[],

            renderData:[],//要选择渲染的数据(省/市/县/镇/村)

            renderAdressIndex:0,//当前渲染的(省/市/县/镇/村)的index

            provinceIndex:0,

            citesIndex:0,

            areasIndex:0,

            streetIndex:0,

            provinceSelected:'',

            citySelected:'',

            areaSelected:'',

            streetSelected:''

          }

        }

        //选择渲染

        innerFunc = (object) =>{

            if(!!object && object !== []){

                this.setState({

                    renderData:object

                })

            }

        }

        updateRenderData = (index)=>{

            if(index === 0){

                this.innerFunc(this.state.provinceData);

            }else if(index === 1){

                this.innerFunc(this.state.citesData)

            }else if(index === 2){

                this.innerFunc(this.state.areasData)

            }else if(index === 3){

                this.innerFunc(this.state.streetData)

            }else{}

        }

        //初始化省份数据

        initProvinceData = ()=>{

            //初始化省份

            this.setState({provinceData:AdressData,provinceSelected:AdressData[this.state.provinceIndex].name},()=>{

                //更新渲染数据

                this.updateRenderData(this.state.levelIndex);

                //更新市

                this.updateCitiesData(this.state.provinceIndex);

            })

        }

        //更新市数据

        updateCitiesData = (index)=>{

            this.setState({citesData:this.state.provinceData[index].children},()=>{

                //更新县

                this.updateAreasData(this.state.citesIndex);

            })

        }

        //更新县数据

        updateAreasData = (index) =>{

            this.setState({areasData:this.state.citesData[index].children},()=>{

                //更新镇

                this.updateStreetData(this.state.areasIndex);

            })

        }

        //更新镇数据

        updateStreetData = (index) =>{

            this.setState({streetData:this.state.areasData[index].children},()=>{

                //...

            })

        }

        //选择当前的地区级别

        selectAdressLevel = (index)=>{

            this.setState({

                levelIndex:index,

            })

            //更新渲染数据

            this.updateRenderData(index);

        }

        //点击选择地址

        adressSelect = (index)=>{

            const {

                levelIndex,

                provinceData,

                citesData,

                areasData,

                streetData,

                citySelected,

                areaSelected,

                citesIndex,

                areasIndex,

            } = this.state;

            //如果选择省份,更新市和县的数据,将省的index置为所选择的省份的index,将市的index和县的index置为0

            if(levelIndex === 0){

                this.setState({

                    provinceIndex:index,

                    citesIndex:0,

                    areasIndex:0,

                    provinceSelected:provinceData[index].name,

                    citySelected:'',

                    areaSelected:'',

                    streetSelected:'',

                },()=>{

                    this.updateCitiesData(index);

                    this.updateAreasData(0)

                })

            }//如果选择的市,更新县的数据,将市的index置为所选的市的index,将县的index置为0

            else if(levelIndex === 1){

                this.setState({

                    citesIndex:index,

                    areasIndex:0,

                    citySelected:citesData[index].name,

                    areaSelected:'',

                    streetSelected:'',

                },()=>{

                    this.updateAreasData(index)

                })

            }//如果选择的为县,则更新镇的数据,将县的index置为所选的index,将镇的index置为0

            else if(levelIndex === 2){

                this.setState({

                    areasIndex:index,

                    streetIndex:0,

                    citySelected:citySelected === '' ? ''+citesData[citesIndex].name : citySelected,

                    areaSelected:areasData[index].name,

                    streetSelected:'',

                },()=>{

                    this.updateStreetData(index)

                })

            }//如果选择的为镇,将镇的index置为所选的index

            else if(levelIndex === 3){

                this.setState({

                    streetIndex:index,

                    citySelected:citySelected === '' ? ''+citesData[citesIndex].name : citySelected,

                    areaSelected:areaSelected === '' ? ''+areasData[areasIndex].name : areaSelected,

                    streetSelected:streetData[index].name

                },()=>{

                    // ...

                })

            }

        }

        componentDidMount(){

            this.initProvinceData();

        }

        render(){

            const {

                buttonsText,

                maxAdressLevel,

                levelIndex,

                renderData,

                provinceIndex,

                citesIndex,

                areasIndex,

                provinceSelected,

                citySelected,

                areaSelected,

                streetSelected,

                streetIndex

            } = this.state;

            return(

                <View style={{flex:1}}>

                    {/* 选择的信息 */}

                    <View>

                        <Text>当前选择的地址:{''+provinceSelected+' '+citySelected+' '+areaSelected +' '+streetSelected}</Text>

                    </View>

                    {/* 按钮 */}

                    <View style={styles.rowContainer}>

                        {

                            buttonsText.map((value,index)=>{

                                if(index < maxAdressLevel)

                                return (

                                <TouchableOpacity

                                    key={index}

                                    style={[styles.buttonStyle,{width:100/maxAdressLevel+'%',backgroundColor:index === levelIndex?LEVEL_ACTIVE_COLOR:LEVEL_NORMAL_COLOR}]}

                                    onPress={()=>{this.selectAdressLevel(index)}}

                                >

                                    <View style={styles.buttonsTextContainer}>

                                        <Text style={styles.buttonsText}>{value}</Text>

                                    </View>

                                </TouchableOpacity>)

                            })

                        }

                    </View>

                    {/* 地址 */}

                    <View style={styles.adressContainer}>

                        { 

                            renderData.map((value,index)=>{

                                return(

                                    <TouchableOpacity

                                        style={[styles.adressButton,{backgroundColor:

                                            this.state.levelIndex === 0 ? (provinceIndex===index?ADRESS_ACTIVE_COLOR:ADRESS_COLOR):

                                            (

                                                this.state.levelIndex === 1 ? (citesIndex===index?ADRESS_ACTIVE_COLOR:ADRESS_COLOR):

                                                (

                                                    this.state.levelIndex === 2 ? (areasIndex===index?ADRESS_ACTIVE_COLOR:ADRESS_COLOR):

                                                    (

                                                        this.state.levelIndex === 3 ? (streetIndex===index?ADRESS_ACTIVE_COLOR:ADRESS_COLOR):ADRESS_COLOR

                                                    )

                                                )

                                            )

                                        }]}

                                        key={index}

                                        onPress={()=>{this.adressSelect(index)}}

                                    >

                                        <Text>{value.name}</Text>

                                    </TouchableOpacity>

                                )

                            })

                        }

                    </View>

                </View>

            )

        }

    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容