微信小程序,动态设置三级联动, 省市区街道

news2024/11/24 13:23:13

在这里插入图片描述

1.第一步   传parentId=0   查询省份
2.第二步   选择省份,传pathId=选择省份的pathId, 不传parentId,会查询出   市/县数据
3.第三步   根据选择县的parentId 查询街道数据,传parentId=选择的县id
4.选择结果回显   显示所选择的 path 以/分割   取最后一级
  <van-dropdown-menu active-color="#409eff" custom-class="filter-menus">
    <van-dropdown-item id="areaAll" title="区域选择">
      <view class="areaBox" style="height:288rpx; overflow:auto;">
        <van-cell class="van-dropdown-item__option dropdown-time {{item.id === parentId ? 'time-active' : ''}}" wx:for="{{areaAllList}}" wx:key="index" data-item="{{item}}" bindtap="areaClick">
          <view class="van-cell">
            <view class="van-dropdown-item__title">{{item.name}}</view>
          </view>
        </van-cell>
      </view>
      <view>
        <van-picker show-toolbar columns='{{columns}}' value-key='name' bind:change='chgArea' bind:confirm='confirmArea' bind:cancel='areaClose' />
      </view>
    </van-dropdown-item>
 </van-dropdown-menu>
Page({
  data: {
      //行政区域
    areaAllList: [],
    columns: [
      // {
      //   values: '', // one,                    //可以是数组,或者对象数组
      //   className: 'column1' //选择器的第一列
      // },
      // {
      //   values: '', // two[one[0].name],       //默认选中two对象中的第一项
      //   className: 'column2', //选择器的第二列
      // },
      // {
      //   values: '', // three[two[one[0].name][0].name],  //默认选中three对象中的第一项
      //   className: 'column3', //选择器的第三列
      // }
    ],
    one: [],
    two: []
  }
  })
  onLoad(options) {
    //行政区划   areaAllList
    this.getParent() //
},
method:{
  areaClick(e) {
  //点击省, 请求市级的数据
    const item = e.currentTarget.dataset.item
    this.setData({
      parentId: item.id
    })
    this.initPath(item.pathId)
  },
  getParent() {
  //获取顶部的省级
    fetch.apply.getAreaAll({
      parentId: 0
    }, res => {
      if (res.flag == 0) {
        this.setData({
          areaAllList: res.object
        })
      }
    })
  },
  initPath(pathId) {
  // 1写入 选择器第一级 数据 ;  2将二级数据, 做成 columns 的格式,并写入
    fetch.apply.getAreaAll({
      pathId: pathId
    }, res => {
      if (res.flag == 0 && res.object.length > 0) {
        var v1 = []
        res.object.forEach((e, i) => {
          v1[e.name] = e.childs
        });
        this.setData({
          one: res.object,
          two: v1,
        })
        this.setData({
          columns: [{
              values: this.data.one, //可以是数组,或者对象数组
              className: 'column1', //选择器的第一列
            },
            {
              values: this.data.two[this.data.one[0].name], //默认选中two对象中的第一项
              className: 'column2', //选择器的第二列
              defaultIndex: 0
            },
            {
              values: '', // this.data.three[this.data.two[this.data.one[0].name][0].name], //默认选中three对象中的第一项
              className: 'column3', //选择器的第三列
            }
          ],
        })
      } else {
        this.setData({
          one: '',
          two: '',
          columns: []
        })
      }
    })
  },
  confirmArea(event) {
  // 确定 选择的地区数据
    let value = event.detail.value
    if (!value[0]) {
      toast("请选择城市")
      return
    }
    if (!value[2]) {
      //将选中的文字和对应的id拿出来使用
      // wx.showModal({
      //   title: '',
      //   content: '您选中了“' + value[0].name + ',' + value[1].name + ',' +
      //     '”, di为“' + value[0].id + ',' + value[1].id +
      //     ',' + '”',
      //   showCancel: false
      // })
      this.setData({
        areaPathId: value[1].id
      })
    } else {
      //将选中的文字和对应的id拿出来使用
      // wx.showModal({
      //   title: '',
      //   content: '您选中了“' + value[0].name + ',' + value[1].name + ',' +
      //     value[2].name + '”, di为“' + value[0].id + ',' + value[1].id +
      //     ',' + value[2].id + '”',
      //   showCancel: false
      // })
      this.setData({
        areaPathId: value[2].id
      })
    }
    this.getList()
    this.areaClose()
  },

  chgArea(event) {
  // 滚动选择器, 通过第二级,获取最后一级, 街道数据
    let picker = event.detail.picker
    let value = event.detail.value
    let index = event.detail.index

    //在change 第一列的时候,动态更改第二列的数据
    //setColumnValues是vant自带的实例方法
    //第一个参数是列数,从0开始;第二个参数是第二列应该显示的数据
    picker.setColumnValues(1, this.data.two[value[0].name])

    //此处vant-picker有一个bug,当只滑动第一级时,返回的value数据是错误的,需要我们自己根据第二 级计算,去获取第三级数据
    if (index == 0) {
      // picker.setColumnValues(2, this.data.three[(this.data.two[value[0].name][0]).name])
    } else if (index == 1) {
      var v2 = {}
      fetch.apply.getAreaAll({
        parentId: value[index].id
      }, res => {
        if (res.flag == 0) {
          v2[value[index].name] = res.object
          this.setData({
            three: v2
          })
          picker.setColumnValues(2, this.data.three[value[1].name])
        }
      })
    } else {
      picker.setColumnValues(2, this.data.three[value[1].name])
    }
  },
  areaClose() {
    this.selectComponent('#areaAll').toggle()
  },
}

