uniapp开发钉钉小程序--收货地址选择

tui-cascade-selection 级联选择 | ThorUI文档icon-default.png?t=O83Ahttps://thorui.cn/doc/docs/thorui/tui-cascade-selection.html根据业务需求,地址选择需选择省-市-区-镇街-社区。uview组件中的选择器不满足设计需要,所以选择使用了 ThorUI文档组件库中的级联选择器组件。渲染数据很简单,这里不做过多的赘述,这里只说拿到数据对数据进行回显编辑问题。

对于数据回显,会用到文档中的defaultItemList这个属性。下面是根据需要自己组装数据过程。

1、将编辑之前的信息拿过来组装成默认数据格式:

onLoad(e) {
			const addressTypes = [{
					key: 'province',
					textKey: 'province',
					valueKey: 'provinceCode'
				},
				{
					key: 'city',
					textKey: 'city',
					valueKey: 'cityCode'
				},
				{
					key: 'district',
					textKey: 'district',
					valueKey: 'districtCode'
				},
				{
					key: 'street',
					textKey: 'street',
					valueKey: 'streetCode'
				},
				{
					key: 'village',
					textKey: 'village',
					valueKey: 'villageCode'
				}
			];
			
				let options = JSON.parse(decodeURIComponent(e.item))

                /**
                    自己的业务逻辑
                *****/
			
				uni.setNavigationBarTitle({
					title: '编辑地址'
				})

				if (options.street == '') {
					addressTypes.length = 4
				}
				if (options.village == '') {
					addressTypes.length = 5
				}


				addressTypes.forEach(type => {
					this.deafultAdrrList.push(this.createAddressObject(options, type.textKey, type.valueKey));
				});


		},

methods:{
    //组装数据
			createAddressObject(options, textKey, valueKey) {
				return {
					text: options[textKey],
					value: options[valueKey],
					subText: '',
					index: '',
					list: []
				};
			},
}

2、根据每一级的code获取每一层的数据并进行定位

openAddress() {
				this.show = true;

				//添加数据
				if (this.addresssArr.length == 0 && this.deafultAdrrList.length == 0) {
					this.getAddressList('');
				} else {
					//编辑数据
					this.getParentData('', 0, this.deafultAdrrList[0].text);


					for (let i = 0; i < this.deafultAdrrList.length; i++) {
						this.getParentData(this.deafultAdrrList[i].value, i + 1, this.deafultAdrrList[i].text);
					}

				}

			},
getParentData(value, type, text) {
				this.$get(getAddressListApi, {}, value).then(res => {
					if (res.code == 200) {
						let newRes = res.data.map(item => {
							return {
								text: item.name,
								value: item.code,
								subText: ''
							}
						})
						if (type == 0) {
							this.deafultAdrrList[0].list = newRes;
							let index = newRes.findIndex(item => (item.text == text));

							this.deafultAdrrList[0].index = index;

						} else if (type == 1) {
							this.deafultAdrrList[1].list = newRes;
							let index = newRes.findIndex(item => (item.text == text));

							this.deafultAdrrList[1].index = index;

						} else if (type == 2) {
							this.deafultAdrrList[2].list = newRes;
							let index = newRes.findIndex(item => (item.text == text));

							this.deafultAdrrList[2].index = index;

						} else if (type == 3) {
							this.deafultAdrrList[3].list = newRes;
							let index = newRes.findIndex(item => (item.text == text));

							this.deafultAdrrList[3].index = index;

						} else {
							this.deafultAdrrList[4].list = newRes;
							let index = newRes.findIndex(item => (item.text == text));

							this.deafultAdrrList[4].index = index;
						}
					}
				})
			},

