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
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() {
|
|
|
|
}
|
|
})
|