微信小程序使用vant weapp UI的van-index-bar组件实现城市列表

其中城市列表使用了Vant 官方提供了一份默认的省市区数据

yarn add @vant/area-data

需要把这份数据整理成想要的格式,拿到城市的首字母,进行统计

yarn add pinyin-pro

利用这个依赖包拿到首字母大写

/**
 * 获取中文大写首字母
 */
function getFirstChineseInitial(chineseStr) {
  if (!chineseStr || chineseStr.length === 0) return '';

  const REGEX_CHINESE = /[\u4e00-\u9fa5]/; // 匹配任何一个中文字符
  let initial = chineseStr[0];

  // 寻找第一个中文字符
  for (let i = 0; i < chineseStr.length; i++) {
      if (REGEX_CHINESE.test(chineseStr[i])) {
          initial = chineseStr[i];
          break;
      }
  }

  // 转换为拼音的首字母
  const firstLetter = pinyin(initial, { pattern: 'first',toneType:'none' }).charAt(0).toUpperCase();
  return firstLetter;
}


//在城市选择的js文件的onload钩子中处理

import {
  areaList
} from '@vant/area-data';

  onLoad(options) {
    let cityList = []
    let pyList = []
    let list = []
    for (let key in areaList.city_list) {
      cityList.push({
        id: key,
        city_name: areaList.city_list[key]
      })
    }
    cityList = cityList.map(item => {
      item.py = getFirstChineseInitial(item.city_name)
      pyList.push(item.py)
      return item
    })
    pyList = [...new Set(pyList)].sort((a, b) => {
      if (a < b) {
        return -1;
      }
      if (a > b) {
        return 1;
      }
      return 0;
    })

    pyList.forEach(item1 => {
      let pyObject = {
        firstLetter: item1,
        list: []
      }
      cityList.forEach(item2 => {
        if (item1 === item2.py) {
          pyObject.list.push(item2)
        }
      })
      list.push(pyObject)
      console.log(pyObject)
    })
    this.setData({
      cityList: list,
      pyList
    })

  },

index.wxml文件里直接使用即可

<van-index-bar index-list="{{ pyList }}" highlight-color="#F34C00">
  <view wx:for="{{cityList}}" wx:key="firstLetter">
    <van-index-anchor index="{{item.firstLetter}}">{{item.firstLetter}}</van-index-anchor>
    <van-cell title="{{item2.city_name}}" wx:for="{{item.list}}" wx:for-item="item2" wx:key="id" />
  </view>

</van-index-bar>

注意需要再json文件中声明组件

{
  "usingComponents": {
    "van-index-bar": "@vant/weapp/index-bar/index",
    "van-index-anchor": "@vant/weapp/index-anchor/index"
  },
  "navigationBarBackgroundColor": "#ffffff",
  "navigationBarTextStyle": "black",
  "navigationBarTitleText": "选择城市"
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值