最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • vue造轮子之省份区联动下拉组件

    正文概述 掘金(迷途小羔羊)   2021-01-04   340

    业务背景

    在我业务需求中,需要有个省份区城市联动的组件,并且该组件的开发也是基于elementUi原有的效果上面去。在原有的elementui库中并没有这样的组件,所以也只能自己手写一个,效果如下: vue造轮子之省份区联动下拉组件 需求分析

    1.需要包含国内的省份,省份下面所对应的城市,城市下方所对应的区,街道不做要求。 2.需要配置每个下拉列表是否可以选择状态,这个是需要更加具体场景进行分析,需要对外提高可控制列表是否可以选择。例如:一层选择了广东省后,某些场景广州市不能够被选择到。

    基础组件选择

    基础组件还是还是采用el-select作为基础模板,进行二次开发,基本vue结构如下:

    <template>
      <div class="selectProvinceWrapper" :style="{width:width+'px'}">
        <el-select
          v-model="province"
          :size="size"
          placeholder="请选择省份"
          clearable
          @change="getCities"
          :disabled="provinceDisabled"
          filterable
        >
          <el-option
            v-for="item in provinceOptions"
            :key="item.value"
            :value="item.value"
            :label="item.label"
            :disabled="item.disabled"
          >
          </el-option>
        </el-select>
    
        <el-select
          v-model="city"
          :size="size"
          placeholder="请选择城市"
          clearable
          @change="getArea"
          :disabled="cityDisabled"
          filterable
        >
          <el-option
            v-for="item in cityOptions"
            :key="item.value"
            :value="item.value"
            :label="item.label"
            :disabled="item.disabled"
          >
          </el-option>
        </el-select>
    
        <el-select
          v-model="area"
          :size="size"
          placeholder="请选择地区"
          clearable
          :disabled="areaDisable"
          @change="areaChange"
          filterable
        >
          <el-option
            v-for="item in areaOptions"
            :key="item.value"
            :value="item.value"
            :label="item.label"
            :disabled="item.disabled"
          >
          </el-option>
        </el-select>
      </div>
    </template>
    

    对于每个省份,城市和地区,我们都有一份json数据来进行维护,具体数据地址可参考数据地址

    确定对外接受参数和对外暴露事件

    props: {
        width: { // 外围容器的宽度
          type: [String, Number],
          default: "100%"
        },
        size: { // select的大小
          type: String,
          default: "small"
        },
        defaultProvince: { // 默认的省份
          type: [String, Number],
          default: ""
        },
        defaultCity: { // 默认的城市
          type: [String, Number],
          default: ""
        },
        defaultArea: { // 默认的地区
          type: [String, Number],
          default: ""
        },
        provinceDisabled: { // 省份是否可以编辑
          type: Boolean,
          default: false
        },
        disableProvinceOptions: { // 省份的options项目是否可以编辑
          type: Array,
          default: () => []
        },
        cityDisabled: { // 城市是否可以编辑
          type: Boolean,
          default: false
        },
        disableCityOptions: {
          type: Array,
          default: () => []
        },
        areaDisable: { // 地区是否可以编辑
          type: Boolean,
          default: false
        },
        disableAreaOptions: { // 地区是否可以编辑
          type: Array,
          default: () => []
        },
      },
    

    业务代码编写

    由于我们省份,城市和地区的参数都是为一些特殊的数字,在编写业务的过程中,我们往往会忘记某个城市所对应的编号,所以我们有可能需要通过中文来进行逻辑判断。

    // 判断是否是中文
        isChineseChar(str) {
          var reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/;
          return reg.test(str);
        },
        // 获取省市区的默认数组
        getDefaultValue(targetOptions = [], value = "") {
          let targetStr = "";
          if (targetOptions.length === 0 || value.length === 0) {
            return targetStr;
          }
          if (value.length > 0) {
            if (this.isChineseChar(value)) { // 如果是中文的情况
              let targetObj = targetOptions.find(v => v.label === value) || {};
              targetStr = targetObj.value;
            } else {
              targetStr = value;
            }
          }
          return targetStr;
        },
    

    另外每次下拉框值的改变,我们都需要对外暴露出当前的label和value以供给业务使用,

    // 获取key-value
        getMapKeyValue(options, code) {
          return {
            label: this.getOptionsLabel(options, code),
            value: code
          };
        },
    

    参数说明:

    参数类型
    defaultProvince【String,number】默认省份为空defaultCity【String,number】默认城市为空defaultArea【String,number】默认地区为空disableProvinceOptions【Array】默认省份下拉项目不可编辑disableCityOptions【Array】默认城市下拉项目不可编辑disableAreaOptions【Array】默认地区下拉项目不可编辑size【String】默认下拉框大小为 smallprovinceDisabled【Boolean】默认省份下拉框是否可以编辑cityDisabled【String】默认城市下拉框是否可以编辑areaDisable【String】默认地区下拉框是否可以编辑

    事件说明

    事件说明
    province省份选择的回调 val={value:"",label:""}city城市选择的回调 val={value:"",label:""}area地区选择的回调 val={value:"",label:""}

    方法说明

    方法说明
    getSelectData获取当前下拉选择的数据setOptionsDisabled设置下拉项目是否可选 参数1:type:"city area province".参数2:Array:[] 不可选择的项的code或者中文

    地址 完整源码地址在组件地址


    起源地下载网 » vue造轮子之省份区联动下拉组件

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元