您的当前位置:首页正文

微信小程序开发 逐级选择地区

2024-11-29 来源:个人技术集锦

1.需求

  微信小程序开发,逐级选择地区(市、区县、街道、社区、网格),选择每一级然后展示下一级数据。

微信小程序逐级选择

2. 完整代码

2.1. 选择界面

2.1.1. selectArea.wxml

<text bindtap="selectGrid">{{gridName}}</text>
<!-- 选择地区位置 -->
<view class="area_selection" hidden="{{area_selection}}">
  <view class="communitypop_con">
    <selectionbox id="selectionbox" class="communitypop" bind:cliclCancel="cliclCancel" bind:cliclConfirm="cliclConfirm">
    </selectionbox>
  </view>
</view>

2.1.2. selectArea.wxss

.area_selection {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.6);
  z-index: 800;
}

.communitypop_con {
  display: flex;
  flex-direction: row;
  align-items: center;
  width: 100%;
  height: 100%;
  justify-content: center;
  align-items: center;
}

.communitypop {
  width: 90%;
  height: 80%;
  overflow-y: auto;
  background: white;
  border-radius: 8rpx;
}

2.1.3. selectArea.json

{
  "usingComponents": {
    "selectionbox":"../selectionBox/selectionBox"
  }
}

2.1.4. selectArea.js

// pages/selectArea/selectArea.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    area_selection: true,
    gridName:"请选择"
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    var that = this
    that.selectionbox = that.selectComponent("#selectionbox");

  },

  /**
   * 获取网格
   */
  selectGrid: function () {
    let that = this
    that.selectionbox.getCityData()
    that.setData({
      area_selection: false
    })
  },
  // 地区选择框确定
  cliclConfirm: function (e) {
    let that = this
    var gridObj = e.detail
    that.setData({
      gridName: gridObj.name,
      area_selection: true
    })
  },
  // 地区选择框取消
  cliclCancel: function (e) {
    let that = this
    that.setData({
      area_selection: true
    })
  },
})

2.2. 逐级选择地区弹出框

2.2.1. selectionBox.wxml

<view class="page-body">
  <view class="header-layout">
    <text class="header-title">所在网格:</text>
    <view class="header-content">
      <text >{{cityStr}}</text>
      <text hidden="{{isCountyHidden}}">>{{countyStr}}</text>
      <text hidden="{{isStreetHidden}}">>{{streetStr}}</text>
      <text hidden="{{isCommunityHidden}}">>{{communityStr}}</text>
      <text hidden="{{isGridHidden}}">>{{gridStr}}</text>
    </view>
  </view>
  <!-- 所属市 -->
  <view>
    <view class="item-header-top">所属市: </view>
    <view class="item-layout">
      <view class="item-title {{index+1== cityIndex?'item-title-active':''}}" bindtap="cityClick" wx:for="{{cityList}}" data-index="{{index}}" data-item-id="{{item.id}}" data-value="{{item.name}}" wx:for-index="index" wx:key="index">{{item.name || '暂无'}}</view>
    </view>
  </view>
  <!-- 所属区县 -->
  <view hidden="{{isCountyHidden}}">
    <view class="item-header">所属区县:</view>
    <view class="item-layout">
      <view class="item-title {{index+1== countyIndex?'item-title-active':''}}" bindtap="countyClick" wx:for="{{countyList}}" data-index="{{index}}" data-item-id="{{item.id}}" data-value="{{item.name}}" wx:for-index="index" wx:key="index">{{item.name || '暂无'}}</view>
    </view>
  </view>
  <!-- 所属街镇 -->
  <view hidden="{{isStreetHidden}}">
    <view class="item-header">所属街镇:</view>
    <view class="item-layout">
      <view class="item-title {{index+1== streetIndex?'item-title-active':''}}" bindtap="streetClick" wx:for="{{streetList}}" data-index="{{index}}" data-item-id="{{item.id}}" data-value="{{item.name}}" wx:for-index="index" wx:key="index">{{item.name || '暂无'}}</view>
    </view>
  </view>
  <!-- 所属社区 -->
  <view hidden="{{isCommunityHidden}}">
    <view class="item-header">所属社区:</view>
    <view class="item-layout">
      <view class="item-title {{index+1== communityIndex?'item-title-active':''}}" bindtap="communityClick" wx:for="{{communityList}}" data-index="{{index}}" data-item-id="{{item.id}}" data-value="{{item.name}}" wx:for-index="index" wx:key="index">{{item.name || '暂无'}}</view>
    </view>
  </view>
  <!-- 所属网格 -->
  <view hidden="{{isGridHidden}}">
    <view class="item-header">所属网格:</view>
    <view class="item-layout">
      <view class="item-title {{index+1== gridIndex?'item-title-active':''}}" bindtap="gridClick" wx:for="{{gridList}}" data-index="{{index}}" data-item-id="{{item.id}}" data-value="{{item.name}}" wx:for-index="index" wx:key="index">{{item.name || '暂无'}}</view>
    </view>
  </view>
  <view class="item-interval"></view>
  <view class="opera-layout">
    <text class="opera-item-cancel" bindtap="cliclCancel">取消</text>
    <text class="opera-item-confirm" bindtap="cliclConfirm">确定</text>
  </view>
