四级联动下拉菜单

转载:https://blog.csdn.net/jy02988278/article/details/78968997(自我收藏)

数据库导出地址数据联动显示下拉菜单

1.先说数据库结构,上图:

结构副id形式,sid是本条数据的id,fid是本条数据的上级数据的sid.

就是把这种级别关系建立在数据库里,之后用起来就简单了.

 

2.前端代码

html:

<!-- 联动 -->
		
		市级:<select name="sel1" id="sel1" ">
			<option name="op1" id="op1" value="01">北京</option>
		</select>
		区级:<select name="sel2" id="sel2" onchange="change1(this)">
			<option name="op2" id="op2"  >全部</option>
		</select>
		街道:<select name="sel3" id="sel3"  onchange="change1(this)">
			<option name="op3" id="op3" >全部</option>
		</select>
		社区:<select name="sel4" id="sel4" onchange="change1(this)">
			<option name="op4" id="op4"  >全部</option>
		</select>
<!-- 回显的隐藏域 -->
<input type="hidden" id="quji" value="${quji}">
<input type="hidden" id="jiedao" value="${jiedao }">
<input type="hidden" id="shequ" value="${shequ }">
<input type="hidden" id="jiedao1" value="${jiedao1 }">
<input type="hidden" id="shequ1" value="${shequ1 }">

 jquery:

第一个ajax请求:(因为是要从市级开始,所以fid固定为01就是北京,这个时启动加载)

