123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- <!--
- * 省市区选择器
- * @作者:陈万照
- * @公司:山东标梵互动信息技术有限公司
- * @官网:http://biaofun.com/
- * @微信:C207668802
- * @QQ:207668802
- * @邮箱:cwz@biaofun.com || 207668802@qq.com
- * @版本:v1.0.8
- -->
- <template>
- <view class="region">
- <picker mode="multiSelector" :range="range" range-key="name" @change="change" @columnchange="columnchange" :value="value" :disabled="disabled">
- <view class="content" :class="{ placeholder: !regionStr }">
- <text class="ellipsis-1">{{ regionStr ? regionStr : placeholder }}</text>
- </view>
- </picker>
- </view>
- </template>
- <script>
- const regionData = require('@/static/region.json');
- export default {
- /**
- * 数据
- */
- props: {
- // 是否禁用
- disabled: {
- type: Boolean,
- default: false
- },
- // placeholder
- placeholder: {
- type: String,
- default: '请选择省/市/区'
- },
- // 默认值
- defaultValue: {
- type: Array,
- default() {
- return null;
- }
- }
- },
- /**
- * 数据
- */
- data() {
- return {
- range: [[], [], []], // 省/市/区
- value: [0, 0, 0], // value 的值表示选择了 range 中的第几个(下标从 0 开始),默认为 [0, 0, 0],即 range 为 ['第一个省', '第一个省的第一个市', '第一个省的第一个市的第一个区']
- regionStr: '' // 选中的省市区字符串
- };
- },
- /**
- * 监听数据
- */
- watch: {
- // 默认值
- defaultValue() {
- // 设置/更新省市区数据
- this.defaultValue ? this.setDefaultValue() : this.setRange();
- }
- },
- /**
- * 组件初次加载完成
- */
- mounted() {
- // 设置/更新省市区数据
- this.defaultValue ? this.setDefaultValue() : this.setRange();
- },
- /**
- * 函数
- */
- methods: {
- /**
- * 设置/更新省市区数据
- */
- setRange() {
- // 省市区数据
- let range = [[], [], []];
- // 省
- regionData.forEach(el => {
- range[0].push({
- id: el.id,
- level: el.level,
- name: el.name,
- pid: el.pid
- });
- });
- // 市
- regionData[this.value[0]].children.forEach(el => {
- range[1].push({
- id: el.id,
- level: el.level,
- name: el.name,
- pid: el.pid
- });
- });
- // 区
- regionData[this.value[0]].children[this.value[1]].children.forEach(el => {
- range[2].push({
- id: el.id,
- level: el.level,
- name: el.name,
- pid: el.pid
- });
- });
- // 更新省市区数据
- this.range = range;
- },
- /**
- * 设置默认值
- */
- setDefaultValue() {
- // 查找省
- let provinceIndex = regionData.findIndex(el => {
- return el.name == this.defaultValue[0];
- });
- if(provinceIndex < 0) provinceIndex = 0;
- // 查找市
- let cityIndex = regionData[provinceIndex].children.findIndex(el => {
- return el.name == this.defaultValue[1];
- });
- if(cityIndex < 0) cityIndex = 0;
- // 查找区
- let areaIndex = regionData[provinceIndex].children[cityIndex].children.findIndex(el => {
- return el.name == this.defaultValue[2];
- });
- if(areaIndex < 0) areaIndex = 0;
- // 更新 value 的值
- this.value = [provinceIndex, cityIndex, areaIndex];
- // 设置/更新省市区数据
- this.setRange();
- // 更新选中的省市区字符串
- this.regionStr =
- regionData[provinceIndex].name + '·' + regionData[provinceIndex].children[cityIndex].name + '·' + regionData[provinceIndex].children[cityIndex].children[areaIndex].name;
- },
- /**
- * 某一列的值改变时触发
- * @param {Number} event.detail.column 表示改变了第几列(下标从0开始)
- * @param {Number} event.detail.value 表示变更值的下标
- */
- columnchange(event) {
- // 改变的是省
- if (event.detail.column == 0) {
- this.value = [event.detail.value, 0, 0];
- }
- // 改变的是市
- if (event.detail.column == 1) {
- this.value.splice(1, 1, event.detail.value);
- this.value.splice(2, 1, 0);
- }
- // 改变的是区
- if (event.detail.column == 2) {
- this.value.splice(2, 1, event.detail.value);
- }
- // 设置/更新省市区数据
- this.setRange();
- },
- /**
- * 确认选择
- */
- change(event) {
- // 更新选中的省市区字符串
- this.regionStr = this.range[0][this.value[0]].name + '·' + this.range[1][this.value[1]].name + '·' + this.range[2][this.value[2]].name;
- // 传递事件
- this.$emit('change', [this.range[0][this.value[0]], this.range[1][this.value[1]], this.range[2][this.value[2]]]);
- }
- }
- };
- </script>
- <style lang="scss" scoped>
- .ellipsis-1 {
- display: -webkit-box;
- -webkit-box-orient: vertical;
- -webkit-line-clamp: 1;
- overflow: hidden;
- }
- .content {
- text-align: right;
- }
- .placeholder {
- color: #949596;
- }
- </style>
|