详解Vue、element-ui、axios实现省市区三级联动


Posted in Javascript onMay 07, 2019

现在大部分电商的网站、app都需要用户或者管理者去选择设置地区等位置信息。下面我就介绍一下前端开发者用vue,axios,element-ui开发一个省市区三级联动的组件。

1.准备工作,首先我们需要全中国的省市区资源的json数据(科普一下:前六位数字是身份证前六位)

2.搭建vue-cli,安装axios,element-ui,创建vue,webpack项目

1).

在控制台或者终端执行以下代码,其中只需要路由(y),其他e2e,eslint这些不需要(y)

vue init webpack threelink

cd threelink

npm run dev

把没用的组件删除,重新创建组件

npm install axios --save ,安装axios

npm i element-ui -S(这是缩写) , 安装element-ui   

2).

在项目threelink->src->main.js里面添加,调用element-ui插件得代码

// 加载element_ui
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)

 3).在static下创建json文件夹,文件夹里面放map.json,就是全国地址的数据信息,目录结构如下

详解Vue、element-ui、axios实现省市区三级联动

3.基本步骤都已经ok,下面我们开始写前端界面代码.

详解Vue、element-ui、axios实现省市区三级联动

上element-ui官网,找到选择器select,这里我们就不多说了,疯狂地复制粘贴,写css样式就行了。粘贴完修改完之后的样子就是这个样子了,

详解Vue、element-ui、axios实现省市区三级联动

别着急,一会开始上代码!

4.首先我们要知道,当我们选择之后数据才会变化的,所以要给select绑定change事件。

我们仔细阅读了element-ui的select文档之后发现,v-model的值为当前被选中的el-option的 value 属性值。

5.template组件里面的代码!!!

<div class="linkage">
  <el-select
   v-model="sheng"
   @change="choseProvince"//这个change事件是select的,不是option的,别写在option里面
   placeholder="省级地区">
   <el-option
    v-for="item in province"
    :key="item.id"
    :label="item.value"
    :value="item.id">
   </el-option>
  </el-select>
  <el-select
   v-model="shi"
   @change="choseCity"
   placeholder="市级地区">
   <el-option
    v-for="item in shi1"
    :key="item.id"
    :label="item.value"
    :value="item.id">
   </el-option>
  </el-select>
  <el-select
   v-model="qu"
   @change="choseBlock"
   placeholder="区级地区">
   <el-option
    v-for="item in qu1"
    :key="item.id"
    :label="item.value"
    :value="item.id">
   </el-option>
  </el-select>
 </div>

script标签里面的代码!!

这里主要的难点就是,找到json数据的特点!

像直辖市这些没有市区的,默认省份=市区,例如:省份:天津。城市:天津。区县:。。/

我们可以找到数据之间的规律自己手动增加数据信息,如果要返回给后端,那么就拿出来他的前面的位置参数,或者是后面的未知参数!!

例如:

详解Vue、element-ui、axios实现省市区三级联动

按正常来讲,是没有红色圈出来的那个参数的,这是我按照正确的规律手动后添加的!!!为了满足直辖市而添加

一定要记得手动添加的数据是无效的!!这个只是为了自己编码方便才添加的!手动添加的那条数据,不要返给后端,要找到它前面的数据,找到真实数据!

