当前位置: 首页 > article >正文

【AI-Coding】2025再实现简单的省市联动

写在开始 :
1️⃣ 本博客只作为个人记录学习使用,如果涉及版权等其他问题,辛苦及时联系小编修改或者下架;谢谢
2️⃣ 本文只简单展示了简单的省份、城市和区县的城市选择器,仅展示效果和代码,有兴趣的可以看看哈~

1-1 AI第一次实现效果预览

话不多说,直接看效果图,AI生成的,应该是react…
在这里插入图片描述

1-2 代码code

import { useState, useEffect } from "react";
import { 
  Select,
  SelectContent,
  SelectItem,
  SelectTrigger,
  SelectValue,
} from "@/components/ui/select";
import { Card } from "@/components/ui/card";
import { Label } from "@/components/ui/label";

const Index = () => {
  const [province, setProvince] = useState("");
  const [city, setCity] = useState("");
  const [district, setDistrict] = useState("");
  
  // 省份数据
  const provinces = [
    { value: "beijing", label: "北京" },
    { value: "shanghai", label: "上海" },
    { value: "anhui", label: "安徽" },
    { value: "jiangsu", label: "江苏" }
  ];
  
  // 城市数据 - 根据省份动态变化
  const [cities, setCities] = useState([]);
  
  // 区县数据 - 根据城市动态变化
  const [districts, setDistricts] = useState([]);
  
  // 当省份变化时更新城市列表
  useEffect(() => {
    if (!province) {
      setCities([]);
      setCity("");
      return;
    }
    
    // 模拟不同省份对应的城市数据
    const citiesMap = {
      beijing: [{ value: "beijing", label: "北京市" }],
      shanghai: [{ value: "shanghai", label: "上海市" }],
      anhui: [
        { value: "hefei", label: "合肥市" },
        { value: "wuhu", label: "芜湖市" },
        { value: "bengbu", label: "蚌埠市" },
        { value: "xuancheng", label: "宣城市" }
      ],
      jiangsu: [
        { value: "nanjing", label: "南京市" },
        { value: "suzhou", label: "苏州市" },
        { value: "wuxi", label: "无锡市" }
      ]
    };
    
    setCities(citiesMap[province] || []);
    setCity("");
  }, [province]);
  
  // 当城市变化时更新区县列表
  useEffect(() => {
    if (!city) {
      setDistricts([]);
      setDistrict("");
      return;
    }
    
    // 模拟不同城市对应的区县数据
    const districtsMap = {
      beijing: [
        { value: "haidian", label: "海淀区" },
        { value: "chaoyang", label: "朝阳区" },
        { value: "dongcheng", label: "东城区" }
      ],
      shanghai: [
        { value: "pudong", label: "浦东新区" },
        { value: "huangpu", label: "黄浦区" },
        { value: "xuhui", label: "徐汇区" }
      ],
      hefei: [
        { value: "luyang", label: "庐阳区" },
        { value: "baohe", label: "包河区" },
        { value: "yaohai", label: "瑶海区" }
      ],
      nanjing: [
        { value: "gulou", label: "鼓楼区" },
        { value: "qinhuai", label: "秦淮区" },
        { value: "jianye", label: "建邺区" }
      ],
      suzhou: [
        { value: "gusu", label: "姑苏区" },
        { value: "wuzhong", label: "吴中区" },
        { value: "xiangcheng", label: "相城区" }
      ],
      xuancheng: [
        { value: "xuanzhou", label: "宣州区" },
        { value: "jingxian", label: "泾县" },
        { value: "guangde", label: "广德市" },
        { value: "ningguo", label: "宁国市" },
        { value: "langxi", label: "郎溪县" },
        { value: "jingde", label: "旌德县" },
        { value: "jixi", label: "绩溪县" }
      ]
    };
    
    setDistricts(districtsMap[city] || []);
    setDistrict("");
  }, [city]);
  
  return (
    <div className="min-h-screen bg-gray-50 p-8">
      <div className="max-w-4xl mx-auto">
        <h1 className="text-3xl font-bold mb-8 text-center">地区选择</h1>
        
        <Card className="p-6 shadow-md">
          <div className="grid grid-cols-1 md:grid-cols-3 gap-6">
            {/* 省份选择 */}
            <div className="space-y-2">
              <Label htmlFor="province" className="text-sm font-medium">
                省份
              </Label>
              <Select
                value={province}
                onValueChange={(value) => setProvince(value)}
              >
                <SelectTrigger id="province" className="w-full">
                  <SelectValue placeholder="请选择省份" />
                </SelectTrigger>
                <SelectContent>
                  {provinces.map((item) => (
                    <SelectItem key={item.value} value={item.value}>
                      {item.label}
                    </SelectItem>
                  ))}
                </SelectContent>
              </Select>
            </div>
            
            {/* 城市选择 */}
            <div className="space-y-2">
              <Label htmlFor="city" className="text-sm font-medium">
                城市
              </Label>
              <Select
                value={city}
                onValueChange={(value) => setCity(value)}
                disabled={!province}
              >
                <SelectTrigger id="city" className="w-full">
                  <SelectValue placeholder={province ? "请选择城市" : "请先选择省份"} />
                </SelectTrigger>
                <SelectContent>
                  {cities.map((item) => (
                    <SelectItem key={item.value} value={item.value}>
                      {item.label}
                    </SelectItem>
                  ))}
                </SelectContent>
              </Select>
            </div>
            
            {/* 区县选择 */}
            <div className="space-y-2">
              <Label htmlFor="district" className="text-sm font-medium">
                行政区
              </Label>
              <Select
                value={district}
                onValueChange={(value) => setDistrict(value)}
                disabled={!city}
              >
                <SelectTrigger id="district" className="w-full">
                  <SelectValue placeholder={city ? "请选择行政区" : "请先选择城市"} />
                </SelectTrigger>
                <SelectContent>
                  {districts.map((item) => (
                    <SelectItem key={item.value} value={item.value}>
                      {item.label}
                    </SelectItem>
                  ))}
                </SelectContent>
              </Select>
            </div>
          </div>
          
          {/* 显示选择结果 */}
          {(province || city || district) && (
            <div className="mt-8 p-4 bg-blue-50 rounded-md">
              <h3 className="font-medium mb-2">当前选择:</h3>
              <div className="space-y-1 text-sm">
                {province && (
                  <p>省份: {provinces.find(p => p.value === province)?.label}</p>
                )}
                {city && (
                  <p>城市: {cities.find(c => c.value === city)?.label}</p>
                )}
                {district && (
                  <p>行政区: {districts.find(d => d.value === district)?.label}</p>
                )}
              </div>
            </div>
          )}
        </Card>
      </div>
    </div>
  );
};

