uniapp:根据树状结构渲染的多级地区选择器

8 篇文章 0 订阅
订阅专栏
7 篇文章 0 订阅
订阅专栏
2 篇文章 0 订阅
订阅专栏

组件实现功能:从底部弹出地区选择器,最多支持三级选择且可以自由选择级联数,加入了动画效果

最终效果如图:

 

组件已上传到插件市场,插件ID:cc-address-selector,引入可直接使用

下面是代码参考

HTML: 

<template>
	<view class="address-selector">
		<!-- 遮罩层 -->
		<view class="mask" v-if="show" @click="show = false" @touchmove.prevent.stop=""></view>
		<!-- 地区选择器 -->
		<view class="address-selector__main" :class="show ? 'address-selector__main--show' : ''">
			<view class="address-selector__title">
				<!-- 标题 -->
				<view class="f-c mb address-selector__title-text">选择地区</view>
				<!-- 顶部文字 -->
				<view class="f-s">
					<view class="address-selector__item">
						<text class="address-selector__sub" @click="selectType(1)" :class="active === 1 ? 'address-selector__sub--active' : ''">{{ activeTitle.title1 }}</text>
					</view>
					<view class="address-selector__item" style="text-align: center;">
						<text class="address-selector__sub" @click="selectType(2)" v-show="active > 1" :class="active === 2 ? 'address-selector__sub--active' : ''">
							{{ activeTitle.title2 }}
						</text>
					</view>
					<view class="address-selector__item" style="text-align: right;">
						<text class="address-selector__sub" @click="selectType(3)" v-show="active > 2" :class="active === 3 ? 'address-selector__sub--active' : ''">
							{{ activeTitle.title3 }}
						</text>
					</view>
				</view>
			</view>
			<!-- 一级数据 -->
			<view class="address-selector__trans" v-show="active === 1">
				<view
					class="address-selector__text"
					v-for="(v, index) in districtData1"
					:key="index"
					@click.stop="selectList(index, v, 0)"
					:class="index == selectData[0] ? 'address-selector__text--active' : ''"
				>
					{{ v[title] }}
				</view>
			</view>
			<!-- 二级数据 -->
			<view class="address-selector__trans" v-show="active === 2">
				<view
					class="address-selector__text"
					v-for="(x, i) in districtData2"
					:key="i"
					@click.stop="selectList(i, x, 1)"
					:class="i == selectData[1] ? 'address-selector__text--active' : ''"
				>
					{{ x[title] }}
				</view>
			</view>
			<!-- 三级数据 -->
			<view class="address-selector__trans z" v-show="active === 3">
				<view
					class="address-selector__text"
					v-for="(val, n) in districtData3"
					:key="n"
					@click.stop="selectList(n, val, 2)"
					:class="n == selectData[2] ? 'address-selector__text--active' : ''"
				>
					{{ val[title] }}
				</view>
			</view>
		</view>
	</view>
</template>

JS部分

<script>
export default {
	name: 'addressSelector',
	data() {
		return {
			// 是否展示
			show: false,
			// 当前级别
			active: 1,
			// 标题显示
			activeTitle: {
				title1: '请选择',
				title2: '请选择',
				title3: '请选择'
			},
			// 二级数据
			districtData2: [],
			// 三级数据
			districtData3: [],
			// 选中的下标
			selectData: []
		};
	},
	props: {
		// 所有数据/一级数据
		districtData1: {
			type: Array,
			default: () => []
		},
		// 级联数
		level: {
			type: Number,
			default: () => 3
		},
    // 显示的文字的参数名
    title: {
      type: String,
      default: () => 'title'
    }
	},
	created() {},
	methods: {
		showSelector(selectData = []) {
			// 打开选择器时传入selectData代表默认选中的位置
			if (selectData.length > 0) {
				this.selectData = selectData;
				this.active = selectData.length;
				selectData.forEach((item, index) => {
					if (index > 0) {
						this[`districtData${index + 1}`] = this[`districtData${index}`][item].children;
					}
					this.activeTitle[`title${index + 1}`] = this[`districtData${index + 1}`][item][this.title];
				});
			}
			// 弹出选择器
			this.show = true;
		},
		// 点击标题事件
		selectType(v) {
			this.active = v;
			if (v === 1) {
				this.selectData = [this.selectData[0]];
				this.activeTitle.title2 = '请选择';
				this.activeTitle.title3 = '请选择';
			} else if (v === 2) {
				this.selectData = [this.selectData[0], this.selectData[1]];
				this.activeTitle.title3 = '请选择';
			}
		},
		// 选择列表事件
		selectList(v, data, n) {
			let that = this;
			const level = n + 1;
			this.selectData[n] = v;
			this.activeTitle[`title${level}`] = data[this.title];
			if (level === this.level) {
				this.show = false;
				// 传递参数,分别为选择的文字对象,最后选择的子节点的数据,以及选择数据的下标(可以根据下标来获取父节点)
				this.$emit('getAddress', that.activeTitle, data, this.selectData);
			} else if (level < this.level) {
				this[`districtData${level + 1}`] = this[`districtData${level}`][v].children;
				this.active += 1;
			}
		}
	}
};
</script>

