详解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 相关文章推荐
基于jQuery判断两个元素是否有重叠部分的代码
Jul 25 Javascript
jquery实现div阴影效果示例代码
Sep 16 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
Dec 14 Javascript
利用javascript实现全部删或清空所选的操作
May 27 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
Javascript对象Clone实例分析
Jun 09 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
Aug 25 Javascript
JS获取鼠标相对位置的方法
Sep 20 Javascript
jQuery给指定的table动态添加删除行的操作方法
Oct 12 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
JS隐藏号码中间4位代码实例
Apr 09 Javascript
vue实现在线翻译功能
Sep 27 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+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
jQuery功能函数详解
2015/02/01 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
详解支持Angular 2的表格控件
2017/01/19 Javascript
浅析为什么a=&quot;abc&quot; 不等于 a=new String(&quot;abc&quot;)
2017/10/25 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
Python 代码性能优化技巧分享
2012/08/07 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
python3 读写文件换行符的方法
2018/04/09 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
python将unicode和str互相转化的实现
2020/05/11 Python
Python-openCV开运算实例
2020/07/05 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
最新大学生自我评价
2013/09/24 职场文书
入党积极分子思想汇报范文
2014/01/05 职场文书
医院实习介绍信
2014/01/12 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL