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 相关文章推荐
XHTML-Strict 内允许出现的标签
Dec 11 Javascript
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
Apr 12 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
Jul 31 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
Dec 10 Javascript
详细分析JavaScript变量类型
Jul 08 Javascript
javascript基础知识
Jun 07 Javascript
bootstrap datepicker插件默认英文修改为中文
Jul 28 Javascript
jquery 键盘事件的使用方法详解
Sep 13 jQuery
JavaScript实现精美个性导航栏筋斗云效果
Oct 29 Javascript
vue车牌号校验和银行校验实战
Jan 23 Javascript
微信小程序实现多选框功能的实例代码
Jun 24 Javascript
TS 类型兼容教程示例详解
Sep 23 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
PHP 数组遍历顺序理解
2009/09/09 PHP
劣质的PHP代码简化
2010/02/08 PHP
thinkphp的静态缓存用法分析
2014/11/29 PHP
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
JS日历 推荐
2006/12/03 Javascript
flash javascript之间的通讯方法小结
2008/12/20 Javascript
dojo学习第一天 Tab选项卡 实现
2011/08/28 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
javascript中Object使用详解
2015/01/26 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
vue.js表格组件开发的实例详解
2016/10/12 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
python写入已存在的excel数据实例
2018/05/03 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
2019/09/25 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
python元组拆包实现方法
2021/02/28 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
《蚕姑娘》教学反思
2014/04/15 职场文书
团委副书记工作总结
2015/08/14 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
表扬信范文
2019/04/22 职场文书