3、如果需要重新选择上一层数据,则清空该层之后的数据

			changeAddress(e) {
				let code = e.value;
				let text = e.text;
				let layer = e.layer;

				let index = '';

				let val = ''


				//寄件地址
				switch (layer) {
					case 0:

						if (this.currentPage == 0 || this.currentPage == 1) {
							this.sysAddressBook.provinceCode = code;
							this.sysAddressBook.province = text;
							this.addresssArr.push(text);
						} else {

							this.resize()
							index = this.deafultAdrrList[0].list.findIndex(item => (item.text == text));

							this.deafultAdrrList[0].text = text;
							this.deafultAdrrList[0].value = code;
							this.deafultAdrrList[0].index = index

							this.sysAddressBook.provinceCode = code;
							this.sysAddressBook.province = text;
							this.addresssArr.push(text);

							this.deafultAdrrList.length = 1;

						}

						this.flag = false
						break;
					case 1:

						this.sysAddressBook.district = '';
						this.sysAddressBook.districtCode = '';
						this.sysAddressBook.street = '';
						this.sysAddressBook.streetCode = '';
						this.sysAddressBook.village = '';
						this.sysAddressBook.villageCode = '';

						this.sysAddressBook.cityCode = code;
						this.sysAddressBook.city = text;


						if (this.flag) {
							this.addresssArr = []
							for (let i = 0; i < layer; i++) {
								val = this.deafultAdrrList[i].text;
								this.addresssArr.push(val);
							}
						}


						this.addresssArr.push(text);


						break;
					case 2:

						this.sysAddressBook.street = '';
						this.sysAddressBook.streetCode = '';
						this.sysAddressBook.village = '';
						this.sysAddressBook.villageCode = '';


						this.sysAddressBook.districtCode = code;
						this.sysAddressBook.district = text;

						if (this.flag) {
							this.addresssArr = []
							for (let i = 0; i < layer; i++) {
								val = this.deafultAdrrList[i].text;
								this.addresssArr.push(val);
							}
						}
						this.addresssArr.push(text);

						break;
					case 3:

						this.sysAddressBook.village = '';
						this.sysAddressBook.villageCode = '';


						this.sysAddressBook.streetCode = code;
						this.sysAddressBook.street = text;


						if (this.flag) {
							this.addresssArr = []
							for (let i = 0; i < layer; i++) {
								val = this.deafultAdrrList[i].text;
								this.addresssArr.push(val);
							}
						}
						this.addresssArr.push(text);


						break;
					case 4:
						this.sysAddressBook.villageCode = code;
						this.sysAddressBook.village = text;


						if (this.flag) {
							this.addresssArr = []
							for (let i = 0; i < layer; i++) {
								val = this.deafultAdrrList[i].text;
								this.addresssArr.push(val);
							}
						}
						this.addresssArr.push(text);
						break;
					default:
						break;
				}

				this.addresssArr.join(' ');



				if (layer == 4) {
					this.receiveData = []
				} else {
					uni.hideLoading()


					this.$get(getAddressListApi, {}, code).then(res => {
						if (res.code == 200) {
							let newRes = res.data.map(item => {
								return {
									text: item.name,
									value: item.code
								}
							})
							switch (layer) {
								case 0:
									this.receiveData = newRes
									break;
								case 1:
									this.receiveData = newRes
									break;
								case 2:
									this.receiveData = newRes
									break;

								case 3:
									this.receiveData = newRes
									break;
								case 4:
									this.receiveData = newRes
									break;
								default:
									break;
							}
						} else {
							console.log(res.msg);
						}
					})
				}

			},

大概就是这样了,可能有点混乱,只做个参考吧~~~~~

### UniApp钉钉小程序 `scroll-view` 组件的使用 在 UniApp开发环境中,`scroll-view` 是一个非常常用的组件,用于实现滚动效果。该组件支持水平和垂直方向上的滚动,并提供了多种属性以便开发者自定义行为[^1]。 以下是关于如何在 UniApp 中针对钉钉小程序实现 `scroll-view` 功能的具体说明: #### 基本语法与常用属性 `<scroll-view>` 支持多个重要属性,这些属性可以帮助开发者控制滚动区域的行为。例如: - **`scroll-x`**: 设置为 true 或 false 来启用或禁用横向滚动。 - **`scroll-y`**: 同样设置为 true 或 false 来启用或禁用纵向滚动。 - **`upper-threshold` 和 `lower-threshold`**: 定义触发上拉加载更多或者下拉刷新的距离阈值。 - **`bindscrolltoupper` 和 `bindscrolltolower`**: 对应绑定事件处理函数,在触达顶部或底部时调用回调。 对于钉钉小程序而言,其对 `<scroll-view>` 的兼容性和其他平台基本一致,因此可以直接按照官方文档中的方式去配置并使用此组件[^2]。 #### 示例代码展示 下面提供一段简单的示例代码片段,演示如何在一个多页面项目里集成带有上下滑动特性的视图结构: ```html <!-- index.wxml --> <view class="container"> <!-- 外层容器 --> <scroll-view class="scroll-Y" scroll-y="{{true}}" style="height:{{winHeight}}px;" @scrolltoupper="onScrollToUpper" @scrolltolower="onScrollToLower"> <block wx:for="{{items}}" wx:key="*this"> <text>{{item}}</text> </block> </scroll-view> </view> ``` ```javascript // index.js Page({ data:{ winHeight:"", //窗口高度 items:[...Array(50).keys()] //模拟数据列表项 }, onLoad:function(){ const res = uni.getSystemInfoSync(); this.setData({winHeight:res.windowHeight}); }, onScrollToUpper() { console.log('已到达顶部'); }, onScrollToLower() { console.log('已到达底部'); } }) ``` 以上代码实现了基础的竖直方向滚动手势检测逻辑,当用户操作接近屏幕两端边界位置的时候会分别打印日志消息提示当前状态变化情况。 #### 注意事项 由于不同厂商的小程序环境可能存在细微差异,所以在实际部署前建议先测试目标平台上是否存在特殊限制条件。比如某些情况下可能需要额外指定样式单位(px/rem),或者是调整默认参数数值范围等等。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值