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

这篇具有很好参考价值的文章主要介绍了【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显,# 【Uni-App小程序】,uni-app,javascript,前端,省市区,uview

一:准备工作

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

二:json文件数据

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

例1

【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显,# 【Uni-App小程序】,uni-app,javascript,前端,省市区,uview

例2

【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显,# 【Uni-App小程序】,uni-app,javascript,前端,省市区,uview

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

做个动态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>

四:使用组件

【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显,# 【Uni-App小程序】,uni-app,javascript,前端,省市区,uview

 <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>

五:用到的变量

【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显,# 【Uni-App小程序】,uni-app,javascript,前端,省市区,uview

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

六:初始化数据

【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显,# 【Uni-App小程序】,uni-app,javascript,前端,省市区,uview

   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个数组 的第一个市的所有数据赋值 作为初始数据
    
    },

七:数据变更时的方法

【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显,# 【Uni-App小程序】,uni-app,javascript,前端,省市区,uview

 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)
//更换 第三列数据
        }
      },

八:点击确认时的方法

【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显,# 【Uni-App小程序】,uni-app,javascript,前端,省市区,uview

    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

      },

九:数据的回填

【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显,# 【Uni-App小程序】,uni-app,javascript,前端,省市区,uview

//已经知道了 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]
      }

这是选中效果

【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显,# 【Uni-App小程序】,uni-app,javascript,前端,省市区,uview

这是其中的json文件

链接:https://pan.baidu.com/s/1_heSAGHJnTe-343fRmbOPA
提取码:hmky

如果失效了 ,可以联系我获取文章来源地址https://www.toymoban.com/news/detail-624164.html

到了这里,关于【Uni-App】用 uView 组件库中的u-picker 实现地区的 省-市-区 三级联动&确认&回显的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app 使用v-model封装picker组件和自定义样式

    1、v-model封装picker组件 (1)封装组件myPicker.vue (2)组件调用 (3)属性说明 属性名 类型 默认值 说明 options Object 数据选项,默认[{ name: \\\"办公\\\", value: \\\"1\\\" }]格式 rangeKey String label 数据选项的属性名 rangeValue String value 数据选项的属性值 placeholoder String 请选择 未选择数据时的默认

    2024年02月09日
    浏览(43)
  • uni-app 解决钉钉小程序日期组件uni-datetime-picker不兼容ios问题

    最近在使用uni-app开发 钉钉小程序 ,遇到一个ios的兼容性问题 uni-datetime-picker 组件在模拟器上可以使用,在真机上不生效问题 就是自定义一个 view 然后通过click事件触发dd.datePicker。 在优化一下自定义的日期组件的样式 样式跟uni-ui的 uni-datetime-picker 组件样式一样。

    2024年02月03日
    浏览(33)
  • 微信小程序uni-app uni-date-picker中的maskClick无效解决方法

    前段时间做小程序 我在调用uni-date-picker组件时候需要@maskClick方法  谁知道竟然无效,上网一查,看到也有其他小伙伴反应类似的问题,我就看了看源码,最终调成功了,记录一下,防止自己忘记。 ps:如果能帮助到大家,那就更开心了。 话不多说,进入正题: 调用uni-dateti

    2024年02月14日
    浏览(27)
  • uView -- u-picker 添加时间限制

    用户选择时间【开始时间】选择范围要小于等于【结果时间】,【结束时间】选择范围要大于等于【开始时间】 一:修改uview-ui源码 1:找到 node_modulesuview-uicomponentsu-pickeru-picker.vue 文件,新增属性如下。

    2024年02月07日
    浏览(29)
  • 微信小程序 u-picker 三级联动 uView

    场景 移动端微信小程序框架 uView 中的 u-picker 实现三级联动 数据是一级一级加载的 [12,1201,120101] 多列联动 先了解属性参数 mode可以设置为:time、region、selector、multiSelector,区分时间、地区、单列,多列模式。 default-region :设置默认的地区如:[“13”, “1303”, “130304”] pa

    2024年02月09日
    浏览(29)
  • uni-app uni-ui 微信小程序 uni-datetime-picker 时间选择组件设置start和end属性,实现时间选择限制

     效果如图,先选择开始日期,完成日期需要在开始日期之后,先选择完成日期,开始日期需要在完成日期之前 需要用到uni-datetime-picker官方的三个属性  代码如下 这样一个能够限制选定范围的组件就ok了!    

    2024年02月11日
    浏览(44)
  • uni-app 使用 Uview2.x 搭建自定义tabbar组件,自定义navbar,还会解决自定义导航栏引起闪烁性能差的问题!!!

    pages.json  上面可以看到tabbar我使用的原生的,但是值配置了pagepath,并且page里三个首页都可以自定义顶部导航栏,当然如果删掉custom那一行代码,就切换成原生顶部导航栏了。 下面拿一个首页作为代码演示:(顶部自定义导航栏组件和底部导航栏组件会放在最后) 下图组件

    2023年04月09日
    浏览(69)
  • uni-app uView自定义底部导航栏

    因项目需要自定义底部导航栏,我把它写在了组件里,基于uView2框架写的(vue2);   在components下创建tabbar.vue文件,代码如下:  app.vue (有没有大佬知道为什么这个样式加载app.vue里才生效)  pages.json配置 页面使用: ( mine.vue ) 注: current是底部导航栏的下标,你在tabb

    2024年02月14日
    浏览(64)
  • uni-app+uView实现点击查看大图片的效果

    参数说明

    2024年02月10日
    浏览(36)
  • uni-app 之 安装uView,安装scss/sass编译

    uni-app 之 安装uView,安装scss/sass编译 image.png image.png image.png 点击HBuilder X 顶部,工具,插件安装,安装新插件 image.png image.png 安装成功! 注意,一定要先登录才可以安装 image.png 1. 引入uView主JS库 在项目根目录中的 main.js 中,引入并使用uView的JS库,注意这两行要放在 import Vu

    2024年02月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包