Vue项目中实现三级联动

关于省市区三级联动,我的第一种实现方式是利用select的change事件,加v-model ,

  • 当省份改变时(change事件),显示该省份下的市,同时根据下拉框中市的改变,显示对应的县区
  • 当市改变时change事件),显示对应的县区

以上分析,我们可以看到,省份的事件函数里边需要有市改变的事件函数,也就是说市的事件函数需要写两次

我的第二种方案,就是利用watch + v-model

当select绑定的数据发生改变时,能够被watch监听到,然后就可以开始我们的操作了,第一种方案写事件的本质,也是当数据改变时,对应的下一级数据能够随之改变

第二种方案的代码如下 html

select框中的数据利用v-model动态绑定data中的数据

<div id="app">
  <select-component></select-component>
</div>
<template id="selectArea">
    <label for="province">省
     <select name="province" id="province"
               v-model="pro" >
        <option value="请选择省份" disabled >请选择省份</option>
        <option
            v-for="(item,index) in arr"
            :key="index">
            {{item.province}}
         </option>
      </select>                   
    </label>                   
    <label for="city">市                       
       <select name="city" id="city"
             v-model="city" >
         <option value="请选择城市" disabled >请选择城市</option>
         <option
             v-for="(item,index) in city.citys"
             :key="index">
             {{item.name}}
          </option>
        </select>
     </label>
     <label for="area">区/县
        <select name="area" id="area"
              v-model="area">
          <option value="请选择区县" disabled >请选择区县</option>
          <option
               v-for="(item,index) in areas.area"
              :key="index">
              {{item}}
           </option>
         </select>                   
     </label>
</template>

 功能实现: watch监听省和市绑定的数据,当数据发生改变时,过滤下一级的数据

js代码如下:

<script>
    let SelectComponent = {
        template: '#selectArea',
        data() {
           return {
            pro: '请选择省份',
            city: '请选择城市',
            area: '请选择区县',
            city: '',
            areas: '',
            arr: [{
                province: '河南省',
                citys: [{
                    name: '郑州市',
                    area: ['金水区', '中原区', '二七区']
                }, {
                    name: '洛阳市',
                    area: ['涧西区', '洛龙区', '龙门']
                }]
            }, {
                province: '河北省',
                citys: [{
                    name: '石家庄',
                    area: ['长安区', '桥西区', '新华区']
                }, {
                    name: '张家口',
                    area: ['宣化区', '万全区', '尚义县']
                }]
            }],
           }
         },
    watch: {
          pro() {            
              this.city = this.arr.find(item => {
                  return this.pro === item.province
              })
              this.city = this.city.citys[0].name  // 默认选中数组中的第一个市
           },
          city() {
              this.areas = this.city.citys.find(item => {
                  return this.city === item.name
              })
              this.area = this.areas.area[0]  // 默认选中数组中的第一个区县
         }
      }
 
    }
    new Vue({
        el: '#app',
        components: {
            SelectComponent 
        }
    })
</script>

个人觉得,第二种方案比第一种更简单一些,毕竟少调用了一次函数,而且不需要触发事件,如果感兴趣,可以试一下方案一,逻辑代码基本一样


版权声明:本文为sdrfsef原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。