使用vue+mintui 開發省市區功能

作移動端的都知道 常常會有省市區這種三級聯動的功能 今天研究了一下午~vue

1.準備工做 vue+mintui+省市區的json數據git

下載地址:https://github.com/chzm/address_popup

下載好後須要3個json文件 進入dist找到這3個文件github

將這3個文件放入到vue項目裏 json

新建一個處理這3個json方法的文件ide

import provinces from '../../static/provinces.json'
import areas from '../../static/areas.json'
import cities from '../../static/cities.json'

export const zmGetProvinces = () => {
    return provinces;
}

export const zmGetcities = (provinceCode) => {
    if (!provinceCode) {
        provinceCode = '11'
    }
    let citiesArr = [];
    cities.forEach(function (item) {
        if (item.provinceCode == provinceCode) {
            console.log(item)
            citiesArr.push(item)
        }
    })
    return citiesArr
}

export const zmGetareas = (cityCode) => {
    // console.log(areas)
    if (!cityCode) {
        cityCode = '1101'
    }
    let areasArr = [];
    areas.forEach(function (item) {
        if (item.cityCode == cityCode) {
            areasArr.push(item)
        }
    })
    return areasArr
}

在這文件處理下數據依次導出flex

接着能夠將省市區作成一個組件方便後續使用 這裏我使用的是mintui裏的popup和picker這2個組件來搭配ui

<template>
  <div>
    <mt-popup class="pop" v-model="sexpopup" position="bottom">
      <mt-picker :slots="slots" valueKey="name" @change="onValuesChange"></mt-picker>
    </mt-popup>
  </div>
</template>

<script>
import { zmGetProvinces, zmGetcities, zmGetareas } from "@/utils/zmRegion.js";
export default {
  props: ["result"],
  data() {
    return {
      slots: [
        {
          flex: 1,
          values: zmGetProvinces(),
          className: "slot1",
          textAlign: "right"
        },
        {
          divider: true,
          content: "",
          className: "slot2"
        },
        {
          flex: 1,
          values: zmGetcities("11"),
          className: "slot1",
          textAlign: "conter"
        },
        {
          divider: true,
          content: "",
          className: "slot2"
        },
        {
          flex: 1,
          values: zmGetareas("1101"),
          className: "slot3",
          textAlign: "center"
        }
      ],
      region: "",
      regionInit: false,
      sexpopup: this.result
    };
  },
  watch: {
    result(val) {
      this.sexpopup = val;
    },
    sexpopup(val) {
      this.$emit("changepop", val);
    }
  },
  methods: {
    onValuesChange(picker, values) {
      if (this.regionInit) {
        if (values[0] && values[1] && values[2]) {
          this.region =
            values[0]["name"] + values[1]["name"] + values[2]["name"];
          console.log(this.region);

          //給市、縣賦值
          let area = "";
          if (values[0].name == "北京市") {
            area = "1101";
          } else if (values[0].name == "天津市") {
            area = "1201";
          } else {
            area = values[1]["code"];
          }
          picker.setSlotValues(1, zmGetcities(values[0]["code"]));
          picker.setSlotValues(2, zmGetareas(area));

          //   this.$emit("getRegion", this.region);
        } else {
          console.log("數據不全");
        }
      } else {
        this.regionInit = true;
      }
      console.log(this.regionInit);
    }
  },

  created() {}
};
</script>

<style scoped>
.pop {
  width: 100%;
}
</style>

這裏有個坑就是天津和北京市這2個地方滑動的時候數據不會從新刷新 在這裏作了個處理this

最後將組件導入須要用到的地方spa

這裏用到了props組件見的雙向綁定 自行百度~~3d

使用一個點擊事件改變sexpopup的狀態 

最後附上效果圖 大功告成 記錄下!~~~~~

相關文章
相關標籤/搜索