export default Index;

2-1 HTML实现的效果预览

在这里插入图片描述

2-2 HTML-code

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>省市区级联选择</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
        }
        .container {
            background-color: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
        }
        select {
            margin: 10px 0;
            padding: 5px;
            width: 200px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>省市区选择器</h2>
        <select id="province">
            <option value="">请选择省份</option>
        </select>
        <br>
        <select id="city">
            <option value="">请选择城市</option>
        </select>
        <br>
        <select id="district">
            <option value="">请选择区县</option>
        </select>
    </div>

    <script>
        const data = {
            "北京": {
                "北京市": ["东城区", "西城区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "顺义区", "昌平区", "大兴区", "怀柔区", "平谷区", "密云区", "延庆区"]
            },
            "上海": {
                "上海市": ["黄浦区", "徐汇区", "长宁区", "静安区", "普陀区", "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区", "浦东新区", "金山区", "松江区", "青浦区", "奉贤区", "崇明区"]
            },
            "安徽": {
                "合肥市": ["瑶海区", "庐阳区", "蜀山区", "包河区", "长丰县", "肥东县", "肥西县", "庐江县", "巢湖市"],
                "芜湖市": ["镜湖区", "弋江区", "鸠江区", "三山区", "芜湖县", "繁昌县", "南陵县", "无为县"],
                "蚌埠市": ["龙子湖区", "蚌山区", "禹会区", "淮上区", "怀远县", "五河县", "固镇县"],
                "宣城市": ["宣州区", "泾县", "广德市", "宁国市", "郎溪县", "旌德县", "绩溪县"]
            },
            "江苏": {
                "南京市": ["玄武区", "秦淮区", "建邺区", "鼓楼区", "浦口区", "栖霞区", "雨花台区", "江宁区", "六合区", "溧水区", "高淳区"],
                "苏州市": ["姑苏区", "虎丘区", "吴中区", "相城区", "吴江区", "常熟市", "张家港市", "昆山市", "太仓市"],
                "无锡市": ["梁溪区", "新吴区", "锡山区", "惠山区", "滨湖区", "江阴市", "宜兴市"]
            }
        };

        const provinceSelect = document.getElementById('province');
        const citySelect = document.getElementById('city');
        const districtSelect = document.getElementById('district');

        // 初始化省份下拉框
        for (let province in data) {
            provinceSelect.options.add(new Option(province, province));
        }

        // 省份选择改变时更新城市
        provinceSelect.onchange = function() {
            citySelect.length = 1; // 清空城市下拉框,只保留请选择
            districtSelect.length = 1; // 清空区县下拉框,只保留请选择
            if (this.value === '') return;

            for (let city in data[this.value]) {
                citySelect.options.add(new Option(city, city));
            }
        };

        // 城市选择改变时更新区县
        citySelect.onchange = function() {
            districtSelect.length = 1; // 清空区县下拉框,只保留请选择
            if (this.value === '') return;

            let districts = data[provinceSelect.value][this.value];
            for (let i = 0; i < districts.length; i++) {
                districtSelect.options.add(new Option(districts[i], districts[i]));
            }
        };
    </script>
</body>
</html>

3-1 jQuery版本-效果预览

在这里插入图片描述

3-2 jQuery版本代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>省市区级联选择 - jQuery版本</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
        }
        .container {
            background-color: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
            width: 300px;
        }
        select {
            margin: 10px 0;
            padding: 8px;
            width: 100%;
            border: 1px solid #ddd;
            border-radius: 4px;
        }
        h2 {
            color: #333;
            text-align: center;
            margin-bottom: 20px;
        }
        .form-group {
            margin-bottom: 15px;
        }
        label {
            display: block;
            margin-bottom: 5px;
            color: #555;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>省市区选择</h2>
        <div class="form-group">
            <label for="province">省份:</label>
            <select id="province">
                <option value="">请选择省份</option>
            </select>
        </div>
        <div class="form-group">
            <label for="city">城市:</label>
            <select id="city">
                <option value="">请选择城市</option>
            </select>
        </div>
        <div class="form-group">
            <label for="district">区县:</label>
            <select id="district">
                <option value="">请选择区县</option>
            </select>
        </div>
    </div>

    <script>
        $(document).ready(function() {
            const data = {
                "北京": {
                    "北京市": ["东城区", "西城区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "顺义区", "昌平区", "大兴区", "怀柔区", "平谷区", "密云区", "延庆区"]
                },
                "上海": {
                    "上海市": ["黄浦区", "徐汇区", "长宁区", "静安区", "普陀区", "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区", "浦东新区", "金山区", "松江区", "青浦区", "奉贤区", "崇明区"]
                },
                "安徽": {
                    "合肥市": ["瑶海区", "庐阳区", "蜀山区", "包河区", "长丰县", "肥东县", "肥西县", "庐江县", "巢湖市"],
                    "芜湖市": ["镜湖区", "弋江区", "鸠江区", "三山区", "芜湖县", "繁昌县", "南陵县", "无为县"],
                    "蚌埠市": ["龙子湖区", "蚌山区", "禹会区", "淮上区", "怀远县", "五河县", "固镇县"],
                    "宣城市": ["宣州区", "泾县", "广德市", "宁国市", "郎溪县", "旌德县", "绩溪县"]
                },
                "江苏": {
                    "南京市": ["玄武区", "秦淮区", "建邺区", "鼓楼区", "浦口区", "栖霞区", "雨花台区", "江宁区", "六合区", "溧水区", "高淳区"],
                    "苏州市": ["姑苏区", "虎丘区", "吴中区", "相城区", "吴江区", "常熟市", "张家港市", "昆山市", "太仓市"],
                    "无锡市": ["梁溪区", "新吴区", "锡山区", "惠山区", "滨湖区", "江阴市", "宜兴市"]
                }
            };

            // 初始化省份下拉框
            $.each(data, function(province) {
                $('#province').append($('<option>', {
                    value: province,
                    text: province
                }));
            });

            // 省份选择改变时更新城市
            $('#province').change(function() {
                $('#city').html('<option value="">请选择城市</option>');
                $('#district').html('<option value="">请选择区县</option>');
                
                const selectedProvince = $(this).val();
                if (selectedProvince === '') return;

                $.each(data[selectedProvince], function(city) {
                    $('#city').append($('<option>', {
                        value: city,
                        text: city
                    }));
                });
            });

            // 城市选择改变时更新区县
            $('#city').change(function() {
                $('#district').html('<option value="">请选择区县</option>');
                
                const selectedProvince = $('#province').val();
                const selectedCity = $(this).val();
                if (selectedCity === '') return;

                const districts = data[selectedProvince][selectedCity];
                $.each(districts, function(index, district) {
                    $('#district').append($('<option>', {
                        value: district,
                        text: district
                    }));
                });
            });
        });
    </script>
</body>
</html>

4-1 VUE版本效果预览

在这里插入图片描述

4-2 VUE代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>省市区级联选择 - Vue版本</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
        }
        .container {
            background-color: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
            width: 300px;
        }
        select {
            margin: 10px 0;
            padding: 8px;
            width: 100%;
            border: 1px solid #ddd;
            border-radius: 4px;
        }
        h2 {
            color: #333;
            text-align: center;
            margin-bottom: 20px;
        }
        .form-group {
            margin-bottom: 15px;
        }
        label {
            display: block;
            margin-bottom: 5px;
            color: #555;
        }
        .selected-info {
            margin-top: 20px;
            padding: 10px;
            background-color: #f9f9f9;
            border-radius: 4px;
            font-size: 14px;
        }
    </style>
</head>
<body>
    <div id="app" class="container">
        <h2>省市区选择</h2>
        <div class="form-group">
            <label for="province">省份:</label>
            <select id="province" v-model="selectedProvince" @change="provinceChanged">
                <option value="">请选择省份</option>
                <option v-for="(cities, province) in regionData" :value="province">{{ province }}</option>
            </select>
        </div>
        <div class="form-group">
            <label for="city">城市:</label>
            <select id="city" v-model="selectedCity" @change="cityChanged" :disabled="!selectedProvince">
                <option value="">请选择城市</option>
                <option v-for="(districts, city) in cities" :value="city">{{ city }}</option>
            </select>
        </div>
        <div class="form-group">
            <label for="district">区县:</label>
            <select id="district" v-model="selectedDistrict" :disabled="!selectedCity">
                <option value="">请选择区县</option>
                <option v-for="district in districts" :value="district">{{ district }}</option>
            </select>
        </div>
        
        <div class="selected-info" v-if="selectedProvince || selectedCity || selectedDistrict">
            <p>当前选择:</p>
            <p v-if="selectedProvince">省份:{{ selectedProvince }}</p>
            <p v-if="selectedCity">城市:{{ selectedCity }}</p>
            <p v-if="selectedDistrict">区县:{{ selectedDistrict }}</p>
        </div>
    </div>

    <script>
        new Vue({
            el: '#app',
            data: {
                regionData: {
                    "北京": {
                        "北京市": ["东城区", "西城区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "顺义区", "昌平区", "大兴区", "怀柔区", "平谷区", "密云区", "延庆区"]
                    },
                    "上海": {
                        "上海市": ["黄浦区", "徐汇区", "长宁区", "静安区", "普陀区", "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区", "浦东新区", "金山区", "松江区", "青浦区", "奉贤区", "崇明区"]
                    },
                    "安徽": {
                        "合肥市": ["瑶海区", "庐阳区", "蜀山区", "包河区", "长丰县", "肥东县", "肥西县", "庐江县", "巢湖市"],
                        "芜湖市": ["镜湖区", "弋江区", "鸠江区", "三山区", "芜湖县", "繁昌县", "南陵县", "无为县"],
                        "蚌埠市": ["龙子湖区", "蚌山区", "禹会区", "淮上区", "怀远县", "五河县", "固镇县"],
                        "宣城市": ["宣州区", "泾县", "广德市", "宁国市", "郎溪县", "旌德县", "绩溪县"]
                    },
                    "江苏": {
                        "南京市": ["玄武区", "秦淮区", "建邺区", "鼓楼区", "浦口区", "栖霞区", "雨花台区", "江宁区", "六合区", "溧水区", "高淳区"],
                        "苏州市": ["姑苏区", "虎丘区", "吴中区", "相城区", "吴江区", "常熟市", "张家港市", "昆山市", "太仓市"],
                        "无锡市": ["梁溪区", "新吴区", "锡山区", "惠山区", "滨湖区", "江阴市", "宜兴市"]
                    }
                },
                selectedProvince: '',
                selectedCity: '',
                selectedDistrict: '',
                cities: {},
                districts: []
            },
            methods: {
                provinceChanged() {
                    this.selectedCity = '';
                    this.selectedDistrict = '';
                    this.districts = [];
                    if (this.selectedProvince) {
                        this.cities = this.regionData[this.selectedProvince];
                    } else {
                        this.cities = {};
                    }
                },
                cityChanged() {
                    this.selectedDistrict = '';
                    if (this.selectedCity) {
                        this.districts = this.regionData[this.selectedProvince][this.selectedCity];
                    } else {
                        this.districts = [];
                    }
                }
            }
        });
    </script>
</body>
</html>

写在最后 : 如果觉得还不错,或者对您有帮助,麻烦动动小手,点赞或者关注,谢谢!


http://www.kler.cn/a/595281.html

相关文章:

  • 代码随想录第55期训练营第八天|LeetCode344.反转字符串、541.反转字符串II、卡码网:54.替换数字
  • HTML5拖拽功能教程
  • 【Linux网络-NAT、代理服务、内网穿透】
  • 从沈抖到谢广军,百度智能云何时“云开月明”?
  • poetry安装与使用
  • 什么是跳表?(Skip List)
  • cippe2025北京石油展,遨游通讯将携多款防爆手机亮相!
  • Java高并发容器的内核解析:从无锁算法到分段锁的架构演进
  • 移动WEB开发之rem适配布局
  • 搭建主从DNS、nfs、nginx
  • 36、deque分配器的作用
  • Qt 基本使用方法介绍
  • 从零开始学2PC:分布式事务的原子性保障
  • C++编译流程
  • UNIX网络编程笔记:一些网络协议的相关知识
  • 【Android】基础架构(详细介绍)
  • WordPress 性能优化技术指南:打造快速加载的网站
  • 【python】OpenCV—Hand Landmarks Detection
  • 能源监控软件UI界面设计:平衡功能性与审美性的艺术
  • 针对耳鸣患者推荐的一些菜谱和食材