技术要点

1 按照固定格式, 设置columns 的数据
2 picker.setColumnValues() 方法,获取数据

columns 的数据 格式

var one = [
  { id: 111, 'name': '杭州' },
  { id: 222, 'name': '宁波' },
]
var two = {
  '杭州': [
    { id: 11100, 'name': '国杭州' },
    { id: 22201, 'name': '国宁波' },
  ],
  '宁波': [
    { id: 11102, 'name': '中杭州' },
    { id: 22203, 'name': '中宁波' },
    { id: 33304, 'name': '中温州' },
  ]
}
var three = {
  '国杭州': [
    { id: 1110000, 'name': 'aaa' },
    { id: 2220101, 'name': 'bbb' },
  ],
  '国宁波': [
    { id: 1110102, 'name': 'ccc' },
    { id: 2220103, 'name': 'ddd' },
    { id: 3330104, 'name': 'eee' },
  ],
  '中杭州': [
    { id: 1110205, 'name': 'fff' },
    { id: 2220206, 'name': 'ggg' },
    { id: 3330207, 'name': 'hhh' },
  ],
  '中宁波': [
    { id: 1110308, 'name': 'www' },
    { id: 2220309, 'name': 'ttt' },
    { id: 3330310, 'name': 'yyy' },
  ],
  '中温州': [
    { id: 1110411, 'name': 'jjj' },
    { id: 2220412, 'name': 'kkk' },
    { id: 3330413, 'name': 'ppp' },
  ]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1040872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础教程:Yolov5模型改进-添加13种注意力机制

1.准备工作 先给出13种注意力机制的下载地址&#xff1a; https://github.com/z1069614715/objectdetection_script 2.加入注意力机制 1.以添加SimAM注意力机制为例&#xff08;不需要接收通道数的注意力机制&#xff09; 1.在models文件下新建py文件&#xff0c;取名叫Sim…

数据链路层协议

文章目录 数据链路层协议0. 数据链路层解决的问题1. 以太网协议(1) 认识以太网(2) 以太网帧格式<1> 两个核心问题 (3) 认识MAC地址(4) 局域网通信原理(5) MTU<1> 认识MTU<2> MTU对IP协议的影响<3> MTU对UDP协议的影响<4> MTU对TCP协议的影响<…

R语言中更改R包安装路径

看到这些包下载到我的C盘&#xff0c;我蛮不爽的&#xff1a; 所以决定毫不犹豫的改到D盘&#xff1a; 首先&#xff0c;我们需要在RStudio中新建一个初始启动文件&#xff1a; file.edit(~/.Rprofile) 然后去你喜欢的环境新建一个文件夹存放安装的包的位置&#xff0c;我喜欢…

第三章 图标辅助元素的定制

第三章 图标辅助元素的定制 1.认识图表常用的辅助元素 ​ 图表的辅助元素是指除了根据数据绘制的图形之外的元素&#xff0c;常用的辅助元素包括坐标轴、标题、图例、网格、参考线、参考区域、注释文本和表格&#xff0c;它们都可以对图形进行补充说明。 ​ 上图中图表常用辅…

混合Rollup:探秘 Metis、Fraxchain、Aztec、Miden和Ola

1. 引言 混合Rollup为新的以太坊L2扩容方案&#xff0c;其分为2大类&#xff1a; 将乐观与ZK技术结合的混合Rollup同时支持公开智能合约 和 私人智能合约 的混合Rollup 本文将重点关注Metis、Fraxchain、Aztec、Miden和Ola这五大项目。 2. 何为混合Rollup&#xff1f; 混合…

VMware Aria 曝光“关键”身份验证漏洞,6.x 版本均受影响

导读近日消息&#xff0c;VMware Aria Operations for Networks 近日曝光了一个高危的身份验证漏洞&#xff0c;远程攻击者可以绕过 SSH 身份认证&#xff0c;访问专用终端。 VMware Aria 是一款用于管理和监控虚拟化环境和混合云的套件&#xff0c;支持 IT 自动化、日志管理、…

ROS2 从头开始:第 7/8回 - 使用 QoS 配置在 ROS 2 中实现可靠通信

一、说明 在机器人操作系统 (ROS) 2 系统中,服务质量 (QoS) 用于指定各种策略,这些策略确定如何通过 ROS 2 主题或服务传输和接收消息。QoS 策略允许您优化 ROS 2 系统中节点之间通信的性能和可靠性。这些设置可用于调整 DDS 系统的性能和行为,以满足应用程序的特定需求…

Ubuntu 安装Nacos

1、官网下载最新版nacos https://github.com/alibaba/nacos/releases 本人环境JDK8&#xff0c;Maven3.6.3&#xff0c;启动Nacos2.2.1启动失败&#xff0c;故切换到2.1.0启动成功 2、放到服务器目录下&#xff0c;我的在/home/xxx/apps下 3、解压 $ tar -zxvf nacos-serve…

人机逻辑中的家族相似性与非家族相似性

维特根斯坦的家族相似性理论是他在《哲学研究》中提出的一个重要概念。他认为&#xff0c;语言游戏是一种人们使用语言的方式&#xff0c;不同的语言游戏之间可能存在相似性&#xff0c;就像一个家族的成员之间存在相似性一样。维特根斯坦认为&#xff0c;相似性不是通过一个共…

Linux基本操作符(1)

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 目录 Linux的登录 Linux下基本指令 指令操作的理解 几个与用户操作符 ls 指令 pwd命令 cd 指令 touch指令 mkdir指令 rmdir指令 && rm 指令 什么叫操作系统&#xff0c;我相信如果是学计算机的都听说过&…

Stm32_标准库_TIM中断_PWM波形_呼吸灯

基本原理 PWM相关物理量的求法 呼吸灯代码 #include "stm32f10x.h" // Device header #include "Delay.h"TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructuer;//结构体 GPIO_InitTypeDef GPIO_InitStructur…

LeetCode每日一题:1993. 树上的操作(2023.9.23 C++)

目录 1993. 树上的操作 题目描述&#xff1a; 实现代码与解析&#xff1a; 模拟 dfs 原理思路&#xff1a; 1993. 树上的操作 题目描述&#xff1a; 给你一棵 n 个节点的树&#xff0c;编号从 0 到 n - 1 &#xff0c;以父节点数组 parent 的形式给出&#xff0c;其中 p…

buildroot移植Qt5无法显示字体问题

报错&#xff1a;QFontDatabase: Cannot find font directory /usr/lib/fonts. Note that Qt no longer ships fonts. Deploy some (from DejaVu Fonts for example) or switch to fontconfig. 原因&#xff1a;很明显是Qt没有找到字库文件&#xff1b; 解决方法&#xff1a; 1…

排查内存泄露

1 通过Performance确认是否存在内存泄露 一个存在内存泄露的 DEMO 代码&#xff1a; App.vue <template><div><button click"myFn" style"width: 200px; height: 200px;"></button><home v-if"ishow"></hom…

VUE使用DXFParser组件解析dxf文件生成图片

<template><div><input type"file" change"handleFileChange" /></div><el-table :data"tableData" style"width: 100%"><el-table-column prop"Control_No" label"序号" width…

图像处理与计算机视觉--第四章-图像滤波与增强-第一部分

目录 1.灰度图亮度调整 2.图像模板匹配 3.图像裁剪处理 4.图像旋转处理 5.图像邻域与数据块处理 学习计算机视觉方向的几条经验: 1.学习计算机视觉一定不能操之过急&#xff0c;不然往往事倍功半&#xff01; 2.静下心来&#xff0c;理解每一个函数/算法的过程和精髓&…

C语言入门Day_25 函数与指针小结

目录 前言&#xff1a; 1.函数 2.指针 3.易错点 4.思维导图 前言&#xff1a; 函数就像一个“有魔法的加工盒”&#xff0c;你从入口丢一些原材料进去&#xff0c;它就能加工出一个成品。不同的函数能加工出不同的成品。 入口丢进去的瓶子&#xff0c;水和标签就是输入&a…

win使用git(保姆级教程)

序言 上学期间用的git并不多&#xff0c;但是从研三实习以及后面工作来看&#xff0c;git是一项必备技能&#xff0c;所以在此来学习一下。 下载git安装包 打开网站&#xff0c;根据需求来下载&#xff1b;一般按照如下方式进行下载&#xff1a; 然后安装的时候记得按下图勾…

NebulaGraph实战:3-信息抽取构建知识图谱

自动信息抽取发展了几十年&#xff0c;虽然模型很多&#xff0c;但是泛化能力很难用满意来形容&#xff0c;直到LLM的诞生。虽然最终信息抽取质量部分还是需要专家审核&#xff0c;但是已经极大的提高了信息抽取的效率。因为传统方法需要大量时间来完成数据清洗、标注和训练&am…

32.栈的应用补充-表达式求值

目录 一. 前缀表达式与后缀表达式 二. 中缀表达式转后缀表达式的手算方法 三. 后缀表达式的手算方法 四. 后缀表达式的机算方法 五. 中缀表达式转前缀表达式的手算方法 六. 前缀表达式的机算方法 七. 中缀表达式转后缀表达式的机算方法 八. 中缀表达式的机算 一. 前缀表…