详解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 相关文章推荐
JS 树形递归实例代码
May 18 Javascript
Javascript变量函数浅析
Sep 02 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
Nov 29 Javascript
js获取当前页面的url网址信息
Jun 12 Javascript
JavaScript 表单处理实现代码
Apr 13 Javascript
浅谈jquery.fn.extend与jquery.extend区别
Jul 13 Javascript
jQuery采用连缀写法实现的折叠菜单效果
Sep 18 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
Jan 18 Javascript
浅析Bootstrap组件之面板组件
May 04 Javascript
最常见和最有用的字符串相关的方法详解
Feb 06 Javascript
jQuery中extend函数简单用法示例
Oct 11 jQuery
Postman如何实现参数化执行及断言处理
Jul 28 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
php笔记之常用文件操作
2010/10/12 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
微信支付之JSAPI公众号支付详解
2019/05/15 PHP
javascript 写类方式之九
2009/07/05 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
用js控制组织结构图可以任意拖拽到指定位置
2014/01/17 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
2016/08/02 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
js中关于Blob对象的介绍与使用
2019/11/29 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
python使用电子邮件模块smtplib的方法
2016/08/28 Python
理解Python中的绝对路径和相对路径
2017/08/30 Python
Python提取频域特征知识点浅析
2019/03/04 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
python 实现字符串下标的输出功能
2020/02/13 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
python 爬虫请求模块requests详解
2020/12/04 Python
python中reload重载实例用法
2020/12/15 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
力学专业毕业生自荐信
2013/11/17 职场文书
11月红领巾广播稿
2014/01/17 职场文书
我们的节日清明节活动方案
2014/03/05 职场文书
高中班主任寄语
2019/06/21 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python