elementui省市区三级联动_vue 省市区三级联动

2024-10-21 0 144

elementui省市区三级联动_vue 省市区三级联动

在现代Web开发中,省市区三级联动是一个常见的需求,特别是在表单填写和地址选择等场景中。ElementUI 是一个基于 Vue 2.0 的桌面端组件库,提供了丰富的组件来简化开发过程。本文将介绍如何使用 ElementUI 实现省市区三级联动,并提供多种实现思路。

解决方案概述

实现省市区三级联动的核心在于数据的传递和组件的联动。我们需要准备省市区的数据,并通过事件和属性绑定来实现联动效果。ElementUI 提供了 el-cascader 组件,可以方便地实现这一功能。此外,我们还可以通过自定义组件来实现更灵活的联动效果。

使用 el-cascader 组件实现三级联动

准备数据

首先,我们需要准备省市区的数据。这些数据可以从后端接口获取,也可以直接在前端定义。为了简化示例,我们在这里直接定义数据:

javascript
// 省市区数据
const regionData = [
{
value: 'zhejiang',
label: '浙江省',
children: [
{
value: 'hangzhou',
label: '杭州市',
children: [
{
value: 'xihu',
label: '西湖区'
},
{
value: 'xiacheng',
label: '下城区'
}
]
},
{
value: 'ningbo',
label: '宁波市',
children: [
{
value: 'yinzhou',
label: '鄞州区'
},
{
value: 'beilun',
label: '北仑区'
}
]
}
]
},
{
value: 'jiangsu',
label: '江苏省',
children: [
{
value: 'nanjing',
label: '南京市',
children: [
{
value: 'jianye',
label: '建邺区'
},
{
value: 'gulou',
label: '鼓楼区'
}
]
},
{
value: 'suzhou',
label: '苏州市',
children: [
{
value: 'wuzhong',
label: '吴中区'
},
{
value: 'xiangcheng',
label: '相城区'
}
]
}
]
}
];

使用 el-cascader 组件

接下来,我们在 Vue 组件中使用 el-cascader 组件来实现三级联动:

html

  <div>
    <el-cascader
      :options="regionData"
      v-model="selectedRegion"
      @change="handleChange"
      placeholder="请选择省市区"</p>

<blockquote>
  <p>
    </div>
  </p>
</blockquote>


export default {
  data() {
    return {
      regionData: [
        // 省市区数据
        {
          value: 'zhejiang',
          label: '浙江省',
          children: [
            {
              value: 'hangzhou',
              label: '杭州市',
              children: [
                {
                  value: 'xihu',
                  label: '西湖区'
                },
                {
                  value: 'xiacheng',
                  label: '下城区'
                }
              ]
            },
            {
              value: 'ningbo',
              label: '宁波市',
              children: [
                {
                  value: 'yinzhou',
                  label: '鄞州区'
                },
                {
                  value: 'beilun',
                  label: '北仑区'
                }
              ]
            }
          ]
        },
        {
          value: 'jiangsu',
          label: '江苏省',
          children: [
            {
              value: 'nanjing',
              label: '南京市',
              children: [
                {
                  value: 'jianye',
                  label: '建邺区'
                },
                {
                  value: 'gulou',
                  label: '鼓楼区'
                }
              ]
            },
            {
              value: 'suzhou',
              label: '苏州市',
              children: [
                {
                  value: 'wuzhong',
                  label: '吴中区'
                },
                {
                  value: 'xiangcheng',
                  label: '相城区'
                }
              ]
            }
          ]
        }
      ],
      selectedRegion: []
    };
  },
  methods: {
    handleChange(value) {
      console.log('Selected region:', value);
    }
  }
};



/* 自定义样式 */


<p>

自定义组件实现三级联动

除了使用 el-cascader 组件,我们还可以通过自定义组件来实现更灵活的三级联动效果。

自定义组件结构

我们可以创建三个独立的组件分别表示省、市、区,然后通过事件和属性绑定来实现联动效果。

