循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用_vue行政区划多选组件-程序员宅基地

技术标签: vue  elementui  前端  # Vue.js  

转载   原文作者:伍华聪    原文地址:https://www.cnblogs.com/wuhuacong/p/13877431.html


在很多应用中,往往都涉及到记录用户所在省份、城市、区县或者街道等信息,一般我们可以通过联动的Select或者类似的界面组件进行展示,或者使用Element中的el-cascader界面组件进行展示,而全国的省份、城市、区县或者街道等信息我们可以通过官方的数据进行获取,可以直接存放在JS里面,也可以存储在自己的数据库里面,最后统一进行联动展示即可。本篇随笔介绍几种组件对省市区县联动处理的效果及做法,可以直接应用在我们项目中,也可以做为一个组件开发的参考学习。


1、基于element-china-area-data 第三方组件的使用

在github往往有很多我们需要的开源组件,我们可以拿来直接使用,如这个地址是:https://github.com/Plortinus/element-china-area-data ,在Vue+Element的项目中,直接通过npm进行安装组件即可:

npm install element-china-area-data -S

然后在页面组件中引入对象数据,绑定在el-cascader界面组件即可。

import {
     provinceAndCityData, regionData, rovinceAndCityDataPlus, regionDataPlus,  CodeToText, TextToCode } from 'element-china-area-data';

例如界面代码如下所示。

<div class="three">
      <span class="imp">3. 三级联动(不带“全部”选项)</span>
      <el-cascader
        v-model="selectedOptions2"
        class="long"
        size="large"
        :options="regionData"
        @change="handleChange"
      />
    </div>
    <div class="bind">
      <div>绑定值:{
    {
     selectedOptions2 }}</div>
      <div>区域码转汉字:{
    {
     CodeToText[selectedOptions2[0]] }},{
    {
     CodeToText[selectedOptions2[1]] }},{
    {
     CodeToText[selectedOptions2[2]] }}</div>
      <div>汉字转区域码:{
    {
     convertTextToCode(CodeToText[selectedOptions2[0]], CodeToText[selectedOptions2[1]], CodeToText[selectedOptions2[2]]) }}</div>
    </div>

其中数据selectedOptions2格式如下所示:

selectedOptions2: ['120000', '120100', '120101'],

而选中数据后,获得的数据格式同样是一个数组集合,如下所示:

在这里插入图片描述


几种界面组件的效果如下所示。
在这里插入图片描述

省市区三级联动的案例Demo代码如下。

<template>
  <div id="app">
    <el-cascader
      size="large"
      :options="options"
      v-model="selectedOptions"
      @change="handleChange">
    </el-cascader>
  </div>
</template>

<script>
  import {
     regionDataPlus } from 'element-china-area-data'
  export default {
    
    data () {
    
      return {
    
        options: regionDataPlus,
        selectedOptions: []
      }
    },

    methods: {
    
      handleChange (value) {
    
        console.log(value)
      }
    }
  }
</script>

2、基于v-region控件省市区街道选择组件

除了上面的 element-china-area-data 第三方组件,还有一个v-region的省市区街道的组件也做的不错,地址是:https://github.com/TerryZ/v-region 。

它的主要特点是支持 “省/直辖市”、“市”、“区/县”、“乡/镇/街道” 4级行政区域选择,可以选择Select的方式,或者分组方式展示,功能比较多样化一些。

在这里插入图片描述

或者:

在这里插入图片描述


这个v-region已经封装为组件进行使用,所以使用上更加简化一些,如下简单的界面声明即可使用。

  <h3>常规表单下拉选择元素模式</h3>
  <p>Regular form element with select tag</p>
  <v-region :town="true"></v-region>

街道可以包含,也可以省略,如果省略就是省市区县的三级选择了。这个组件的几种用法如下所示。

<span class="imp">基于v-region控件省市区街道选择组件</span>
    <div class="vregion">
      <h3>常规表单下拉选择元素模式</h3>
      <v-region v-model="selectedRegion" :town="true" @values="regionChange" />
      <br><br>

      <h3>多分组切换模式</h3>
      <v-region
        v-model="modelGroup"
        :town="true"
        type="group"
        @values="regionChange"
      />

      <br><br><br>
      <h3>多列竖排模式</h3>
      <p>Column group</p>
      <v-region type="column" @values="regionChange" />

      <br><br><br>
      <h3>城市选择器</h3>
      <p>City picker</p>
      <v-region type="city" :city-picker="true" @values="regionChange" />
    </div>

