关于省市区三级联动,我的第一种实现方式是利用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版权协议,转载请附上原文出处链接和本声明。