CSS部分

<style lang="scss" scope>
// 遮罩层
.mask {
	background: rgba(0, 0, 0, 0.4);
	position: fixed;
	z-index: 100;
	width: 100%;
	height: 100%;
	bottom: 0;
	left: 0;
}
.address-selector__item {
	flex: 1;
}
.address-selector__main {
	width: 100%;
	height: 888rpx;
	background: #fff;
	border-top-left-radius: 30rpx;
	border-top-right-radius: 30rpx;
	overflow: hidden;
	position: fixed;
	z-index: 101;
	bottom: 0;
	left: 0;
	transform: translateY(100%);
	transition: transform 0.5s;
}
.address-selector__main--show {
	transform: translateY(0);
}
.address-selector__title {
	padding: 20rpx 44rpx 0 44rpx;
	border-bottom: 1px solid #f1f1f1;
	font-size: 28rpx;
	color: #333;
	height: 124rpx;
	&-text {
		font-size: 28rpx;
		font-weight: bold;
		color: #333333;
	}
	.f-s {
		height: 40rpx;
	}
}

.address-selector__sub {
	height: 44rpx;
	flex: 1;
}

.address-selector__sub--active {
	border-bottom: 4rpx solid #ee1616;
}

.address-selector__trans {
	padding: 20rpx 44rpx;
	padding-bottom: 0;
	overflow-y: scroll;
	height: 764rpx;
	width: 100%;
	position: fixed;
	right: 0;
	padding-bottom: $safe;
	bottom: 0;
	z-index: 102;
	background: #fff;
}

.address-selector__text {
	font-size: 28rpx;
	color: #333;
	padding: 20rpx 0;
}

.address-selector__text--active {
	color: #ee1616;
}
</style>

使用方法

在页面中使用组件,自定义一个ref名称进行方法的调用,目前最多只支持一二三级,需要做更多的可以自己修改

传参说明

 

示例

<template>
    <cc-address-selector ref="addressSelector" :districtData1="regionData" :level="2"  :title="name"  @getAddress="getAddress"></cc-address-selector>
</template>
methods: {
    // 获取地区数据
    getAddress(title, data) {
       // 这里写自己的赋值操作
    },
    // 打开地区选择器
    showSelector() {
        this.$refs.addressSelector.showSelector();
    }
}