</view>

2.2.2. selectionBox.wxss

@import "../../public/wxss/base.wxss";

.page-body{
  width: 100%;
  height: 100%;
  border: 1rpx solid white;
  border-radius: 10rpx;
  box-sizing: border-box;
  background-color: white;
}

.header-layout {
  background-color: white;
  display: flex;
  flex-direction: column;
  margin-bottom: 20rpx;
  position: absolute;
  width: 90%;
  padding: 15rpx 10rpx;
}
.header-title {
  color: #000;
  font-weight: 800;
  font-size: 32rpx;
  margin-top: 10rpx;
}
.header-content {
  display: flex;
  flex-direction: row;
  flex: 1;
  color: #333;
  font-size: 30rpx;
}
.item-title-top {
  margin: 80rpx 20rpx 10rpx;
  color: #333;
  font-weight: 700;
  font-size: 30rpx;
}
.item-header-top {
  margin: 120rpx 20rpx 10rpx;
  color: #0B8DF8;
  font-weight: 700;
  font-size: 30rpx;
}
.item-header {
  margin: 0 20rpx 10rpx;
  color: #0B8DF8;
  font-weight: 700;
 font-size: 30rpx;
}
.item-layout {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: flex-start;
  padding: 10rpx 0 10rpx;
  flex-wrap: wrap;
  padding-bottom: 30rpx;
  background-color: white;
}

.item-title{
  width: 21%;
  color: #000;
  font-size: 30rpx;
  text-align: center;
  padding:10rpx 10rpx;
  box-shadow: 0 0 5rpx #bbb;
  border-radius: 10rpx;
  background: white;
  margin:10rpx 2.0% 10rpx;
}
.item-title-active{
  color: white;
  background: #0B8DF8;
}

.item-interval {
  height: 20rpx;
 }
 .opera-layout{
  position: absolute;
  left: 5%;
  bottom: 60rpx;
  width: 90%;
  background: #fff;
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  padding: 10rpx 80rpx 30rpx;
  border-radius: 10rpx;
  font-size: 34rpx;
}
 .opera-item-cancel{
  display: inline-block;
  color: white;
  background:#ccc;
  border-radius: 70rpx;
  padding: 10rpx 50rpx;
}
.opera-item-confirm{
  display: inline-block;
  color: white;
  background:#0B8DF8;
  border-radius: 70rpx;
  padding: 10rpx 50rpx;
}

2.2.3. selectionBox.js

