vue+iview/elementUi实现城市多选


Posted in Javascript onMarch 28, 2019

城市多选组件

最近收到了一个需求,管理系统需要上线一个活动,但是活动是根据地区上线的,最小范围到市,于是有了下面这个组件

页面展示如图:

vue+iview/elementUi实现城市多选

vue+iview/elementUi实现城市多选

vue+iview/elementUi实现城市多选

vue+iview/elementUi实现城市多选

上代码~~~

<template>
  <div class="tm-mil-city">
   <p class="tm-mil-city-title tm-mil-mb20">{{name}}</p>
   <div class="tm-mil-district-box tm-mil-mb20">
    <Select class="tm-mil-selsect" style='width:200px' v-model='province' placeholder='全部' @on-change='changeProvince'>
     <Option v-for='item in provinceList' :value='item.id' :key='item.id'>{{ item.regionName }}</Option>
    </Select>
    <span class="tm-mil-selsect-all-btn tm-mil-ml20 tm-mil-colB" @click="chooseAllRegion">全选</span>
    <div class="tm-mil-line-loading" v-if="province && !cityList.length"><img src="../assets/loading.gif" alt=""></div>
    <div class="tm-mil-mb20" v-if="cityList.length">
     <CheckboxGroup style="marginTop:10px;width:900px" v-model="checkCity">
       <Checkbox v-for='item in cityList' :key='item.id' :label="item.regionCode">{{item.regionName}}</Checkbox>
     </CheckboxGroup>
     <Button v-show="cityList.length" size="small" style="marginTop:10px" @click="saveCheckCity">确定</Button>
    </div>
   </div>
   <p class="tm-mil-city-title tm-mil-mb20">已选择的地区</p>
   <div class="tm-mil-line-loading" v-if="waiting"><img src="../assets/loading.gif" alt=""></div>
   <div class="tm-mil-choose-district" v-else>
    <div v-for="(item, idx) in allCheckCityShowList" :key="idx">
     <span class="tm-mil-colB">{{provinceFilter(item.province)}}</span>
     <span class="tm-mil-ml10" v-for="(obj, indx) in item.cityList" :key="indx" >{{obj}}</span>
    </div>
    <span v-if="!allCheckCityShowList.length">全部地区</span>
   </div>
  </div>
</template>

注: <Select></Select>/<CheckboxGroup></CheckboxGroup>都是iview的组件,详情请看iview官网,同理elementUi也有相同的组件

iview官网

elementUi官网

data() {
    return {
      waiting: false, // loading
      province: '', // 当前的省
      provinceList: [], // 省列表
      Municipality: [{id: 2, name: '北京'}, {id: 3, name: '天津'}, {id: 10, name: '上海'}, {id: 23, name: '重庆'}, {id: 2, name: '北京'}], // 直辖市
      cityList: [], // 城市列表
      activityTime: [], // 活动时间
      checkCity: [], // 当前省所选的市列表 -- 展示
      allCheckCityApi: [], // 所有的市列表 -- 接口
      allCheckCitySave: { // 存储所有选择各省对应的市列表 -- 存储
      // '10001': [{code:'10111', name:'北京'}]
      },
      allCheckCityShowList: [ // 存储所有选择的市列表 -- 展示
      // { province: '10001', cityList: ['上海', 2, 3]}
      ]
    }
  },

函数:

// 获取省级数据
  getOrigin() {
    this.axios.get(`/users/open/region/topRegions`).then(res => {
     if (res.status === 200) {
      this.provinceList = res.data
     }
    })
  }
  // 返回省名称
  provinceFilter(id) {
    return this.provinceList.filter(item => item.id === id)[0].regionName
  }
   // 选择全部地区
  chooseAllRegion() {
    this.province = 0
    this.cityList = []
    this.checkCity = []
    this.allCheckCityApi = []
    this.allCheckCitySave = []
    this.allCheckCityShowList = []
  }
  // 保存城市后存储数据 -- 接口
  handleSaveCityList() {
    let _arr = []
    for (var key in this.allCheckCitySave) {
      _arr = _arr.concat(this.allCheckCitySave[key])
    }
    this.allCheckCityApi = _arr
  }
