在工作中遇到省市县三级联动的需求,传统的pc端大部分是用3个HTML
vue.js官网:https://cn.vuejs.org/
mint-ui官网:http://mint-ui.github.io/#!/zh-cn
vue-cli是vue提供的官方命令行工具,用于快速搭建大型单页应用。
npm install vue-cli -g
vue init webpack demo
cd demo
npm run dev
hello
import ThreeLevelAddress from '@/components/ThreeLevelAddress'
export default new Router({
routes: [
{
path:'/ThreeLevelAddress',
name:'ThreeLevelAddress',
component:ThreeLevelAddress
}
]
})
npm i mint-ui -S
import MintUI from 'mint-ui'
import 'mint-ui/lib/style.css'
Vue.use(MintUI)
default
primary
danger
效果图:
import { Popup } from 'mint-ui';
Vue.component(Popup.name, Popup);
Popup的API
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
position | popup 的位置。省略则居中显示 |
String | 'top' 'right' 'bottom' 'left' |
|
pop-transition | 显示/隐藏时的动效,仅在省略 position 时可配置 |
String | 'popup-fade' | |
modal | 是否创建一个 modal 层 | Boolean | true | |
closeOnClickModal | 是否可以通过点击 modal 层来关闭 popup |
Boolean | true |
API中比较常用的是position,可配置弹出框的位置,四种效果都不太一样,可自行体验官网的demo。这里我使用的是位置为bottom的Popup组件,其他均使用默认配置。
import { Picker } from 'mint-ui';
Vue.component(Picker.name, Picker);
picker组件比如Popup组件复杂许多。已官方给出的demo为例,:slots绑定的组件的插槽,传入的是一个对象数组,用于配置picker组件的内容。@change绑定的是picker被选中的值发生变化时的change事件,在这里可以做你想做事情,比如给组件的插槽赋值,获取插槽的值,或者处理其他业务逻辑。
我在本例中传入的插槽对象数组如下:
myAddressSlots: [
{
flex: 1,
values: this.getProvinceArr(), //省份数组
className: 'slot1',
textAlign: 'center'
},
{
divider: true,
content: '',
className: 'slot2'
},
{
flex: 1,
values: this.getCityArr("北京市"),
className: 'slot3',
textAlign: 'center'
},
{
divider: true,
content: '',
className: 'slot4'
},
{
flex: 1,
values: this.getCountyArr("北京市","北京市"),
className: 'slot5',
textAlign: 'center'
}
]
slots对象数组键值对解释:
key | 描述 |
---|---|
divider | 分隔符 |
content | 显示的文本 |
values | slot 的备选值数组。若为对象数组,则需设置 value-key 属性来指定显示的字段名 |
defaultIndex | picker初始选中值,需传入其在 values 数组中的序号,默认为 0 |
textAlign | 文本对齐方式 |
flex | slot CSS 的 flex 值 |
className | slot 的类名,可以自定义你的样式 |
比较重要的是values,必须传入数组。因为本例中需要输出地址代码,所以这里必须传入对象数组,形如:
[
{
"code": "110000",
"name": "北京市",
"children": [
{
"code": "110100",
"name": "北京市",
"children": [
{
"code": "110101",
"name": "东城区"
},
{
"code": "110102",
"name": "西城区"
},
{
"code": "110105",
"name": "朝阳区"
},
{
"code": "110106",
"name": "丰台区"
},
{
"code": "110107",
"name": "石景山区"
},
{
"code": "110108",
"name": "海淀区"
},
{
"code": "110109",
"name": "门头沟区"
},
{
"code": "110111",
"name": "房山区"
},
{
"code": "110112",
"name": "通州区"
},
{
"code": "110113",
"name": "顺义区"
},
{
"code": "110114",
"name": "昌平区"
},
{
"code": "110115",
"name": "大兴区"
},
{
"code": "110116",
"name": "怀柔区"
},
{
"code": "110117",
"name": "平谷区"
},
{
"code": "110128",
"name": "密云县"
},
{
"code": "110129",
"name": "延庆县"
}
]
}
]
}
]
并在picker组件里设置value-key属性,这样picker就只会显示json对象中name属性。
value-key="name"
这里再学习一下picker组件的API
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
:slots | 插槽数组 | Array | [] | |
valueKey | 当 slots插槽的values 为对象数组时,作为文本显示 在 Picker 中的对应字段的字段名 |
String | ||
:showToolbar | 是否在组件顶部显示一个 toolbar,内容自定义 | Boolean | false | |
:visibleItemCount | picker组件中可显示的slot个数 | Number | 5 | |
:itemHeight | 每个 slot 的高度 | Number | 36 |
change事件中还给我们暴露了许多有用的方法:
在本例中,我们可以打印上述函数的输出结果:
console.log(picker.getSlotValue(0));//获取被选中的省,单个slot
console.table(picker.getSlotValues(0));//获取被选中的省份备选数组
console.table(picker.getValues());//获取被选中的省市县,全部slot,分隔符除外
setSlot相关方法就不再一一举例,你可以在本地控制台自行实验查看效果。
HTML代码:
三级地址:{{region}}
省:{{province}}
市:{{city}}
县:{{county}}
省级代码:{{provinceCode}}
市级代码:{{cityCode}}
县级代码:{{countyCode}}
JavaScript代码:
CSS样式:
threeLevelAddress.json部分结构
[
{
"code": "110000",
"name": "北京市",
"children": [
{
"code": "110100",
"name": "北京市",
"children": [
{
"code": "110101",
"name": "东城区"
},
{
"code": "110102",
"name": "西城区"
},
{
"code": "110105",
"name": "朝阳区"
},
{
"code": "110106",
"name": "丰台区"
},
{
"code": "110107",
"name": "石景山区"
},
{
"code": "110108",
"name": "海淀区"
},
{
"code": "110109",
"name": "门头沟区"
},
{
"code": "110111",
"name": "房山区"
},
{
"code": "110112",
"name": "通州区"
},
{
"code": "110113",
"name": "顺义区"
},
{
"code": "110114",
"name": "昌平区"
},
{
"code": "110115",
"name": "大兴区"
},
{
"code": "110116",
"name": "怀柔区"
},
{
"code": "110117",
"name": "平谷区"
},
{
"code": "110128",
"name": "密云县"
},
{
"code": "110129",
"name": "延庆县"
}
]
}
]
},
{
"code": "120000",
"name": "天津市",
"children": [
{
"code": "120100",
"name": "天津市",
"children": [
{
"code": "120101",
"name": "和平区"
},
{
"code": "120102",
"name": "河东区"
},
{
"code": "120103",
"name": "河西区"
},
{
"code": "120104",
"name": "南开区"
},
{
"code": "120105",
"name": "河北区"
},
{
"code": "120106",
"name": "红桥区"
},
{
"code": "120110",
"name": "东丽区"
},
{
"code": "120111",
"name": "西青区"
},
{
"code": "120112",
"name": "津南区"
},
{
"code": "120113",
"name": "北辰区"
},
{
"code": "120114",
"name": "武清区"
},
{
"code": "120115",
"name": "宝坻区"
},
{
"code": "120116",
"name": "滨海新区"
},
{
"code": "120121",
"name": "宁河县"
},
{
"code": "120123",
"name": "静海县"
},
{
"code": "120125",
"name": "蓟县"
}
]
}
]
}
]
中华人民共和国行政区划:省级(省份直辖市自治区)、 地级(城市)、 县级(区县)、 乡级(乡镇街道)、 村级(村委会居委会) ,中国省市区镇村三级四级五级联动地址数据可见GitHub: https://github.com/modood/Administrative-divisions-of-China
最后,上效果图:
如果你觉得这篇博客不错的话,记得收藏关注一波哦。我会不定时更新,分享自己学习的有趣的前端知识。
我的gitbook地址是https://legacy.gitbook.com/@lzweife,不定时更新学习笔记。
限于本人水平有限,难免出现纰漏错误,欢迎指正,相互学习。首次尝试写博客,语言不当不通顺之处,请先凑合看。
学海无涯,生命不息。
版权声明:本文为博主原创文章,转载请先征求博主同意并附上原文链接。 https://blog.csdn.net/lzw_1994/article/details/79981166