vue2 element-ui el-cascader实现城市三级联动 (封装组件, 方便复用)

用element自带的cascader 封装为组件 方便服用
↓↓↓ 看代码 ↓↓↓
第一步 创建一个vue文件 area.vue
城市数据需要自己获取 结尾有我自用的数据

<template>
	
  <el-cascader
    @change="ctry_change"
    v-model="ctry"
    :options="area_data"
    :style="`width:${width}`"
  />
</template>
<script>
import { area } from "@/utils/area";
export default {
  props: { address: String, width: { type: String, default: "100%" } },
  data() {
    return {
      ctry: [], //联机选择器 v-model 绑定的值
      ctry_value: [], //城市中转数据
      ctry_val: 0, //城市绑定值遍历的下标
      area_data: area, //城市数据
    };
  },

  watch: {
    address: {
      handler(newVal, oldVal) {
        let ctry = newVal.split("|");
        if (!ctry.length) return;
        this.ctry_value = []; //中间值重置数据
        this.ctry_center(ctry, "label");
        this.ctry = this.ctry_value;
        this.ctry_value = [];
        this.$emit("detail_", [ctry[ctry.length - 1], ctry.splice(0, 3)]);
      },
    },
  },
  methods: {
    //联机选择器切换时的回调函数
    ctry_change() {
      this.ctry_value = [];
      this.ctry_center(this.ctry, "value");
      // 发给父元素 选择的城市信息
      this.$emit("ctry_name", this.ctry_value);
      this.ctry_value = [];
    },

    //复用代码    ctry 城市信息   type 复用代码 有 "value"||"label" 可用
    ctry_center(ctry, type) {
      for (let i = this.area_data.length; i--; ) {
        this.get_ctry_name(ctry, this.area_data[i], type);
      }
      this.ctry_val = 0;
    },
    //获取城市信息  value || label  并赋值给中转变量
    get_ctry_name(val, item, type) {
      if (val[this.ctry_val] === item[type]) {
        this.ctry_value.push(item[type === "value" ? "label" : "value"]);
        if (item["children"]) {
          this.ctry_val++;
          for (let i = item.children.length; i--; ) {
            this.get_ctry_name(val, item.children[i], type);
          }
        }
      }
    },
  },
};
</script>
<style lang="scss"></style>

<template>
			//组件中使用
			<el-area
            :address="FormData.Address"
            @ctry_name="ctry_name"
            @detail_="detail__a"
          />
</template>
<script>
import elArea from "@/components/area";
export default {
components:{
	elArea
},
data(){
	return {
		//...
},
methids:{
	 detail__a(val) {
      this.detailAddress = val[0];
      this.city_info = val[1];
    },
    ctry_name(val) {
      this.city_info = val;
    },
}
}
</scripe>

按自己项目情况进行修改

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值