import axios from 'axios'
export default {
 data () {
  return {
   mapJson:'../static/json/map.json',
   province:'',
   sheng: '',
   shi: '',
   shi1: [],
   qu: '',
   qu1: [],
   city:'',
   block:'',
  }
 },
 methods:{
  // 加载china地点数据,三级
   getCityData:function(){
    var that = this
    axios.get(this.mapJson).then(function(response){
     if (response.status==200) {
      var data = response.data
      that.province = []
      that.city = []
      that.block = []
      // 省市区数据分类
      for (var item in data) {
       if (item.match(/0000$/)) {//省
        that.province.push({id: item, value: data[item], children: []})
       } else if (item.match(/00$/)) {//市
        that.city.push({id: item, value: data[item], children: []})
       } else {//区
        that.block.push({id: item, value: data[item]})
       }
      }
      // 分类市级
      for (var index in that.province) {
       for (var index1 in that.city) {
        if (that.province[index].id.slice(0, 2) === that.city[index1].id.slice(0, 2)) {
         that.province[index].children.push(that.city[index1])
        }
       }
      }
      // 分类区级
      for(var item1 in that.city) {
       for(var item2 in that.block) {
        if (that.block[item2].id.slice(0, 4) === that.city[item1].id.slice(0, 4)) {
         that.city[item1].children.push(that.block[item2])
        }
       }
      }
     }
     else{
      console.log(response.status)
     }
    }).catch(function(error){console.log(typeof+ error)})
   },
   // 选省
   choseProvince:function(e) {
    for (var index2 in this.province) {
     if (e === this.province[index2].id) {
       console.log(this.province[index2].id)//你选择的省级编码
      console.log(this.province[index2].value)//省级编码 对应的汉字 
      this.shi1 = this.province[index2].children
      this.shi = this.province[index2].children[0].value
      this.qu1 =this.province[index2].children[0].children
      this.qu = this.province[index2].children[0].children[0].value
      this.E = this.qu1[0].id
     }
    }
   },
   // 选市
   choseCity:function(e) {
    for (var index3 in this.city) {
     if (e === this.city[index3].id) {
      this.qu1 = this.city[index3].children
      this.qu = this.city[index3].children[0].value
      this.E = this.qu1[0].id
      // console.log(this.E)
     }
    }
   },
   // 选区
   choseBlock:function(e) {
    this.E=e;
    // console.log(this.E)
   },
  },
  created:function(){
   this.getCityData()
  }
}

7.效果图

 详解Vue、element-ui、axios实现省市区三级联动

详解Vue、element-ui、axios实现省市区三级联动

8.OK我个人感觉效果还不错,也不卡

github项目地址:https://github.com/LLJJTT/threelink 

以上所述是小编给大家介绍的Vue、element-ui、axios实现省市区三级联动详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Linux下使用jq友好的打印JSON技巧分享
Nov 18 Javascript
jQuery统计指定子元素数量的方法
Mar 17 Javascript
BootStrap的Datepicker控件使用心得分享
May 25 Javascript
canvas绘制环形进度条
Feb 23 Javascript
快速了解vue-cli 3.0 新特性
Feb 28 Javascript
微信小程序通过保存图片分享到朋友圈功能
May 24 Javascript
AngularJS 多指令Scope问题的解决
Oct 25 Javascript
vue插槽slot的理解和使用方法
Apr 03 Javascript
ES6知识点整理之模块化的应用详解
Apr 15 Javascript
Vue+Express实现登录注销功能的实例代码
May 05 Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
May 30 Javascript
Vue2.0 实现页面缓存和不缓存的方式
Nov 12 Javascript
webpack结合express实现自动刷新的方法
May 07 #Javascript
记录一次开发微信网页分享的步骤
May 07 #Javascript
Vue 幸运大转盘实现思路详解
May 06 #Javascript
Vue运用transition实现过渡动画
May 06 #Javascript
使用vue-router切换页面时,获取上一页url以及当前页面url的方法
May 06 #Javascript
vue路由跳转传参数的方法
May 06 #Javascript
如何获取vue单文件自身源码路径
May 06 #Javascript
You might like
德劲1104的电路分析与改良
2021/03/01 无线电
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
PHP实现的json类实例
2015/07/28 PHP
php编程每天必学之表单验证
2016/03/01 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
js获取select选中的option的text示例代码
2013/12/19 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
python使用正则筛选信用卡
2019/01/27 Python
python 如何将office文件转换为PDF
2020/09/22 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
如何实现一个自定义类的序列化
2012/05/22 面试题
法警的竞聘演讲稿
2014/01/02 职场文书
劳动之星获奖感言
2014/02/01 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
小露珠教学反思
2014/04/30 职场文书
质量月口号
2014/06/20 职场文书
检讨书大全
2015/01/27 职场文书
学生病假条范文
2015/08/17 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