这个组件如果是省市区县街道模式的话,需要设置初始化值就是一个对象的格式,如下所示。

selectedRegion: {
    
        province: '350000',
        city: '350100',
        area: '350104',
        town: '350104008'
      }

例如,我在一个业务表的案例界面中,就涉及到了省市区街道的选择处理,就是采用了这个v-region的组件进行展示处理的。界面效果如下所示。

在这里插入图片描述

如果是新建窗体的时候,我们可以指定组件的默认值,如下的数据格式:

selectedRegion: {
     province: '440000', city: '440100', area: '440111', town: '440111010' },

另外,我们一般需要在数据库里面存储对应的省市区县的数据,以便查询或者其他需要,那么我们就需要在选择数据变化的时候,设置一下对应的属性字段,如下所示。

// 修改编辑窗体的省市区街道
    changeEditRegion(data) {
    
      console.log(data)
      if (data) {
    
        this.editForm.province = data.province ? data.province.key : '';
        this.editForm.city = data.city ? data.city.key : '';
        this.editForm.district = data.area ? data.area.key : '';
        this.editForm.street = data.town ? data.town.key : '';
        // console.log(this.editForm)
      }
    },

而在展示对话框的时候,我们则可以组合省市区数据,作为v-region组件的初始化值,如下代码使用。

在这里插入图片描述


3、自定义省市区的组件

一般情况上,使用上面的方式就能解决问题了,不过这里介绍另外一种思路,就是基于数据库数据的方式进行省市区联动的处理。

以前我在开发系统的时候,引入了省市区的数据,存储在几个数据库表里面,然后通过接口的方式检索省市区及处理器联动过程。

那么在基于这些数据的基础上,我们也可以这样处理的。

首先我们创建省、市、区县的表,并在后端发布对应的API接口,如我的ABP后端接口展示。

在这里插入图片描述

然后在根据这些接口,构建好对应的API客户端,再在界面引入使用,通过定义自定义组件的方式来整合使用则更加简单。

在这里插入图片描述

在定义一个自定义组件my-citypicker,组件代码如下所示。

<!--用来演示联动的案例-->
<template>
  <div class="flex-container">
    <div class="flex-item">
      <label></label>
      <el-select v-model="provinceValue" placeholder="请选择省" @change="chooseProvince">
        <el-option
          v-for="item in provinceData"
          :key="item.id"
          :label="item.provinceName"
          :value="item.id"
        />
      </el-select>
    </div>
    <div class="flex-item">
      <label></label>
      <el-select v-model="cityValue" placeholder="请选择市" @change="chooseCity">
        <el-option
          v-for="item in cityData"
          :key="item.id"
          :label="item.cityName"
          :value="item.id"
        />
      </el-select>
    </div>
    <div class="flex-item">
      <label>区、县</label>
      <el-select v-model="areaValue" placeholder="请选择区、县" @change="chooseArea">
        <el-option
          v-for="item in areaData"
          :key="item.id"
          :label="item.districtName"
          :value="item.id"
        />
      </el-select>
    </div>
  </div>
</template>

<script>
// 导入Axios的HTTP请求处理封装类
import {
     Province, City, District } from '@/api/city'

export default {
    
  data() {
    
    return {
    
      provinceValue: '',
      cityValue: '',
      areaValue: '',

      provinceData: [],
      cityData: [],
      areaData: []
    }
  },
  created() {
    
    Province.GetAll().then(res => {
    
      if (res.result) {
    
        this.provinceData = res.result.items
        // console.log(res.result);
      }
    }).catch(e => {
    
      this.$message.error('网络连接超时');
    })
  },
  methods: {
    
    chooseProvince(value) {
    
      this.cityValue = '';
      this.areaValue = '';
      this.cityData = [];
      this.areaData = [];

      var data = {
     ProvinceID: value };
      City.GetAll(data).then(res => {
    
        if (res.result) {
    
          this.cityData = res.result.items
        }
      }).catch(e => {
    
        this.$message.error('网络连接超时');
      })
    },
    chooseCity(value) {
    
      this.areaValue = '';

      var data = {
     CityID: value };
      District.GetAll(data).then(res => {
    
        if (res.result) {
    
          this.areaData = res.result.items
        }
      }).catch(e => {
    
        this.$message.error('网络连接超时');
      })
    },
    chooseArea() {
    

    }
  }
}
</script>

<style>
.flex-container {
    
  display: flex;
  flex-flow: row wrap;
  justify-content: space-around;
  padding: 0;
  margin: 0;
  list-style: none;
}

