按部就班VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

在不少应用中,每每都涉及到记录用户所在省份、城市、区县或者街道等信息,通常咱们能够经过联动的Select或者相似的界面组件进行展现,或者使用Element中的el-cascader界面组件进行展现,而全国的省份、城市、区县或者街道等信息咱们能够经过官方的数据进行获取,能够直接存放在JS里面,也能够存储在本身的数据库里面,最后统一进行联动展现便可。本篇随笔介绍几种组件对省市区县联动处理的效果及作法,能够直接应用在咱们项目中,也能够作为一个组件开发的参考学习。html

一、基于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界面组件便可。vue

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

例如界面代码以下所示。ios

    <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格式以下所示git

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

而选中数据后,得到的数据格式一样是一个数组集合,以下所示github

 

 几种界面组件的效果以下所示。数据库

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

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

 

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

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

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

或者

 

这个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组件的初始化值,以下代码使用。

  

三、自定义省市区的组件

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

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

那么在基于这些数据的基础上,咱们也能够这样处理的。

首先咱们建立省、市、区县的表,并在后端发布对应的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赋予咱们强大的组件定制能力。 

 

为了方便读者理解,我列出一下前面几篇随笔的链接,供参考:

按部就班VUE+Element 前端应用开发(1)--- 开发环境的准备工做

按部就班VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用

按部就班VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理

按部就班VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理

按部就班VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展现和字段转义处理

按部就班VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用

按部就班VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数

按部就班VUE+Element 前端应用开发(8)--- 树列表组件的使用

按部就班VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

按部就班VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各类图表展现 

按部就班VUE+Element 前端应用开发(11)--- 图标的维护和使用

按部就班VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登陆处理

按部就班VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

按部就班VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展现

按部就班VUE+Element 前端应用开发(15)--- 用户管理模块的处理

按部就班VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理 

按部就班VUE+Element 前端应用开发(17)--- 菜单管理

按部就班VUE+Element 前端应用开发(18)--- 功能点管理及权限控制  

按部就班VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

按部就班VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码  

按部就班VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

按部就班VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不一样的文件中 

按部就班VUE+Element 前端应用开发(23)--- 基于ABP实现先后端的附件上传,图片或者附件展现管理

按部就班VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理 

按部就班VUE+Element 前端应用开发(25)--- 各类界面组件的使用(1)

相关文章
相关标签/搜索