// 更改省
  changeProvince(parentId) {
    if (!parentId) {
      return
    }
    this.cityList = []
     //获取该省下的市列表
    this.axios.get(`/users/open/region/${parentId}/subRegions`).then(res => {
     if (res.status === 200) {
      this.cityList = res.data
     }
    })
    // 处理已经选择的市
    let _checkCity = this.allCheckCitySave[parentId] || [] 
    let _checkCityList = []
    _checkCity.forEach(el => {
      _checkCityList.push(el.regionCode)
    })
    this.checkCity = JSON.parse(JSON.stringify(_checkCityList))
  }
  // 保存所选的当前市
  saveCheckCity() {
  // 处理选择不同省,保存当前省已选择的投放城市
    if (!this.checkCity.length) {
      return
    }
    this.waiting = true
    // 当前城市的省code
    let _province = JSON.parse(JSON.stringify(this.province))
    // 当前城市的省名称
    let _provinceName = this.Municipality.filter(el => el.id === _province)[0] && this.Municipality.filter(el => el.id === _province)[0].name || ''
    // 已选择城市(code name level)列表
    let _arrCheckMsgList = []
    // 当前选择的城市code
    let _arrCheck = JSON.parse(JSON.stringify(this.checkCity))
    _arrCheck.forEach(el => {
      let _obj = this.cityList.filter(_el => _el.regionCode === el)[0]
      // 区别市辖区
      let _regionName = _provinceName + _obj.regionName
      let _regionLevel = _obj.regionLevel
      let obj = {regionCode: el, regionName: _regionName, regionLevel: _regionLevel, parentId: _province}
      // let obj = {regionCode: el, regionName: _regionName, regionLevel: _regionLevel}
      _arrCheckMsgList.push(obj)
    })
    // 存储到当前省对应的已选择的市列表 -- 存储
    this.$set(this.allCheckCitySave, _province, _arrCheckMsgList)
    // 保存城市后存储数据 -- 接口
    this.handleSaveCityList()
    // 处理已选择的投放地区数据展示
    let _arrCheckMsg = []
    // 处理展示列表-城市名称 -- 直辖市(北京,上海等)选地区时要加上直辖市前缀,如 北京市辖区/北京县
    this.cityList.map(obj => {
      if (_arrCheck.indexOf(obj.regionCode) > -1) {
      _arrCheckMsg.push(_provinceName + obj.regionName)
      }
    })
    let _msgObj = {
      province: _province,
      cityList: _arrCheckMsg
      }
    let _len = this.allCheckCityShowList.filter(item => item.province === _province).length || 0
    // 新增 / 替换
    if (!_len) {
      this.allCheckCityShowList.push(_msgObj)
      this.waiting = false
    } else {
      this.allCheckCityShowList.forEach((item, idx) => {
      if (item.province === _province) {
        this.$set(this.allCheckCityShowList, idx, _msgObj)
        this.waiting = false
        return
      }
      })
    }
  }

已上,具体的解释都在注释里面,有疑问的地方欢迎留言~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript窗口功能指南之在窗口中书写内容
Jul 21 Javascript
jquery 获取json数据实现代码
Apr 27 Javascript
jQuery 判断页面元素是否存在的代码
Aug 14 Javascript
jquery显示loading图片直到网页加载完成的方法
Jun 25 Javascript
JavaScript实现横向滑出的多级菜单效果
Oct 09 Javascript
理解javascript异步编程
Jan 27 Javascript
js基于cookie记录来宾姓名的方法
Jul 19 Javascript
js控住DOM实现发布微博效果
Aug 30 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
Sep 19 Javascript
js倒计时小实例(多次定时)
Dec 08 Javascript
vue项目每30秒刷新1次接口的实现方法
Dec 04 Javascript
Webpack的Loader和Plugin的区别
Nov 09 Javascript
node中使用es6/7/8(支持性与性能)
Mar 28 #Javascript
微信小程序开发实现的IP地址查询功能示例
Mar 28 #Javascript
微信小程序结合mock.js实现后台模拟及调试
Mar 28 #Javascript
详解webpack4.x之搭建前端开发环境
Mar 28 #Javascript
详解Vue.directive 自定义指令
Mar 27 #Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
Mar 27 #Javascript
js取0-9随机取4个数不重复的数字代码实例
Mar 27 #Javascript
You might like
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
Angular.js中数组操作的方法教程
2017/07/31 Javascript
vue.js 中使用(...)运算符报错的解决方法
2018/08/09 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
python实现排序算法
2014/02/14 Python
jupyter安装小结
2016/03/13 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
python写入文件自动换行问题的方法
2019/07/05 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
用python写测试数据文件过程解析
2019/09/25 Python
使用python+whoosh实现全文检索
2019/12/09 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
抽象方法、抽象类怎样声明
2014/10/25 面试题
会计电算化专业应届大学生求职信
2013/10/22 职场文书
学院书画协会部门职责
2013/11/28 职场文书
管理标语大全
2014/06/24 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
2015大学迎新晚会主持词
2015/07/16 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书