.flex-item {
    
  padding: 5px;
  height: auto;
  color: tomato;
  font-weight: bold;
  text-align: center;
}
</style>

一样可以实现省市区县的联动处理:

在这里插入图片描述

以上就是几种VUE+Element 前端应用中,关于省市区县联动处理的组件使用的案例分析,希望大家在借鉴使用别人组件的基础上,也丰富自己的组件处理,毕竟Vue赋予我们强大的组件定制能力。



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_40770656/article/details/109561725

智能推荐

【Bazel】error executing command /usr/bin/gcc @bazel-out/k8-fastbuild/bin/flashroute/flashroute-2.p_听船歌声声慢的博客-程序员宅基地

文章浏览阅读2.9k次。执行命令 bazel build //flashroute:flashroute 时报错:error executing command /usr/bin/gcc @bazel-out/k8-fastbuild/bin/flashroute/flashroute-FAILED: Build did NOT complete successfully解决:是系统问题“On some systems, the default version of C++ is not set to 14, in._error executing command

vue.js自定义标签(自定义组件)_vue自定义标签写法-程序员宅基地

文章浏览阅读1.2w次。分为三个部分:1.template模版:123456&lt;script type="text/x-template" id="todo-form-template"&gt; &lt;form v-on:submit.prevent="addtodo(newtodo)"&gt; &lt;input type="text" v-model="newtodo.ti_vue自定义标签写法

pytorch--load()模型参数加载-程序员宅基地

文章浏览阅读5.6k次。加载模型,一部分用于测试阶段,主要知识点在于数据加载的问题【torch.device】官网链接1官网链接2不解释save代码示例:>>> torch.load('tensors.pt')# Load all tensors onto the CPU>>> torch.load('tensors.pt', map_location=torch.dev...

HOU 2824 The Euler function 欧拉函数_hdu euler function-程序员宅基地

文章浏览阅读877次。The Euler functionTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3817 Accepted Submission(s): 1580Problem DescriptionThe Euler f_hdu euler function

MySQL5.6 replication architecture --原图来自姜承尧-程序员宅基地

文章浏览阅读172次。转载于:https://www.cnblogs.com/yuyue2014/p/4809493.html

随便推点

使用pca进行坐标系转换、降维_pca的坐标轴-程序员宅基地

文章浏览阅读2.2k次。利用PCA进行坐标系转换pca是一种常用的数据降维的方法,而其中的降维的步骤就是:选取前 k 个特征值。如果我们不选择这个步骤,那么就不会进行降维了,反而会进行坐标系的转换。具体步骤1、首先生成高斯二维分布的数据matlab代码mul = [1 2];SIGMA = [1 0.81; 0.81 1];data1 = mvnrnd(mul,SIGMA,500);plot(da..._pca的坐标轴

Linux下解决sudo输入命令不能自动补全_linux systemctl 加上sudo 不能补全 以及其他启动-程序员宅基地

文章浏览阅读3.2k次。解决sudo输入命令不能自动补全sudo vi /etc/bash.bashrcif [ -f /etc/bash_completion ]; then . /etc/bash_completionfi重新登录终端命令就可以自动补全了。_linux systemctl 加上sudo 不能补全 以及其他启动

lamp 安装_亮仔_新浪博客-程序员宅基地

文章浏览阅读62次。http://forum.ubuntu.org.cn/viewtopic.php?t=251355http://wiki.ubuntu.org.cn/index.php?title=LAMP_服务器安装配置&variant=zh-cn

C++ STL 四种智能指针-程序员宅基地

文章浏览阅读6.9w次,点赞181次,收藏998次。C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,其中 auto_ptr 是 C++98 提出的,C++11 已将其摒弃,并提出了 unique_ptr 替代 auto_ptr。虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用更加安全的 unique_ptr,后文会详细叙述。_智能指针

channels_first 与 channels_last 的区别-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏4次。用卷积神经网络处理一组彩色图片时,Caffe/Theano 使用的数据格式是channels_first即:(样本数,通道数,行数(高),列数(宽))Tensforflow 使用的数据格式是channels_last即:(样本数,行数(高),列数(宽),通道数)参考博文:https://blog.csdn.net/nima1994/article/details/803...

elasticsearch数据建模-程序员宅基地

文章浏览阅读358次。类似于mysql数据库主外键,三范式 ,先根据条件查询到主键,再根据主键查询到对应的数据PUT /website/users/1{ "name" : "小鱼儿", "email" : "[email protected]", "birthday" : "1997-08-03"}PUT /website/blog/1{ "title"