【完整代码】uni-app原生picker实现地址选择
m0_73075579的博客
04-26 796
【代码】uni-app原生picker实现地址选择
渲染CSS选择
09-27
最近在High Performance Web Sites blog看到一篇关于css选择的文章《Simplifying CSS Selectors》,我英文太差,在翻译软件和朋友的帮助下稍微的看懂了一些,看本文需要谨慎,谨防被我误导,如果你英文强,能翻译...
JS案例:简单的多级菜单实现
02-28 1904
代码附上: &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp
uniapp 改写uni-data-picker级联选择(带搜索和多选)新增列出选择和删除功能
热门推荐
qq_36958916的博客
07-09 1万+
uniapp 改写uni-data-picker级联选择(带搜索和多选)新增列出选择和删除功能
uniapp 异步加载级联选择(Cascader,data-picke)
最新发布
每天都要努力学习哦~~
05-02 1643
由于uniapp uni-ui的data-picke 不支持异步作者自己写了一个 插件市场下载使用插件市场地址。
uniapp四级联动地址选择(带json数据末尾有链接)
m0_50997866的博客
08-24 776
uniapp四级联动地址选择
uniapp中使用picker制作简单的三级地址选择组件
在无知中学习,在学习中成长,在成长中学习
06-01 2578
uniapp中使用picker制作简单的三级地址选择组件view部分js部分样式 view部分 <template> <picker class="form-item-picker" mode="multiSelector" @change="bindPickerChangeAddressHandle" @columnchange="bindColumnChangeAddressHandle" :value="multiCityIndex" :range="multiCityArray"
结构伪类选择(总结)
12-22
什么是结构伪类选择结构伪类选择是针对HTML的结构进行分类的选择,特征就是位置 分为三大类 一类 e:first-child e:last-child e:only-child e:nth-child(n/even/odd)隔行换色,列表换色 e:nth-last-child ...
全能渲染:octane 3.0.7版本.zip
11-24
octane渲染 3.0.7版本 产品、广告设计及影视制作的爱好者和Octane Render是世界上第一个真正意义上的 基于GPU、全能、基于物理渲染渲染。 它可以使得用户可以花费更少的时间就可以获得十分出色的作品。 课程...
renderless-tags:Svelte中的不渲染标签选择
02-21
Svelte中的无渲染组件 现在,这是在Svelte中创建无渲染组件的简单示例。 在某些时候,我会看到将其包装以供其他人使用。 同时,欢迎您按原样获取源代码。
uni-app选择( uni-data-picker)选择任意级别
qq_42396791的博客
08-02 4992
uni-app选择( uni-data-picker)选择任意级别
uniapp选择,包含一级,二级级联,三级级联uniapp-picker-master.zip
12-17
uniapp选择,包含一级,二级级联,三级级联uniapp-picker-master.zip
很好用的uni-app节点树组件!
06-23
很好用的uni-app节点树组件!
uniapp 使用 uni-data-picker级联选择,自定义展示,uni小程序
m0_57611486的博客
11-09 3570
uniapp 使用 uni-data-picker级联选择,多级选择,自定义展示
uniapp 省市区地区选择
hbws37的博客
06-24 1730
抄别人的,具体什么时候抄的不记得了
uniapp多级区域选择
妄想症患者的博客
08-26 996
【代码】uniapp多级区域选择
uniapp小程序使用省市县区选择picker
weixin_46607967的博客
02-22 7851
uniapp小程序使用省市县区选择picker
uni-app 省市区选择
dearyang
06-16 1万+
一、导入uni-data-picker插件uni-data-picker 数据驱动的picker选择单列、多列级联选择,常用于省市区城市选择、公司部门选择、多级分类等场景 二、省市县数据导入项目附:省市区三级联动数据uni-appuni-data-picker省市区数据表-Javascript文档类资源-CSDN下载是一个选择类datacom组件。支持多列级联选择。...
uni-app 之 picker选择
jun_tong的博客
09-18 3517
uni-app 之 picker选择
uniapp多列选择
06-09
Uniapp 中,可以使用 `picker` 组件来实现多列选择。下面是一个简单的例子: ```html <template> <view> <picker :value="value" @change="onChange"> <view class="picker-item" v-for="item in columns">{{ item }}</view> </picker> </view> </template> <script> export default { data() { return { columns: ['北京', '上海', '广州', '深圳'], value: [0, 1, 2], // 默认选中的列 }; }, methods: { onChange(e) { console.log('当前选中的值为:', e.detail.value); }, }, }; </script> ``` 在这个例子中,我们使用 `picker` 组件来创建一个多列选择。`columns` 数组存储了选择的每一列显示的内容,`value` 数组则表示默认选中的列。在模板中,我们使用 `v-for` 指令遍历 `columns` 数组,并将每个元素渲染选择的一个选项。当用户选择某个选项时,会触发 `change` 事件,我们可以在事件处理函数中获取当前选中的值。 需要注意的是,`picker` 组件需要在 `uni-app` 的 `nvue` 模板中使用。如果你使用的是 `vue` 模板,可以使用 `vant` 或者 `element-ui` 等第三方 UI 组件库来实现多列选择

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • uni-app+uview: uni.chooseImage选择相册/拍照后使用u-upload进行上传 8046
  • Vue2/Vue3+elementUI:一个可自定义内容可随机的大转盘(今天吃什么) 7559
  • el-date-picker动态限制时间范围 6160
  • JavaScript:原生js写的一个多按钮Popover 弹出框 4745
  • el-checkbox获取选中的id 3170

分类专栏

  • 小程序 2篇
  • uniapp 8篇
  • javascript 2篇
  • Vue 7篇
  • vite
  • vue3
  • js 1篇
  • Vue+Taro 2篇
  • Vue+elementUI 10篇
  • vant 1篇
  • h5 3篇
  • jquery 2篇

最新评论

  • Vue:写一个可配置内容的的随机转盘(今天吃什么)

    hjxyyds_: 太棒啦

  • uniapp: 实现一个优美的带底部标识的横向滚动导航栏

    chenlingA: 有完整代码吗,目前这个来回切换有问题

  • el-date-picker动态限制时间范围

    CC#: 看看是不是使用了element plus

  • 前端点击按钮跨域下载多个url文件(亲测有用)

    q1727770755: 跨域一点也没解决啊,该报的错一个不少

  • el-date-picker动态限制时间范围

    Hypocriteee: 为啥picker-options不起作用了

大家在看

  • 如何下载EasyRecovery易恢复软件及详细安装步骤 437
  • 零门槛用AI,302.AI让人工智能变得简单易用
  • 证照之星 XE版软件下载及安装教程 366
  • Tuxera NTFS for Mac 2023软件最新版下载及详细安装教程 476
  • 【软件下载】Camtasia Studio 2024详细安装教程视频

最新文章

  • Vue3+elementUI:强大好用的el-tabel+el-pagination封装,后台管理系统必备
  • Vue2+elementUI:使用JSX和template两种方式对el-tabel+el-pagination进行封装
  • 【vue3+vite+vue-router】动态引入某个目录下的文件自动生成路由
2023年4篇
2022年13篇
2021年15篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码盐田seo网站优化南山关键词按天收费罗湖百搜词包观澜网站优化排名平湖建站双龙百度关键词包年推广丹竹头外贸网站建设松岗外贸网站建设深圳网站设计盐田网站推广系统光明网站seo优化南澳seo优化民治网站推广系统布吉关键词排名福永网站优化排名光明网站优化大芬网站设计松岗网站改版大运百搜词包广州百度标王平湖网站设计平湖关键词按天收费民治网站优化排名横岗外贸网站制作福田设计公司网站西乡网站制作横岗网站优化按天计费西乡百姓网标王推广石岩网站优化按天计费双龙推广网站歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化