uni-app | 封装一个二级国内城市选择器(citypicker)

uni-app | 封装一个二级国内城市选择器(citypicker)

在实际uniapp,微信小程序,h5的项目中,经常用到picker

官方的定义:从底部弹起的滚动选择器。支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器。

一共有5种模式,有满足用户需求的省市区选择器。

再看看该模式的文档
在这里插入图片描述
我们可以看到兼容性来说,还是不太好。而且只能是三级,与实际需求不太符合,那这样我们就来自己基于原生的picker封装一个二级citypicker

先上界面代码:

<template>
	<view class="uni-city-picker">
		<picker @change="cityChange" @columnchange="columnChange" mode="multiSelector" :value="cityIndex" :range="citys">
			<!-- 预留的插槽 -->
			<slot></slot>
		</picker>
	</view>
</template>

然后是js部分:

		data() {
			return {
				citys: [
					[],
					[]
				],
				cityIndex: [ ], // 默认
				cityArr: [
					{
						text: "天津",
						City: [{
							text: "天津"
						}, ]
					},
					{
						text: "河北",
						City: [{
								text: "石家庄"
							},
							{
								text: "唐山"
							},
							{
								text: "秦皇岛"
							},
							{
								text: "邯郸"
							},
							{
								text: "邢台"
							},
							{
								text: "保定"
							},
							{
								text: "张家口"
							},
							{
								text: "承德"
							},
							{
								text: "沧州"
							},
							{
								text: "廊坊"
							},
							{
								text: "衡水"
							}
						]
					}
					// 这里省略了地区的json数据,在网络上可以随便找到
				],
			}
		},
		mounted() {
			this.citys[0] = this.cityArr.map((item) => { // 一级省份
				return item.text
			})
			this.citys[1] = this.cityArr.filter((item) => { // 二级市区
				return item.text === "天津"
			})[0].City.map((child) => {
				return child.text
			})
			this.cityIndex = [0, 0]
		},
		methods: {
			cityChange(e) { // 值改变了
			const index1 = e.detail.value[0] ? e.detail.value[0] : 0
			const index2 = e.detail.value[1] ? e.detail.value[1] : 0
			console.log(e.detail)
			const city = [ this.cityArr[index1].text , this.cityArr[index1].City[index2].text]
			
				this.$emit('cityChange', city)
			},
           columnChange(e) { //列值改变(拖动第一列)
                // console.log(e.detail)
                const index = e.detail.value
                if (e.detail.column === 0) {
                    let cityChild = []
                    this.cityArr[index].City.forEach((child) => {
                        cityChild.push(child.text)
                    })
                    this.citys[1] = cityChild
                    this.cityIndex.splice(1, 1, 0)
                    this.cityIndex[0] = index
                }
            }
		}
	}

在页面中的使用方式

		<citypicker @cityChange="cityChange">
			<template>
				<view>这里是插槽内容</view>
			</template>
		</citypicker>

这里@cityChange会返回一个数组结构,第一个值为第一列的地区名字,第二个值是二级地区的名字

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uni-app中,封装节流与防抖可以通过以下方法实现: 1. 防抖:防止按钮多次连续点击。可以使用一个延时器来实现防抖效果。******设置一个标志位,标志位为false时,执行事件处理函数,并设置一个延时器,在延时时间结束后将标志位设为true。在事件触发时判断标志位,如果为true则执行事件处理函数,否则不执行。 在uni-app中,可以根据具体需求选择使用防抖或节流来优化事件处理的性能和用户体验。以上是防抖和节流的简要介绍,更详细的实现可以参考引用和引用中的内容。同时,引用提供了一个封装请求的示例项目,可以参考其中的代码实现来进行封装节流与防抖的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [uni-app 实现节流与防抖](https://blog.csdn.net/weixin_54904917/article/details/124815555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [uni-app封装请求完成示例项目](https://download.csdn.net/download/weixin_45730243/13082690)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值