首页 > 其他分享 >uniapp 省市区 回填

uniapp 省市区 回填

时间:2023-06-29 22:11:25浏览次数:38  
标签:uniapp arr code return name map 回填 省市区 areas

<template>
	<view>
		<u-button @click="tesx">11</u-button>
	{{aa}}
		<city v-model="aa"></city>
	</view>
</template>

<script>
	import city from './city.vue'
	export default {
		components:{city},
		data() {
			return {
				aa:''
			}
		},
		methods: {
			tesx(){
				this.aa='河北省-石家庄市-市辖区'
			}
			
		}
	}
</script>

<style>

</style>

<template>
  <view>	
   <view @tap="toOpen">
          <text :style="{ color: local.length ? '#333' : '#c0c4cc' }">{{
            local === "" ? "选择省/市/区" : local
          }}</text>
        </view>
    <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>
  </view>
</template>

<script>
import areas from "./china.json"; //引入原始数据
export default {
	props:{
		value:{}
	},
  data() {
    return {
      local: "", //区域
      localCode: "", //这个变量看个人需求使用
      showLocal: false, //是否展示弹出层
      addressColumns: [], //数据数组
      defaultAddress: [], //默认选中 (回填时或者初次显示默认选中)
      addressData: areas, //原始数据 (引入的json文件)
    };
  },
  watch:{
		  
	  value(val){
		  if(val!==this.local){
			  this.local=val
			 
		  }
	  }
  },
  methods: {
	  toOpen(){
		  if( this.local){
			  this.backfill(this.local)
		  }
		  this.showLocal = true
	  },
    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.$emit('input',this.local)
      this.showLocal = false;
    },
    backfill(temp) {
      temp = temp.split("-");
      let index,
        index1,
        index2 = 0;
      let arr,
        arr1,
        arr2 = [];
		console.log(this.addressData);
      //匹配省市区对应每列的第几个
      this.addressData.forEach((item, i) => {
        if (item.name == temp[0]) {
          index = i;
          item.areas.forEach((val, ind) => {
            if (val.name == temp[1]) {
              index1 = ind;
              val.areas.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].areas.map((e) => {
        return { name: e.name, code: e.code };
      });
      arr2 = this.addressData[index].areas[index1].areas.map((e) => {
        return { name: e.name, code: e.code };
      });
      //反推出3列的数组数据
      this.addressColumns = [arr, arr1, arr2];
      // 赋值给 默认初始选中
      this.defaultAddress = [index, index1, index2];
    },
  },

  mounted() {
    //省的数组
    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个数组 的第一个市的所有数据赋值 作为初始数据
  },
};
</script>

<style></style>

标签:uniapp,arr,code,return,name,map,回填,省市区,areas
From: https://www.cnblogs.com/7c89/p/17515329.html

相关文章

  • uniapp 消息推送
    1.前言作为一个非原生App的开发者,对于手机系统的推送机制了解是是非有限的,只有了解清楚这些机制,后期的开发才会少踩很多坑,本文将对推送机制逻辑进行一个简单的梳理与记录2.推送流程推送流程1.0:后台服务器->推送服务器(第三方)->手机App推送流程2.0:后台服务器->uni-clou......
  • 前端Vue自定义简单通用省市区选择器picker地区选择器picker 收获地址界面模版
    前端Vue自定义简单通用省市区选择器picker地区选择器picker收获地址界面模版,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13266效果图如下:代码实现如下:cc-selectDity使用方法<!--省市区选择show:是否显示 @sureSelectArea:确认事件......
  • Uniapp下GoEasy通知栏推送不工作问题排查记录
    我们是uniapp开发的app,项目中的系统消息推送使用的是GoEasyWebsocket实时推送,上线一段时间后,客户反馈说,当app没有在前台运行时也需要想办法通知用户一些重要的系统通知。那么此时通知栏推送就需要集成了。集成通知栏推送很麻烦,国内一些公司做了一些插件来帮我们打通app跟厂商之......
  • uniapp,微信小程序点击按钮打开地图进行导航
    uniapp示例:<viewclass="order-contact-item"style="width:50%;text-align:center;"@tap="openMapNavigation">导航商家</view> //js函数打开导航 openMapNavigation(){ varthat=this; uni.getLocation({ type:'g......
  • 在线直播系统源码,uniapp滚动加载
    在线直播系统源码,uniapp滚动加载声明submitDate对象用来存放接口需要的具体参数,其中page和limit为查询页数和每页查询数据,total为记录数据总条数,pageList存放页面数据。     data(){return{  pageList:[],//列表数据submitDate:{//放你自己的参数startDate:''......
  • JavaScript、vue、uniapp如何获取本周开始时间和结束时间?
    //获得本周的开始时间: getStartDayOfWeek(time){ letnow=newDate(time);//当前日期 letnowDayOfWeek=now.getDay();//今天本周的第几天 letday=nowDayOfWeek||7; letnowDay=now.getDate();//当前日 letnowMonth=now.getMonth();//......
  • uniapp微信小程序转支付宝小程序踩坑(持续更新)
    首先第一个,真有被折磨到!//微信正常使用,支付宝不行<imagesrc="https://static.dabapiao.com/images/coupon-index.png"mode=""/>//以下两种微信、支付宝都正常使用<imagesrc="https://static.dabapiao.com/images/coupon-index.png"mode="aspectFill&quo......
  • uniapp项目嵌入微信公众号,授权登录
    1.创建公众号2.配置公众号信息=>公众号设置=>账号详情                          =>功能设置=>配置业务、js接口安全、网页授权域名               =>人员设置:绑定开发者微信号3.基本配......
  • 基于uni-app+vue3渲染markdown格式|uniapp软键盘顶起问题解决方案
    前些时候有给大家分享一篇uni-app+vite4+uview-plus搭建跨端项目。今天主要分享下在uniapp中渲染markdown语法及uniapp中软键盘弹起,页面tabbar或顶部自定义navbar导航栏被撑起挤压的问题。如上图:支持h5+小程序+App端markdown解析渲染。上面则是演示了在App端+小程序端键盘弹......
  • Uniapp仿ChatGPT Stream流式输出(非Websocket)
    前言最近写一个chagpt小程序,流式输出可以使用websocket也可以使用stream来实现,这里就不折腾websocket的了,我发现uniapp实现流式输出的方式挺多的,主要是有些小程序还不兼容,花了点时间研究了一下。EventSourceEventSource也称为SSE(Server-SentEvents),是服务器推送的一个网络事件......