Uni-App用uView组件库中u-picker实现地区的省-市-区三级联动、确认及回显

 更新时间:2023年12月15日 11:32:34   作者:不停喝水  
最近项目要使用uni-app遇到省市县三级联动的问题,下面这篇文章主要给大家介绍了关于Uni-App用uView组件库中u-picker实现地区的省-市-区三级联动、确认及回显的相关资料,需要的朋友可以参考下

一:准备工作

组件的引入就不多赘述了 直接看使用方法

二:json文件数据

地址我是引入的json文件数据结构大概是这个样子

例1

例2

三:先做个按钮做弹窗显示

做个动态style,控制是否高亮地址

<u-form-item label="地区" :border-bottom="false">
    <u-cell :border="false">
       <view slot="right-icon" @tap="showLocal = true">
         <text :style="{ color: local.length ? '#333' : '#c0c4cc' }">{{ local === '' ? '选择省/市/区' : local }}</text>
       </view>
     </u-cell>
 </u-form-item>

四:使用组件

 <u-picker
      @cancel="showLocal = false"
      @close="showLocal = false"
      :show="showLocal"
      :columns="addressColumns"
      @confirm="localConfirm"
      title="请选择所在地"
      keyName="name"
      itemHeight="80"
      closeOnClickOverlay
      ref="uPicker"
      @change="changeHandler"
      :defaultIndex="defaultAddress"
      immediateChange
    ></u-picker>

五:用到的变量

import areas from '@/utils/areas.json'//引入原始数据
  export default {
  data(){
	return {
			 local: '', //区域
			localCode: '', //这个变量看个人需求使用
	        showLocal: false,   //是否展示弹出层
	        addressColumns: [], //数据数组
	        defaultAddress: [],  //默认选中 (回填时或者初次显示默认选中)
	        addressData: areas,  //原始数据 (引入的json文件)
		}
	}    
}

六:初始化数据

   onShow() {
    //省的数组
      const provinceData = areas.map(e => {
        return { name: e.name, code: e.code }//这里可以直接return e.name  这里我是要用到code所以才用对象包起来的 下面的市 区 也一样
      })
//市的数组
      const cityData = areas.map(e => {
        const arr = []
        arr.push(
          e.areas.map(c => {
            return { name: c.name, code: c.code }
             
          })
        )
        return arr
      })
//区的数组
      const areaData = areas.map(e => {
        const arr = []
        arr.push(
          e.areas.map(c =>
            c.areas.map(d => {
              return { name: d.name, code: d.code }
            })
          )
        )
        return arr
      })
      const arr = [provinceData, cityData[0][0], areaData[0][0][0]]
      this.addressColumns = arr    //将得到的3个数组 的第一个市的所有数据赋值 作为初始数据
    
    },

七:数据变更时的方法

 changeHandler(e) {
//分别表示选中的列 , 该列的第几个,选中的3列的第几个的数组,组件本身
        const { columnIndex, index, indexs, picker = this.$refs.uPicker } = e
       //如果改变的是第一列
        if (columnIndex === 0) {
          const children1 = this.addressData[index].areas.map(e => {
            return { name: e.name, code: e.code }
          })
          picker.setColumnValues(1, children1)
//更换 第二列数据
          const children2 = this.addressData[index].areas[indexs[1]].areas.map(e => {
            return { name: e.name, code: e.code }
          })
          picker.setColumnValues(2, children2)
//更换 第三列数据
        }
        if (columnIndex === 1) {
//如果改变的是第二列
          const children3 = this.addressData[indexs[0]].areas[indexs[1]].areas.map(e => {
            return { name: e.name, code: e.code }
          })
          picker.setColumnValues(2, children3)
//更换 第三列数据
        }
      },

八:点击确认时的方法

    localConfirm(e) {
//显而易见 不多赘述
        this.local = `${e.value[0].name}-${e.value[1].name}-${e.value[2].name}`
        this.localCode = `${e.value[0].code}-${e.value[1].code}-${e.value[2].code}`
        this.showLocal = false

      },

九:数据的回填