$(function(){
        var quji=$("#quji").val();
        var jiedao=$("#jiedao").val();
        var shequ=$("#shequ").val();
        var jiedao1=$("#jiedao1").val();
        var shequ1=$("#shequ1").val();
         $.ajax({ 
            url:'${rootpath}/fenye/address',
            type:'post',
            data:{
                fid:'01'
            },
            success:function(data){
                var quji=$("#quji").val();
                var htmlStr="";
                $.each(data,function(index,obj){
                    if (obj.sId == quji) {
                        htmlStr += "<option selected value='"+obj.sid+"'>" + obj.name + "</option>";
                    } else {
                        htmlStr += "<option  value='"+obj.sid+"'>" + obj.name + "</option>";
                    }
                });
             $("#sel2").html(htmlStr);
                /* 回显 */
                if(jiedao1!=null&&jiedao1!=""){
                    $("#sel3").append("<option selected value='"+jiedao+"'>"+jiedao1+"</option>");
                    $("#sel4").append("<option selected value='"+shequ+"'>"+shequ1+"</option>");
                }
                
            }
            
        }); 
 
 
 
 

第二个ajax请求:(这个ajax分开写是为了可以做成无限级)

function change1(sel){
		var quji=$("#quji").val();
		var jiedao=$("#jiedao").val();
		var shequ=$("#shequ").val();
		
		if(sel.id=='sel2'){
			var fid1 = $('[name="sel2"] option:selected').val();
		}
		if(sel.id=='sel3'){
			var fid1 = $('[name="sel3"] option:selected').val();
		}
		if(sel.id=='sel4'){
			var fid1 = $('[name="sel4"] option:selected').val();
		}
		
		$.ajax({
			url:'${rootpath}/fenye/address',
			type:'post',
			data:{
				fid:fid1
			},
			success:function(data){
				var htmlStr="";
				$.each(data,function(index,obj){
					htmlStr+="<option value='"+obj.sid+" ' " ;
					
					if(obj.sid==quji){
						htmlStr+='selected '
					}
					htmlStr+=">"+obj.name+"</option>";
				});
				if(sel.id=='sel2'){
					$("#sel3").html(htmlStr);
				}
				if(sel.id=='sel3'){
					$("#sel4").html(htmlStr);
				}
			}
		});
	}

还有一步,因为每个下拉框默认的第一个选项显示的是"全部",所有在serviceImpl里面有个小操作.

当然也可以用其他方法解决.

@Override
	public List<Address> findListByFid(Address address) {
		List<Address> addlist = addressMapper.findListByFid(address);
		Address address1=new Address();
		/*添加全部选项,并保证在第一个显示*/
		address1.setName("全部");
		List<Address> list = new ArrayList<>();
		list.add(address1);
		for(int i =0;i<addlist.size();i++){
			list.add(addlist.get(i));
		}
		return list;
	}
/*点击查询回显*/
    @RequestMapping("/fenye/findLD")
    public String findLD(RedirectAttributesModelMap modelMap,Model model,String sel1,String sel2,String sel3,String sel4){
        modelMap.addFlashAttribute("quji", sel2);
        modelMap.addFlashAttribute("jiedao", sel3);
        modelMap.addFlashAttribute("shequ", sel4);
        Map<String, Object> map=new HashMap<>();
        map.put("sid", sel3);
        Address add=addressService.findById(map);
        modelMap.addFlashAttribute("jiedao1", add.getName());
        Map<String, Object> map1=new HashMap<>();
        map1.put("sid", sel4);
        Address add1=addressService.findById(map1);
        modelMap.addFlashAttribute("shequ1", add1.getName());
        
        return "redirect:/fenye/list";
    }

因为是点击查询后重定向到list页面,左右用的是

RedirectAttributesModelMap


如果需要可以无限级别联动,只要是数据库结构做好就OK了.

效果:

Vue四级联动下拉菜单可以使用Vue的数据绑定和组件化思想来实现。具体操作如下: 1. 在父组件中定义一个数组,存储四级联动数据。 2. 定义三个子组件,分别用来显示省、市、区的下拉菜单。 3. 在父组件中使用v-for指令遍历数组,将数据传递给子组件。 4. 在子组件中定义props属性,接受父组件传递过来的数据。 5. 在子组件的template中使用v-for指令遍历数据,渲染下拉菜单。 6. 在子组件的methods中定义一个change事件,用来触发父组件的数据更新操作。 具体代码如下: 父组件: ``` <template> <div> <province-select :provinces="provinces" @change="handleProvinceChange" /> <city-select :cities="cities" @change="handleCityChange" /> <district-select :districts="districts" @change="handleDistrictChange" /> </div> </template> <script> import ProvinceSelect from './ProvinceSelect.vue' import CitySelect from './CitySelect.vue' import DistrictSelect from './DistrictSelect.vue' export default { components: { ProvinceSelect, CitySelect, DistrictSelect }, data() { return { provinces: [ { id: 1, name: '北京市' }, { id: 2, name: '上海市' }, { id: 3, name: '广东省' } ], cities: [], districts: [] } }, methods: { handleProvinceChange(province) { this.cities = [ { id: 1, name: '北京市' }, { id: 2, name: '上海市' }, { id: 3, name: '广州市' } ] this.districts = [] }, handleCityChange(city) { this.districts = [ { id: 1, name: '东城区' }, { id: 2, name: '西城区' }, { id: 3, name: '黄浦区' }, { id: 4, name: '徐汇区' }, { id: 5, name: '天河区' }, { id: 6, name: '番禺区' } ] }, handleDistrictChange(district) { console.log(district) } } } </script> ``` 省级子组件: ``` <template> <div> <select v-model="selectedProvince" @change="handleChange"> <option value="">请选择省份</option> <option v-for="province in provinces" :key="province.id" :value="province">{{province.name}}</option> </select> </div> </template> <script> export default { props: { provinces: { type: Array, default: [] } }, data() { return { selectedProvince: null } }, methods: { handleChange() { this.$emit('change', this.selectedProvince) } } } </script> ``` 市级子组件: ``` <template> <div> <select v-model="selectedCity" @change="handleChange"> <option value="">请选择城市</option> <option v-for="city in cities" :key="city.id" :value="city">{{city.name}}</option> </select> </div> </template> <script> export default { props: { cities: { type: Array, default: [] } }, data() { return { selectedCity: null } }, methods: { handleChange() { this.$emit('change', this.selectedCity) } } } </script> ``` 区级子组件: ``` <template> <div> <select v-model="selectedDistrict" @change="handleChange"> <option value="">请选择区县</option> <option v-for="district in districts" :key="district.id" :value="district">{{district.name}}</option> </select> </div> </template> <script> export default { props: { districts: { type: Array, default: [] } }, data() { return { selectedDistrict: null } }, methods: { handleChange() { this.$emit('change', this.selectedDistrict) } } } </script> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值