react native 带索引的城市列表

最近很多人在问城市列表如何做?刚好我的项目也需要,就做了个示例

github的代码地址:https://github.com/LiuC520/react-native-city-pick/

1、里面有两种城市的选择模式,一个是picker模式,一个是列表模式;

2、其中picker模式采用的是react-native-picker,里面只有两层的目录结构,如果需要三层的用作者的那个就可以了

3、列表模式是我们最常用的,再次采用的方法是计算出城市列表的高度,点击右侧的index字母索引就可以对应到相应的字母对应的城市列表,各位请看下图


城市列表的选择

一、下面讲解下思路,最后一个react-native-picker就不讲了,请大家到作者的github上欣赏

    我的思路是把城市的json数据重新排序,索引用字母排序,点击索引的字母相应的移动listview的坐标,移动的坐标根据城市列表和相应字母的高度进行累加得出的,但是此法不适合超过1000条以上的数据,否则能耗会报表的,但是对于单独的城市或者省份的列表还是搓搓有余的,相信RN的实力

1.1、索引采用lodash的方法,具体代码如下:

import _ from 'lodash';

const letters = _

.range('A'.charCodeAt(0), 'Z'.charCodeAt(0) + 1)

.map(n => String.fromCharCode(n).substr(0))

letters.splice(14,1)//去掉o和V,这两个下面没有城市

letters.splice(20,1)//去掉o和V,这两个下面没有城市

你需要安装lodash,使用命令 npm i -s lodash

1.2、把城市从json数据中放到城市的数组中,以便下面的操作

具体需要看我的List文件中的componentWillMount的代码

1.3、在componentDidMount中把数据放到state中

这里用到了sectionID和rowID,不熟悉的朋友,请看下官网哦,或者看下我的微信中有介绍,转载小马哥的http://mp.weixin.qq.com/s/xO5T1ZQvaFGRMlT5aBDVmw

1.4、然后是render里面的listview

其中有个初始的initialListSize,这里我设置的是500,为了把所有的城市都加载出来,这样下面的scrollTo方法才能准确的定位,否则没有渲染出来的item用scrollTo是定位不准的

scrollTo=(index)=>{

let position = 0;

    for(let i = 0;i<index;i++){

        position += totalheight[i]

    }

this._listview.scrollTo({

    y:position

})

}

其中的totalheight为一个数组,数组中包含了每个字母和其下的城市列表的高度,

具体需要看componentDidMount里面的:

var eachheight = SECTIONHEIGHT+ROWHEIGHT*city[ii].name.length

totalheight.push(eachheight)

而SECTIONHEIGHT是section头部的高度,ROWHEIGHT是每一个rowdata的高度,大家可以自行设置,在设置ROWHEIGHT的高度时,每行下面是有个border的,这个border一定要放到内层view里面,否则高度会失误,具体看我的renderRow方法的写法

1.6、渲染index索引

letters.map((letter, index) => this.renderLetters(letter, index))

1.7、ok,讲了这么多还不如看看代码,仔细地研究下哦,希望能给大家带来帮助

React Native中获取城市列表的方式可以有多种,以下是其中一种方法: 1. 使用开放的城市数据API:你可以使用一些开放的城市数据API来获取城市列表信息。这些API通常提供了城市名称、城市ID、城市拼音等信息。 以下是一个使用高德地图开放平台API获取城市列表的示例代码: ```javascript import React, { useEffect, useState } from 'react'; import { View, Text } from 'react-native'; import axios from 'axios'; const CityList = () => { const [cityList, setCityList] = useState([]); useEffect(() => { const fetchCityList = async () => { try { const response = await axios.get('https://restapi.amap.com/v3/config/district', { params: { key: 'YOUR_AMAP_API_KEY', keywords: '', subdistrict: 1, extensions: 'base', }, }); const cityData = response.data.districts[0].districts; setCityList(cityData); } catch (error) { console.error('获取城市列表数据失败', error); } }; fetchCityList(); }, []); return ( <View> <Text>城市列表:</Text> {cityList.map((city) => ( <Text key={city.adcode}>{city.name}</Text> ))} </View> ); }; export default CityList; ``` 在上述代码中,我们使用了高德地图开放平台的API来获取城市列表数据。需要替换`YOUR_AMAP_API_KEY`为你自己的API密钥。通过调用API获取的城市数据保存在`cityList`状态中,并在组件渲染时显示城市列表。 请注意,上述示例代码中的API地址和参仅为示意,实际应根据具体的城市数据API进行调整。另外,还需要根据你的项目需求进行适当的错误处理和数据处理。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值