与牧同行-小程序用户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

286 lines
7.1 KiB

import http from '../../../utils/api'
Page({
/**
* 页面的初始数据
*/
data: {
regionList: [], // 当前显示的区域列表
selectedRegions: [], // 已选择的区域路径
currentParentCode: '', // 当前父级code
loading: false,
showPicker: false,
regionTitle: '请选择区域',
autoShowPicker: false // 新增:控制是否自动弹出选择器
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
// 首次加载,获取第一级数据
this.getRegionData('', () => {
// 首次加载完成后自动弹出选择器
this.setData({
showPicker: true,
regionTitle: '请选择区域'
})
})
},
// 获取区域数据
getRegionData(parentCode, callback) {
this.setData({
loading: true
})
http.areaChildren({
data: {
parentCode: parentCode || ''
},
success: res => {
console.log('区域数据响应:', res)
if (res.code === 200 && res.data && res.data.length > 0) {
this.setData({
regionList: res.data,
currentParentCode: parentCode,
loading: false
})
} else {
// 没有更多数据了,说明已经是最后一级
this.setData({
loading: false,
regionList: []
})
// 如果是最后一级,关闭选择器
if (this.data.showPicker) {
this.setData({
showPicker: false
})
wx.showToast({
title: '已选择到最后一级',
icon: 'none'
})
}
}
// 执行回调
if (callback) {
callback()
}
},
fail: err => {
console.error('请求失败:', err)
this.setData({
loading: false
})
wx.showToast({
title: '加载失败',
icon: 'none'
})
if (callback) {
callback()
}
}
})
},
// 开始选择(点击按钮时调用)
startSelection() {
// 如果还没有选择任何区域,重新加载第一级
if (this.data.selectedRegions.length === 0) {
this.getRegionData('', () => {
this.setData({
showPicker: true,
regionTitle: '请选择区域'
})
})
} else {
// 如果有已选择的区域,加载下一级
const lastRegion = this.data.selectedRegions[this.data.selectedRegions.length - 1]
this.loadAndShowNextLevel(lastRegion.code)
}
},
// 加载并显示下一级区域选择器
loadAndShowNextLevel(parentCode) {
this.getRegionData(parentCode, () => {
if (this.data.regionList.length > 0) {
// 有下一级数据,自动弹出选择器
this.setData({
showPicker: true,
regionTitle: `请选择${this.data.selectedRegions[this.data.selectedRegions.length - 1].name}的下一级区域`
})
} else {
// 没有下一级数据,提示用户
wx.showToast({
title: '已经是最后一级,无法继续选择',
icon: 'none'
})
}
})
},
// 关闭选择器
closePicker() {
this.setData({
showPicker: false
})
},
// 选择区域
selectRegion(e) {
const index = e.currentTarget.dataset.index
const region = this.data.regionList[index]
console.log('选择的区域:', region)
// 获取当前已选择的最后一级
const lastSelectedRegion = this.data.selectedRegions.length > 0 ?
this.data.selectedRegions[this.data.selectedRegions.length - 1] :
null
// 检查是否是同级选择(替换最后一级)
const isSameLevel = lastSelectedRegion &&
lastSelectedRegion.parentCode === region.parentCode
let selectedRegions = [...this.data.selectedRegions]
if (isSameLevel) {
// 同级选择,替换最后一级
selectedRegions[selectedRegions.length - 1] = {
code: region.code,
name: region.name,
parentCode: region.parentCode
}
} else {
// 选择下一级,添加到路径
selectedRegions.push({
code: region.code,
name: region.name,
parentCode: region.parentCode
})
}
this.setData({
selectedRegions
})
// 关闭当前选择器
this.setData({
showPicker: false
})
// 延迟一段时间后自动加载并显示下一级选择器
setTimeout(() => {
this.loadAndShowNextLevel(region.code)
}, 300)
},
// 重新选择(点击已选择的任意层级)
reSelectRegion(e) {
const index = e.currentTarget.dataset.index
// 截断到指定级别(包括点击的层级)
const selectedRegions = this.data.selectedRegions.slice(0, index + 1)
this.setData({
selectedRegions
})
// 获取该层级的数据
const targetRegion = selectedRegions[selectedRegions.length - 1]
// 获取点击层级的同级数据并显示选择器
this.getRegionData(targetRegion.parentCode, () => {
this.setData({
showPicker: true,
regionTitle: index === 0 ?
'请选择区域' :
`请选择${this.data.selectedRegions[index - 1]?.name || '区域'}的下一级`
})
})
},
// 完成选择
completeSelection() {
if (this.data.selectedRegions.length === 0) {
wx.showToast({
title: '请先选择区域',
icon: 'none'
})
return
}
const lastRegion = this.data.selectedRegions[this.data.selectedRegions.length - 1]
// 这里可以调用你的业务接口,传递parentCode
this.submitRegion(lastRegion.code)
},
// 提交选择的区域(示例)
submitRegion(parentCode) {
console.log('提交的parentCode:', parentCode)
console.log('完整选择路径:', this.data.selectedRegions)
http.userCode({
data: {
areaCode: parentCode
},
success: res => {
console.log(11111, res);
if (res.code == 200) {
wx.showModal({
title: '选择完成',
content: `已选择到: ${this.data.selectedRegions.map(r => r.name).join(' > ')}`,
showCancel: false,
success: (res) => {
if (res.confirm) {
wx.switchTab({
url: '/pages/home/home',
})
}
}
})
}
}
})
},
// 重置选择
resetSelection() {
wx.showModal({
title: '确认重置',
content: '确定要重置所有选择吗?',
success: (res) => {
if (res.confirm) {
this.setData({
selectedRegions: [],
regionList: [],
currentParentCode: '',
showPicker: false
})
// 重新获取第一级数据
this.getRegionData('', () => {
// 重置后自动弹出第一级选择器
this.setData({
showPicker: true,
regionTitle: '请选择区域'
})
})
}
}
})
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
}
})