import areaJson from '../../public/json/areaJson';
Page({
  data: {
    comId: null,
    ciryList: [],
    countyList: [],
    streetList: [],
    communityList: [],
    gridList: [],
    isCountyHidden: true,
    isStreetHidden: true,
    isCommunityHidden: true,
    isGridHidden: true,
    cityIndex: null,
    countyIndex: null,
    streetIndex: null,
    communityIndex: null,
    gridIndex: null,
  },
  /**
   * 获取市级数据
   */
  getCityData: function () {
    let that = this
    that.setData({
      cityList: areaJson.data.areaList
    })
  },
  /**
   * 获取区县数据
   */
  getCountyData: function (itemid) {
    let that = this
    that.setData({
      countyList: areaJson.data.countyList
    })
  },
  /**
   * 获取街道数据
   */
  getStreetData: function (itemid) {
    let that = this
    that.setData({
      streetList: areaJson.data.streetList
    })
  },
  /**
   * 获取社区数据
   */
  getCommunityData: function (itemid) {
    let that = this
    that.setData({
      communityList: areaJson.data.communityList
    })
  },
  /**
   * 获取网格数据
   */
  getGridData: function (itemid) {
    let that = this
    that.setData({
      gridList: areaJson.data.gridList
    })
  },
  /**
   * 市级点击
   */
  cityClick: function (e) {
    var that = this
    var itemIndex = parseInt(e.currentTarget.dataset.index) + 1
    var itemValue = e.currentTarget.dataset.value
    var itemId = e.currentTarget.dataset.itemId
    that.setData({
      countyList: [],
      streetList: [],
      communityList: [],
      gridList: [],
      isCountyHidden: false,
      isStreetHidden: true,
      isCommunityHidden: true,
      isGridHidden: true,
      cityIndex: itemIndex,
      countyIndex: null,
      streetIndex: null,
      communityIndex: null,
      gridIndex: null,
      cityStr: itemValue,
      countyStr: '',
      streetStr: '',
      communityStr: '',
      gridStr: ''
    })
    //获取区县数据
    that.getCountyData(itemId)
  },
  /**
   * 区县点击
   */
  countyClick: function (e) {
    var that = this
    var itemIndex = parseInt(e.currentTarget.dataset.index) + 1
    var itemValue = e.currentTarget.dataset.value
    var itemId = e.currentTarget.dataset.itemId
    that.setData({
      streetList: [],
      communityList: [],
      gridList: [],
      isStreetHidden: false,
      isCommunityHidden: true,
      isGridHidden: true,
      countyIndex: itemIndex,
      streetIndex: null,
      communityIndex: null,
      gridIndex: null,
      countyIndex: itemIndex,
      streetIndex: null,
      communityIndex: null,
      gridIndex: null,
      countyStr: itemValue,
      streetStr: '',
      communityStr: '',
      gridStr: ''
    })
    //获取街道数据
    that.getStreetData(itemId)
  },
  /**
   * 街道点击
   */
  streetClick: function (e) {
    var that = this
    var itemIndex = parseInt(e.currentTarget.dataset.index) + 1
    var itemValue = e.currentTarget.dataset.value
    var itemId = e.currentTarget.dataset.itemId
    that.setData({
      communityList: [],
      gridList: [],
      isCommunityHidden: false,
      isGridHidden: true,
      streetIndex: itemIndex,
      communityIndex: null,
      gridIndex: null,
      streetStr: itemValue,
      communityStr: '',
      gridStr: ''
    })
    //获取社区数据
    that.getCommunityData(itemId)
  },
  /**
   * 社区点击
   */
  communityClick: function (e) {
    var that = this
    var itemIndex = parseInt(e.currentTarget.dataset.index) + 1
    var itemValue = e.currentTarget.dataset.value
    var itemId = e.currentTarget.dataset.itemId
    that.setData({
      gridList: [],
      isGridHidden: false,
      communityIndex: itemIndex,
      gridIndex: null,
      communityStr: itemValue,
      gridStr: ''
    })
    //获取网格数据
    that.getGridData(itemId)
  },
  /**
   * 网格点击
   */
  gridClick: function (e) {
    var that = this
    var itemIndex = parseInt(e.currentTarget.dataset.index) + 1
    var itemValue = e.currentTarget.dataset.value
    that.setData({
      gridIndex: itemIndex,
      deptId: itemIndex-1,
      gridStr: itemValue,
    })
  },
  // 取消选择
  cliclCancel: function () {
    var that = this
    //清除数据
    that.clearData()
    that.triggerEvent('cliclCancel')
  },
  /**
   * 清除数据
   */
  clearData: function () {
    var that = this
    that.setData({
      ciryList: [],
      countyList: [],
      streetList: [],
      communityList: [],
      gridList: [],
      isCountyHidden: true,
      isStreetHidden: true,
      isCommunityHidden: true,
      isGridHidden: true,
      cityIndex: null,
      countyIndex: null,
      streetIndex: null,
      communityIndex: null,
      gridIndex: null,
      cityStr: '',
      countyStr: '',
      streetStr: '',
      communityStr: '',
      gridStr: ''
    })
  },
  // 确定选择
  cliclConfirm: function () {
    let that = this
    var cityStr = that.data.cityStr
    var countyStr = that.data.countyStr
    var streetStr = that.data.streetStr
    var communityStr = that.data.communityStr
    var gridStr = that.data.gridStr
    if (!cityStr) {
      wx.showToast({
        icon: 'none',
        title: '请选择市',
      })
      return
    } else if (!countyStr) {
      wx.showToast({
        icon: 'none',
        title: '请选择区县',
      })
      return
    } else if (!streetStr) {
      wx.showToast({
        icon: 'none',
        title: '请选择街镇',
      })
      return
    } else if (!communityStr) {
      wx.showToast({
        icon: 'none',
        title: '请选择社区',
      })
      return
    } else if (!gridStr) {
      wx.showToast({
        icon: 'none',
        title: '请选择网格',
      })
      return
    } 
    //清除数据
    that.clearData()
    var obj = {}
    obj.id = that.data.deptId
    obj.name = cityStr+countyStr+streetStr+communityStr+gridStr
    if (obj) {
      that.triggerEvent('cliclConfirm', obj)
    } else {
      wx.showToast({
        icon: 'none',
        title: '缺少参数',
      })
    }
  },
})
显示全文