首页

专栏

javascript

文章详情

0

vue+vant移动端地区级联选择组件

quanta发布于 今天 08:25

写在开头:项目的框架是vue+vant,业务需求一个级联的地区选择,写完才发现vant本身也有这组件….后来看vant本身用的逻辑跟我不太一样,觉得还有点思考价值那就发上来当做实现记录吧~

总体思路(select与tabs独立):

列表选择(select)

1)获取当前tabs的长度 -> 设置当前active的name

2)通过levelCollect(最终选择的数据集)设置每个层级,例:[‘第一层数据’,’第二层数据’,’第三层数据’,…]

3)删除后级数据,更新tabs长度

4)如果有下级,新增active并选中,如果没有设置完成

tab选择(tabsClick)

1)拷贝一次原始数据,设置列表筛选数据:0级使用原始数据,其它选用存储数据设置高亮

2)滚动到选中

目前功能支持:

·自定义数据

·N级数据联动

·上级数据选择后修改

·选择项高亮

todo:

数据回填

效果图:

addressCard.vue

请选择所在地区

.

{{item.name}}

import { Tab,Tabs } from 'vant';

import areaJson from './areaJson/pcas-code.json'

export default {

components: {

[Tab.name]: Tab,

[Tabs.name]:Tabs

},

data(){

return{

active:1,

levelCollect:[],

originArea:areaJson,

areaJson,

tabsData:[{

name:'请选择'

}]

}

},

created(){

},

methods:{

select(item){

// 获取当前tabs的长度

let len = this.tabsData.length

// 设置当前active的name

this.tabsData[this.active].name = item.name

// 设置每个层级

this.levelCollect[this.active] = item

if(this.active

// 删除后部的城镇

this.tabsData.splice(this.active+1)

// 更新tabs长度

len = this.tabsData.length

}

// 如果有下级,新增active并选中

if(item.children){

this.tabsData.push({name:'请选择'})

// this.active = len

this.$refs.tabs.scrollTo(len)

this.areaJson = item.children

}else{

this.tabsClick(this.active,item.name)

}

},

tabsClick(name,title){

// 设置列表筛选数据:0级使用原始数据,其它选用存储数据设置高亮

if(name===0){

this.areaJson = this.originArea.slice().map(item=>{

return {

...item,

select:item.name===title

}

})

}else{

this.areaJson = this.levelCollect[name-1].children.map(item=>{

return {

...item,

select:item.name===title

}

})

}

// 滚动到选中

this.$nextTick(()=>{

let doc = document.querySelector('.select')

doc&&doc.scrollIntoView();

})

}

}

};

.addressWrapper {

padding:20px 10px;

h4{

text-align:center;

}

.tabs{

margin-top:20px;

/deep/.van-tabs__content{

display: none;

}

.content{

margin-top:20px;

height: 200px;

overflow: scroll;

.item{

line-height:40px;

font-size:14px;

&.select{

color:red;

}

}

}

}

}

附上本文中地区pcas-code.json数据:

https://github.com/modood/Administrative-divisions-of-China/blob/master/dist/pcas-code.json

javascriptvue.jscascadervant

阅读 88更新于 今天 08:32

赞收藏

分享

本作品系原创,采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议

quanta

no bug

11声望

2粉丝

关注作者

0 条评论

得票时间

提交评论

quanta

no bug

11声望

2粉丝

关注作者

宣传栏

目录

写在开头:项目的框架是vue+vant,业务需求一个级联的地区选择,写完才发现vant本身也有这组件….后来看vant本身用的逻辑跟我不太一样,觉得还有点思考价值那就发上来当做实现记录吧~

总体思路(select与tabs独立):

列表选择(select)

1)获取当前tabs的长度 -> 设置当前active的name

2)通过levelCollect(最终选择的数据集)设置每个层级,例:[‘第一层数据’,’第二层数据’,’第三层数据’,…]

3)删除后级数据,更新tabs长度

4)如果有下级,新增active并选中,如果没有设置完成

tab选择(tabsClick)

1)拷贝一次原始数据,设置列表筛选数据:0级使用原始数据,其它选用存储数据设置高亮

2)滚动到选中

目前功能支持:

·自定义数据

·N级数据联动

·上级数据选择后修改

·选择项高亮

todo:

数据回填

效果图:

addressCard.vue

请选择所在地区

.

{{item.name}}

import { Tab,Tabs } from 'vant';

import areaJson from './areaJson/pcas-code.json'

export default {

components: {

[Tab.name]: Tab,

[Tabs.name]:Tabs

},

data(){

return{

active:1,

levelCollect:[],

originArea:areaJson,

areaJson,

tabsData:[{

name:'请选择'

}]

}

},

created(){

},

methods:{

select(item){

// 获取当前tabs的长度

let len = this.tabsData.length

// 设置当前active的name

this.tabsData[this.active].name = item.name

// 设置每个层级

this.levelCollect[this.active] = item

if(this.active

// 删除后部的城镇

this.tabsData.splice(this.active+1)

// 更新tabs长度

len = this.tabsData.length

}

// 如果有下级,新增active并选中

if(item.children){

this.tabsData.push({name:'请选择'})

// this.active = len

this.$refs.tabs.scrollTo(len)

this.areaJson = item.children

}else{

this.tabsClick(this.active,item.name)

}

},

tabsClick(name,title){

// 设置列表筛选数据:0级使用原始数据,其它选用存储数据设置高亮

if(name===0){

this.areaJson = this.originArea.slice().map(item=>{

return {

...item,

select:item.name===title

}

})

}else{

this.areaJson = this.levelCollect[name-1].children.map(item=>{

return {

...item,

select:item.name===title

}

})

}

// 滚动到选中

this.$nextTick(()=>{

let doc = document.querySelector('.select')

doc&&doc.scrollIntoView();

})

}

}

};

