uniapp wot-design-uni wd-col-picker组件 接口自定义地址数据JS版

<template>
	<view class="page">
		<view style="margin-top: 20rpx;">
			<wd-form ref="form" :model="model" :errorType="errorType">
				<wd-cell-group border>
					<wd-input label="联系人" label-width="150rpx" prop="name" clearable v-model="model.name"
						placeholder="请输入联系人" :rules="[{ required: true, message: '请填写联系人' }]" />
					<wd-input label="手机号" label-width="150rpx" prop="phone" clearable v-model="model.phone"
						placeholder="请输入手机号" :rules="[{ required: true, message: '请填写手机号' }]" />
					<wd-col-picker required label="地址" placeholder="请选择地址" label-width="150rpx" prop="address"
						value-key='code' v-model="model.address" :columns="columns" :column-change="columnChange"
						@confirm="handleConfirm" />
					<wd-input label="详细地址" label-width="150rpx" prop="phone" clearable v-model="model.phone"
						placeholder="请输入详细地址" :rules="[{ required: true, message: '请填写详细地址' }]" />
					<wd-cell required title="默认地址" title-width="150rpx" prop="defaultAddress">
						<view class="custom-value" style="height: 32px;">
							<wd-switch v-model="model.defaultAddress" />
						</view>
					</wd-cell>
				</wd-cell-group>
				<view class="footer" style='margin: 80rpx; 30rpx'>
					<wd-button type="primary" size="large" @click="handleSubmit" block>保存</wd-button>
					<view v-if="type == 'edit'" style="margin-top: 40rpx;">
						<wd-button type="info" size="large" @click="onDelete" block>删除</wd-button>
					</view>

				</view>
			</wd-form>
		</view>

	</view>
</template>

<script setup>
	import { ref, reactive, getCurrentInstance } from 'vue';
	import { useMessage, useToast } from '@/uni_modules/wot-design-uni'
	import { onLoad } from '@dcloudio/uni-app';

	const { proxy } = getCurrentInstance();
	const { success: showSuccess } = useToast()
	const errorType = ref('message')
	const type = ref('add')
	const model = reactive({
		name: '',
		phone: '',
		address: [], // 存储选中地址的code数组
		defaultAddress: true,
	});
	const rawData = ref([])
	const columns = ref([
		[]
	]); // 初始只包含第一列
	const form = ref()

	onLoad((e) => {
		if (e.type) {
			type.value = e.type
		}
		getAreaList()
	})

	// 根据父级code查找子项
	const findChildrenByCode = (parentCode) => {
		const findInArray = (arr, code) => {
			for (const item of arr) {
				if (item.code === code) return item;
				if (item.children) {
					const found = findInArray(item.children, code);
					if (found) return found;
				}
			}
		};

		const parent = findInArray(rawData.value, parentCode);
		return parent ? parent.children || [] : [];
	};

	const getAreaList = async () => {
		try {
			const { data } = await proxy.$api.getlistArea();
			rawData.value = data;
			// 初始化第一列数据
			if (model.address.length > 0) {
				columns.value = [
					data.map(item => ({ code: item.code, label: item.name })),
					findChildrenByCode(model.address[0])?.map((item) => {
						return {
							code: item.code,
							label: item.name
						}
					}),
					findChildrenByCode(model.address[1])?.map((item) => {
						return {
							code: item.code,
							label: item.name
						}
					}),
				]
			} else {
				columns.value = [
					data.map(item => ({ code: item.code, label: item.name }))
				]
			}

			console.log(columns.value, 'columns.value')
		} catch (error) {
			console.error('获取区域列表失败', error);
		}
	};

	// 修改后的columnChange处理
	const columnChange = ({ selectedItem, resolve, finish }) => {
		if (!selectedItem) {
			// 初始化加载第一列后可能需要处理
			return finish();
		}

		const children = findChildrenByCode(selectedItem.code);
		if (children && children.length > 0) {
			const nextColumn = children.map(item => ({
				code: item.code,
				label: item.name,
				// 如果有子节点继续传递
				children: item.children || []
			}));
			resolve(nextColumn);
		} else {
			finish();
		}
	};

	// 确认选择后的处理
	const handleConfirm = (value) => {

	};



	function handleSubmit() {
		console.log('提交')
		form.value
			.validate()
			.then(({
				valid,
				errors
			}) => {
				if (valid) {
					showSuccess({
						msg: '校验通过'
					})
				}
			})
			.catch((error) => {
				console.log(error, 'error')
			})
	}

	function onDelete() {

	}
</script>

<style lang="scss" scoped>
	.footer {
		margin-top: 50rpx;
	}
</style>
// 根据父级code查找子项
	const findChildrenByCode = (parentCode) => {
		const findInArray = (arr, code) => {
			for (const item of arr) {
				if (item.code === code) return item;
				if (item.children) {
					const found = findInArray(item.children, code);
					if (found) return found;
				}
			}
		};

		const parent = findInArray(rawData.value, parentCode);
		return parent ? parent.children || [] : [];
	};

	const getAreaList = async () => {
		try {
			const { data } = await proxy.$api.getlistArea();
			rawData.value = data;
			// 初始化第一列数据
			if (model.address.length > 0) {
				columns.value = [
					data.map(item => ({ code: item.code, label: item.name })),
					findChildrenByCode(model.address[0])?.map((item) => {
						return {
							code: item.code,
							label: item.name
						}
					}),
					findChildrenByCode(model.address[1])?.map((item) => {
						return {
							code: item.code,
							label: item.name
						}
					}),
				]
			} else {
				columns.value = [
					data.map(item => ({ code: item.code, label: item.name }))
				]
			}

			console.log(columns.value, 'columns.value')
		} catch (error) {
			console.error('获取区域列表失败', error);
		}
	};

	// 修改后的columnChange处理
	const columnChange = ({ selectedItem, resolve, finish }) => {
		if (!selectedItem) {
			// 初始化加载第一列后可能需要处理
			return finish();
		}

		const children = findChildrenByCode(selectedItem.code);
		if (children && children.length > 0) {
			const nextColumn = children.map(item => ({
				code: item.code,
				label: item.name,
				// 如果有子节点继续传递
				children: item.children || []
			}));
			resolve(nextColumn);
		} else {
			finish();
		}
	};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值