html
<!-- Province.vue -->

  
    <el-option
      v-for="province in provinces"
      :key="province.value"
      :label="province.label"
      :value="province.value"</p>

<blockquote>
  <p>
    
  </p>
</blockquote>


export default {
  props: {
    provinces: Array,
    selectedProvince: String
  },
  methods: {
    handleProvinceChange(province) {
      this.$emit('province-change', province);
    }
  }
};


<p>
html
<!-- City.vue -->

  
    <el-option
      v-for="city in cities"
      :key="city.value"
      :label="city.label"
      :value="city.value"</p>

<blockquote>
  <p>
    
  </p>
</blockquote>


export default {
  props: {
    cities: Array,
    selectedCity: String
  },
  methods: {
    handleCityChange(city) {
      this.$emit('city-change', city);
    }
  }
};


<p>
html
<!-- District.vue -->

  
    <el-option
      v-for="district in districts"
      :key="district.value"
      :label="district.label"
      :value="district.value"</p>

<blockquote>
  <p>
    
  </p>
</blockquote>


export default {
  props: {
    districts: Array,
    selectedDistrict: String
  }
};


<p>

主组件整合

在主组件中,我们将这三个自定义组件组合起来,并实现联动效果:

html

  <div>
    <province
      :provinces="provinces"
      :selected-province="selectedProvince"
      @province-change="handleProvinceChange"</p>

<blockquote>
  <p>
      <city
        :cities="cities"
        :selected-city="selectedCity"
        @city-change="handleCityChange"
  
      <district
        :districts="districts"
        :selected-district="selectedDistrict"
  
    </div>
  </p>
</blockquote>


import Province from './Province.vue';
import City from './City.vue';
import District from './District.vue';

export default {
  components: {
    Province,
    City,
    District
  },
  data() {
    return {
      regionData: [
        // 省市区数据
        {
          value: 'zhejiang',
          label: '浙江省',
          children: [
            {
              value: 'hangzhou',
              label: '杭州市',
              children: [
                {
                  value: 'xihu',
                  label: '西湖区'
                },
                {
                  value: 'xiacheng',
                  label: '下城区'
                }
              ]
            },
            {
              value: 'ningbo',
              label: '宁波市',
              children: [
                {
                  value: 'yinzhou',
                  label: '鄞州区'
                },
                {
                  value: 'beilun',
                  label: '北仑区'
                }
              ]
            }
          ]
        },
        {
          value: 'jiangsu',
          label: '江苏省',
          children: [
            {
              value: 'nanjing',
              label: '南京市',
              children: [
                {
                  value: 'jianye',
                  label: '建邺区'
                },
                {
                  value: 'gulou',
                  label: '鼓楼区'
                }
              ]
            },
            {
              value: 'suzhou',
              label: '苏州市',
              children: [
                {
                  value: 'wuzhong',
                  label: '吴中区'
                },
                {
                  value: 'xiangcheng',
                  label: '相城区'
                }
              ]
            }
          ]
        }
      ],
      selectedProvince: '',
      selectedCity: '',
      selectedDistrict: '',
      provinces: [],
      cities: [],
      districts: []
    };
  },
  methods: {
    handleProvinceChange(province) {
      this.selectedProvince = province;
      this.cities = this.regionData.find(p => p.value === province)?.children || [];
      this.selectedCity = '';
      this.districts = [];
      this.selectedDistrict = '';
    },
    handleCityChange(city) {
      this.selectedCity = city;
      const selectedProvince = this.regionData.find(p => p.value === this.selectedProvince);
      this.districts = selectedProvince?.children.find(c => c.value === city)?.children || [];
      this.selectedDistrict = '';
    }
  },
  created() {
    this.provinces = this.regionData;
  }
};



/* 自定义样式 */


<p>

通过以上两种方法,我们可以轻松实现省市区三级联动的效果。希望本文对你有所帮助!

Image

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关

源码下载