.addressWrapper {

padding:20px 10px;

h4{

text-align:center;

}

.tabs{

margin-top:20px;

/deep/.van-tabs__content{

display: none;

}

.content{

margin-top:20px;

height: 200px;

overflow: scroll;

.item{

line-height:40px;

font-size:14px;

&.select{

color:red;

}

}

}

}

}

附上本文中地区pcas-code.json数据:

https://github.com/modood/Administrative-divisions-of-China/blob/master/dist/pcas-code.json

html5地区级联选择,【JS】vue+vant移动端地区级联选择组件相关推荐

  1. vue+vant 移动端国际区号组件封装

    1.组件 <template><div><van-nav-bar title="Select Country/Region" left-arrow @ ...

  2. Capacitor+Vue+Vant移动端打包总结

    Capacitor+Vue+Vant移动端打包总结 本笔记为打包Vue移动端Android Apk 打包步骤 Capacitor与Vue项目结合基本配置自行百度/谷歌,这里是已集成配置好的项目. 1. ...

  3. vue+vant 移动端H5 商城项目_03

    文章目录 一.·首页搜索功能 1. 搜索页面 2. 历史记录和热门搜索组件 3. 搜索框提示列表组件 4. 综合-价格-分类 5. 搜索出的产品展示 6. 异常修复 7. 路由拦截/路由守卫 二.详情 ...

  4. vue+vant 移动端H5 商城项目_04

    文章目录 一.专题页 1. 效果图 2. 专题api 2.Topic.vue 组件 3. 专题源码 二.分类页 2.1. 效果图 2.2. 分类api 2.3. Category.vue 组件 三.购 ...

  5. vue+vant 移动端H5 商城项目_02

    文章目录 一.路由规划 1. 新建路由配置 2. 下载vue-router 3. 路由注册 4. 路由基础配置 5. 路由挂载 6. AppTabBar 7. 二.移动端首页 2.1.首页效果 2.2 ...

  6. vue+vant 移动端H5 商城项目_01

    文章目录 一.·Rem 布局适配 1. 安装 amfe-flexible 2. px转化rem 3. 全局配置 4. 重置样式表 5. 引入重置样式表 二.组件安装和配置与封装 2.1. 安装less ...

  7. 最新vue+vant移动端电商项目

    今天为大家带来一个Vue+VantUi完成的一个一个移动端电商项目,供大家学习和参考. 源码已上传到码云上面https://gitee.com/jiuyueqi/vyx, 如果有需要源码或者接口文档的 ...

  8. VUE Vant移动端开发

    Vant 什么是Vant Vant是一个轻量,可靠的移动端组件库,2017开源 目前 Vant 官方提供了 Vue 2 版本.Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付 ...

  9. 计算机毕业设计node.js+vue+Web移动端外卖平台

    项目介绍 顾客可以浏览商品,加入购物车,下单支付,功能参考美团外卖饿了么的基础功能 商家这边能进行商品的添加,修改,删除,查找,商家入驻.资料修改,商家注销,根据营业情况调整商品详情,营业时间,配送时 ...

最新文章

  1. linux下安装hadoop
  2. 网络数据采集与python爬虫_高校邦网络数据采集与Python爬虫答案
  3. ubuntu终端显示乱码的解决
  4. 《MySQL管理之道:性能调优、高可用与监控》china-pub首发!
  5. c primer plus 第6版 中文版pdf_内功实力再精进 试驾上汽大通V80 PLUS城市版_搜狐汽车...
  6. android xml导进数据库,Android通过xml文件配置数据库
  7. Dell Chromebook11 刷Ubuntu
  8. leetcode 栈 二叉树的前向遍历
  9. 新手如何从零开始学习unity
  10. 基于PyQt5与opencv制作的证件照尺寸变换应用程序
  11. 计算机相关的外文参考文献,计算机英文参考文献
  12. python构造方法的方法名_构造方法是类的一个特殊方法,Python中它的名称为()。
  13. Java程序员拼多多3轮面试,这些面试题你能掌握多少?
  14. Warning [gazebo.cc:215] Waited 1seconds for namespaces.
  15. android 视频添加音乐,手机怎么给视频加音乐,安卓手机软件怎么给视频添加音乐比较方便...
  16. 超全万字汇总!科研论文绘图实操干货!11类Matplotlib图表,含代码
  17. 安装opencv 3.4.1记录
  18. 组件通信之sync-父子数据同步
  19. 软件测试的前景还是很广阔的,你怎么看?
  20. 光学动作捕捉系统使用教程:刚体贴点说明

热门文章

  1. 微信小程序:打开设置(权限)页面
  2. error#10052:could not checkout FLEXlm license
  3. [毕业设计]LaTeX论文模板排版
  4. python快速实现2048小游戏
  5. 正则表达式匹配连续多个空格或tab空格
  6. 西安交通大学计算机基础期末考试,《大学计算机基础试题与答案》-西安交通大学.doc...
  7. 火狐FEBE扩展正确使用方法
  8. 和平精英计算机音乐,和平精英音乐盒里的音乐叫什么名字 和平精英音乐盒攻略...
  9. slurm作业管理系统怎么用?
  10. dubbo教程总结(springboot+dubbo)