//已经知道了 this.local ='省-市-区'初始弹窗时默认选中改值

     backfill(temp) {
        temp = item.area.split('-')
        let index,
          index1,
          index2 = 0
        let arr,
          arr1,
          arr2 = []
//匹配省市区对应每列的第几个
        this.addressData.forEach((item, i) => {
          if (item.name == temp[0]) {
            index = i
            item.children.forEach((val, ind) => {
              if (val.name == temp[1]) {
                index1 = ind
                val.children.forEach((e, n) => {
                  if (e.name == temp[2]) {
                    index2 = n
                  }
                })
              }
            })
          }
        })
        arr = this.addressData.map(e => {
          return { name: e.name, code: e.code }
        })
        arr1 = this.addressData[index].children.map(e => {
          return { name: e.name, code: e.code }
        })
        arr2 = this.addressData[index].children[index1].children.map(e => {
          return { name: e.name, code: e.code }
        })
//反推出3列的数组数据
        this.addressColumns = [arr, arr1, arr2]
// 赋值给 默认初始选中 
        this.defaultAddress = [index, index1, index2]
      }

这是选中效果

这是其中的json文件

链接: https://pan.baidu.com/s/1q8Qr-4FRXdhlGP0JkU9MJg
提取码: gwtr 

总结 

到此这篇关于Uni-App用uView组件库中u-picker实现地区的省-市-区三级联动、确认及回显的文章就介绍到这了,更多相关UniApp u-picker地区省市区三级联动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • top.location.href 没有权限 解决方法

    top.location.href 没有权限 解决方法

    以前好像没有遇到这问题,也可能是没有在意吧,我的blog内容页都是有判断的,规则是,如果top.location不是内容页的话就跳到内容页
    2008-08-08
  • javascript实现iframe框架延时加载的方法

    javascript实现iframe框架延时加载的方法

    这篇文章主要介绍了javascript实现iframe框架延时加载的方法,可基于setTimeout实现这一功能,是非常实用的技巧,需要的朋友可以参考下
    2014-10-10
  • js同时按下两个方向键

    js同时按下两个方向键

    本文通过实例代码给大家介绍了js同时按下两个方向键的实现方法,感兴趣的朋友跟随脚本之家小编一起看看吧
    2007-12-12
  • PHP使用方法重载实现动态创建属性的get和set方法

    PHP使用方法重载实现动态创建属性的get和set方法

    这篇文章主要介绍了PHP使用方法重载实现动态创建属性的get和set方法,使用本文方法可以在一个类中不用在写大量的set方法或get方法,需要的朋友可以参考下
    2014-11-11
  • js封装成插件_Canvas统计图插件编写实例

    js封装成插件_Canvas统计图插件编写实例

    下面小编就为大家带来一篇js封装成插件_Canvas统计图插件编写实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Vant+postcss-pxtorem 实现浏览器适配功能

    Vant+postcss-pxtorem 实现浏览器适配功能

    这篇文章主要介绍了Vant+postcss-pxtorem 实现浏览器适配,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • javascript中的altKey 和 Event属性大全

    javascript中的altKey 和 Event属性大全

    本文给大家介绍javascript中的altkey和event属性大全,涉及到altkey和event属性语法定义及用法,本文介绍的非常详细,感兴趣的朋友一起看看吧
    2015-11-11
  • JavaScript如何正确的写代码注释

    JavaScript如何正确的写代码注释

    这篇文章主要给大家介绍了关于JavaScript如何正确的写代码注释的相关资料,注释的作用是提高代码的可读性,帮助自己和别人阅读和理解你所编写的JavaScript代码,注释的内容不会在网页中显示,需要的朋友可以参考下
    2023-10-10
  • js实现幻灯片轮播图

    js实现幻灯片轮播图

    这篇文章主要为大家详细介绍了js实现幻灯片轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Bootstrap Table 在指定列中添加下拉框控件并获取所选值

    Bootstrap Table 在指定列中添加下拉框控件并获取所选值

    通过 bootstrap-table 的Column 配置项中的formatter,将获取到的数据转换为包含数据的 select 控件。然后根据用户选择项更新对应单元格数据,最后通过getallselection方法获取所选行数据
    2017-07-07

最新评论