Vue省市区三级联选择器V-Distpicker的使用

Posted wenqiangit

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue省市区三级联选择器V-Distpicker的使用相关的知识,希望对你有一定的参考价值。

Vue省市区三级联选择器V-Distpicker的使用

最近用的Vue+Element UI时,有些地方需要用到省市区三联选择器,网上安装并尝试了多种类似的插件,但都因为无法正常实现或是没有眼缘而弃用了。最后选择的是V-Distpicker这种,配置和使用起来还算是比较简单的,下面就分享一下其用法和需要注意的点(需要踩过的坑)。

1.使用方法

安装和文档,请查看官网https://distpicker.pigjian.com/

? 或者 同性交友网站https://github.com/jcc/v-distpicker

有些小伙伴要说了,不是说好了分享使用方法吗?扔出两个链接就完事啦?嗯...其实呢,我是觉得这个作者文档写的很不错了各种用法介绍的很到位,而且在官网你还能尝试具体操作的嘛(其实就是懒)。

2.需要注意的点

? 如果是自己玩的话,作者提供的方法就够了,我用的是三级关联不带初始值的这种

官网的code :

<template>
  <v-distpicker @selected="onSelected"></v-distpicker>
<template>

<script>
import VDistpicker from 'v-distpicker'

export default {
  components: { VDistpicker },
  methods: {
    onSelected(data) {
      alert(data.province + ' | ' + data.city + ' | ' + data.area)
      console.log(data)
    },
  }
}
</script>

? 这个插件的用法简单,重点就是注意province、city、area值的绑定,这里我用的官方给的selected方法,选择最后一项后触发,talk is cheap,show code !

<v-distpicker v-show="isShowProvince" :class="{'disabled-select': dialogStatus=='update'}" :province="temp.addressprovince" :city="temp.addresscity" :area="temp.address__dist" @selected="onSelected"></v-distpicker>

<script>
import VDistpicker from 'v-distpicker'

export default {
  components: { VDistpicker },
 data() {
    return {
      temp: {
        addressprovince: '',
        addresscity: '',
        addressdist: '',
      },
    }
  },
  methods: {
    onSelected(data) {
      this.temp.addressprovince = data.province.value
      this.temp.addresscity = data.city.value
      this.temp.addressdist = data.area.value
    }
}

之后根据每个项目网络接口不同,把值传给后端就行啦。

然而在用Element UI进行表单验证(是否为必填项)的时候,踩了一个坑。Element  UI 验证的时候,是依次验证每一项有没有选择框没填,然而V-Distpicker这东西一个插件里面有三个选择框即需要绑定三个值,这时我灵感一来使用的方法是Element  UI表单验证只验证area的值,因为只有你province与city都选择了,才有可能area也选择了,尝试了一下,大功告成!

通过样式穿透的方法,可以更改其子组件的样式:
.disabled-select >>> select {
  background-color: #f5f7fa;
  border-color: #e4e7ed;
  color: #c0c4cc;
  cursor: not-allowed;
}

注意使用样式穿透时上面那个disabled-select位置的class一定是自己定义的class不能,且不论你是需要穿透的class的父级元素还是祖父级,只要能包含它就可以。 另外style里不能添加lang="scss"。? 不确定

3. 如何有选择性的选递给后端值呢?

按照官网给出的例子选择器选好之后是这样的一种结构

{
  "province": {
    "code": "210000",
    "value": "辽宁省"
  },
  "city": {
    "code": "210400",
    "value": "抚顺市"
  },
  "area": {
    "code": "210411",
    "value": "顺城区"
  }
}

如果我的后台只需要code或者value该如何做? 其实官网最下方已经给出了方法:

Methods

方法 说明 参数
province 选择省份 返回省份的值
city 选择城市 返回城市的值
city 选择地区 返回地区的值
selected 选择最后一项时触发 返回省市区的值

利用上面的方法可以实现只取code还是value 还是其他操作。。

下面是具体案例代码:

<template>
 <div class="addr">
    <v-distpicker
    :province="newInfo.province"
    :city="newInfo.city"
    :area="newInfo.district"
    @province="getProvince"
    @city="getCity"
    @area="getArea"
    ></v-distpicker>
  </div>
</template>
<script>
import VDistpicker from "v-distpicker";
import { getAddress, addAddress, updateAddress, delAddress } from "@/api/api";
export default {
  data() {
    return {
      updateIndex: "",
      newInfoEmpty: {
        province: "", //省
        city: "", // 市
        area: "", // 区
        receiveName: "", // 收件人姓名
        addr: "" // 详细地址
      },
      newInfo: {
        province: "", //省
        city: "", // 市
        area: "", // 区
        receiveName: "", // 收件人姓名
        addr: "", // 详细地址
        phone: ""
      },
      receiveInfoArr: [
        // {
        //     id: '',
        //     province: '', //省
        //     city: '', // 市
        //     area: '', // 区
        //     receiveName: '', // 收件人姓名
        //     addr: '', // 详细地址
        // }
      ]
    };
  },
  props: {},
  components: {
    VDistpicker
  },
  created() {
    this.getReceiveInfo();
  },
  watch: {},
  computed: {},
  methods: {
    bubble(index) {
      this.currentIndex = index;
    },
    updateProvince(data) {
      this.receiveInfoArr[this.currentIndex].province = data.value;
    },
    updateCity(data) {
      this.receiveInfoArr[this.currentIndex].city = data.value;
    },
    updateArea(data) {
      this.receiveInfoArr[this.currentIndex].district = data.value;
    },

    getProvince(data) {
      this.newInfo.province = data.value;
    },
    getCity(data) {
      this.newInfo.city = data.value;
    },
    getArea(data) {
      this.newInfo.district = data.value;
    },
    getReceiveInfo() {
      //获取收件人信息
      getAddress()
        .then(response => {
          console.log(response);
          this.receiveInfoArr = response;
        })
        .catch(function(error) {
          console.log(error);
        });
    },

    addReceive() {
      //提交收获信息
      addAddress(this.newInfo)
        .then(response => {
          alert("添加成功");
          // 重置新的
          this.getReceiveInfo();
          this.newInfo = Object.assign({}, this.newInfoEmpty);
        })
        .catch(function(error) {
          console.log(error);
        });
    },
    confirmUpdate(id, index) {
      // 更新收获信息
      updateAddress(id, this.receiveInfoArr[index])
        .then(response => {
          alert("修改成功");
          this.getReceiveInfo();
        })
        .catch(function(error) {
          console.log(error);
        });
    },
    deleteInfo(id, index) {
      // 删除收获人信息
      delAddress(id)
        .then(response => {
          alert("删除成功");
          this.getReceiveInfo();
        })
        .catch(function(error) {
          console.log(error);
        });
    }
  }
};
</script>

以上是关于Vue省市区三级联选择器V-Distpicker的使用的主要内容,如果未能解决你的问题,请参考以下文章

Element UI 中国省市区级联选择器

vue利用级联选择器实现全国省市区乡村五级菜单联动

Vue+ElementUI Cascader级联选择器 省市区编辑回显(通过CodeToText,TextToCode辅助)

element Cascader 级联选择器动态加载实例

VUE-地区选择器(V-Distpicker)

使用elementUI制作三级级联城市选择器