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>

原文地址:https://www.cnblogs.com/wenqiangit/p/10538826.html

时间: 2024-07-31 21:19:53

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

省市区三级联选select2.js

<div class="mui-input-row row_then" id='showCityPicker3'> <input id='cityResult3' readonly="readonly" class="widget_title input_change login_word color_content" placeholder="省市区" /> <input type="

vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、一级mockjs用法、路由懒加载三种方式

不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p>Element UI简单Cascader级联选择器使用</p> <el-cascader :options='options' v-model="selectedOptions" @change="handleChange"> </el-

vue+element级联选择器对接后台数据

1.后台接口返回的数据肯定要和级联选择器的数据一致,所以我专门弄个model存放返回的值,如下:/** * @Auther: GGDong * @Date: 2019/4/3 10:30 */@Getter@Setterpublic class ServerList{ //值 private String value; //名称 private String label; //子级 private List<ServerList> children;} 2.最主要的就是写sql了,不过幸好有M

由移动端级联选择器所引发的对于数据结构的思考

GitHub:https://github.com/nzbin/Framework7-CityPicker Demo:https://nzbin.github.io/Framework7-CityPicker/ 前言 最近在做移动端项目的时候遇到了省市区选择的功能.以往做项目时都是省市区分开的下拉框样式.这次希望实现效果图要求的级联选择器.我是 Framework7 框架的忠实粉丝,庆幸的是 Framework7 已经有模拟 iOS 选择框效果的 Picker 组件.在开发之前我先搜索了现有的一

element-ui el-cascader级联选择器设置指定层级不能选中

有时候用element-ui el-cascader级联选择器添加分类时会遇到最多添加几级的限定.看了文档,只要给需要禁止选择的选项添加disabled属性就可以.但是使用一层一层循环遍历数据感觉很麻烦,自己写了个遍历的方法,纪录下,方便以后使用 贴代码 cascader.vue <template> <el-dialog title="添加分类" :visible.sync="dialogVisible" width="500px&qu

element-ui Cascader 级联选择器示例

<html> <head>test</head> <style> @import url("http://unpkg.com/[email protected]/lib/theme-chalk/index.css"); </style> <body> <script src="http://unpkg.com/vue/dist/vue.js"></script> <

vue.js三种安装方式

Vue.js(读音 /vju?/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手,还便于与第三方库或既有项目整合. 下面介绍三种 Vue.js 的安装方法: 独立版本 我们可以在Vue.js的官网上直接下载vue.js,并在html中通过<script>标签中引用.<script src = ../vue.js> </script> 开发环境不要使用最

CSS中的三种选择器

第一种:标签名选择器 格式:标签名{                    属性一:属性值:                    属性二:属性值:                    ...               }      例子:第一步:div{ background-color:#00ff00; font-size:20px;                 } 第二步:<div> 第二种方式</div > 第二种:类名选择器 格式:.类名{ 属性名:属性值; 属性

【CSS】CSS的三种选择器

css概述 为了让网页元素的样式更加丰富,也为了让网页的内容和样式能拆分开,CSS由此思想而诞生,CSS是 Cascading Style Sheets 的首字母缩写,意思是层叠样式表.有了CSS,html中大部分表现样式的标签就废弃不用了,html只负责文档的结构和内容,表现形式完全交给CSS,html文档变得更加简洁. css基本语法 css的定义方法是: 选择器 { 属性:值: 属性:值: 属性:值:} 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性,每个属性有一个或多个