最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3 + Element Plus 省市區(qū)縣級聯(lián)組件封裝,支持 v-model 雙向綁定 + 回顯,可直接復用

 更新時間:2026年04月13日 10:14:44   作者:程序媛七分  
本文介紹了如何封裝一個支持省市區(qū)三級聯(lián)動的通用復用組件,實現(xiàn)v-model雙向綁定、數(shù)據(jù)回顯、清空、禁用聯(lián)動等功能,提高開發(fā)效率和項目可維護性,本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

在后臺管理系統(tǒng)中,省市區(qū)三級聯(lián)動是非常常見的需求,無論是查詢條件、新增表單、編輯彈窗,都需要用到。

為了避免重復代碼,提升開發(fā)效率,我們可以把省市區(qū)三級聯(lián)動封裝成一個通用復用組件,支持:

  • 三級聯(lián)動
  • v-model 雙向綁定
  • 數(shù)據(jù)回顯(編輯頁面必備)
  • 清空、禁用聯(lián)動
  • 多頁面復用

今天就帶大家一步一步實現(xiàn)。

全部代碼

<template>
    <div class="region-picker">
        <el-select v-model="provinceId" placeholder="省" clearable style="flex: 1" @change="handleProvinceChange">
            <el-option v-for="item in provinceList" :key="item.value" :label="item.label" :value="item.value" />
        </el-select>
        <el-select v-model="cityId" placeholder="市" clearable :disabled="!provinceId" style="flex: 1; margin: 0 8px"
            @change="handleCityChange">
            <el-option v-for="item in cityList" :key="item.value" :label="item.label" :value="item.value" />
        </el-select>
        <el-select v-model="districtId" placeholder="區(qū)/縣" clearable :disabled="!cityId" style="flex: 1">
            <el-option v-for="item in areaList" :key="item.value" :label="item.label" :value="item.value" />
        </el-select>
    </div>
</template>
<script setup lang="ts">
import { computed, ref, watch } from 'vue'
// 模擬省市區(qū)數(shù)據(jù)(實際項目可替換為接口)
const regionData = [
    {
        value: '110000',
        label: '北京市',
        children: [
            {
                value: '110100',
                label: '北京市',
                children: [
                    { value: '110101', label: '東城區(qū)' },
                    { value: '110102', label: '西城區(qū)' },
                    { value: '110105', label: '朝陽區(qū)' },
                    { value: '110106', label: '豐臺區(qū)' },
                    { value: '110108', label: '海淀區(qū)' },
                ]
            }
        ]
    },
    {
        value: '410000',
        label: '河南省',
        children: [
            {
                value: '410100',
                label: '鄭州市',
                children: [
                    { value: '410102', label: '中原區(qū)' },
                    { value: '410103', label: '二七區(qū)' },
                    { value: '410104', label: '管城回族區(qū)' },
                    { value: '410105', label: '金水區(qū)' },
                ]
            },
            {
                value: '410300',
                label: '洛陽市',
                children: [
                    { value: '410302', label: '老城區(qū)' },
                    { value: '410303', label: '西工區(qū)' },
                ]
            }
        ]
    }
]
// 類型定義
interface RegionModel {
    provinceId: string
    cityId: string
    districtId: string
}
// 接收 v-model
const props = withDefaults(defineProps<{
    modelValue?: RegionModel
}>(), {
    modelValue: () => ({ provinceId: '', cityId: '', districtId: '' })
})
// 拋出事件
const emit = defineEmits<{
    'update:modelValue': [value: RegionModel]
    'change': [value: RegionModel]
}>()
// 內部選中值
const provinceId = ref('')
const cityId = ref('')
const districtId = ref('')
// 省列表
const provinceList = computed(() => regionData || [])
// 市列表(根據(jù)省動態(tài)計算)
const cityList = computed(() => {
    if (!provinceId.value) return []
    const p = regionData.find(item => item.value === provinceId.value)
    return p?.children || []
})
// 區(qū)縣列表(根據(jù)市動態(tài)計算)
const areaList = computed(() => {
    if (!cityId.value) return []
    const c = cityList.value.find(item => item.value === cityId.value)
    return c?.children || []
})
// 切換省 → 清空市、區(qū)縣
const handleProvinceChange = () => {
    cityId.value = ''
    districtId.value = ''
    emitValue()
}
// 切換市 → 清空區(qū)縣
const handleCityChange = () => {
    districtId.value = ''
    emitValue()
}
// 向外拋出數(shù)據(jù)
const emitValue = () => {
    const value = {
        provinceId: provinceId.value,
        cityId: cityId.value,
        districtId: districtId.value,
    }
    emit('update:modelValue', value)
    emit('change', value)
}
// 監(jiān)聽父組件 v-model 實現(xiàn)回顯
watch(
    () => props.modelValue,
    (val) => {
        if (val) {
            provinceId.value = val.provinceId || ''
            cityId.value = val.cityId || ''
            districtId.value = val.districtId || ''
        }
    },
    { deep: true, immediate: true }
)
// 監(jiān)聽內部變化 → 自動同步父組件
watch([provinceId, cityId, districtId], emitValue)
</script>
<style scoped>
.region-picker {
    display: flex;
    width: 100%;
    gap: 8px;
}
</style>

任意頁面直接調用??

<template>
  <RegionPicker v-model="queryRegion" @change="handleChange" />
</template>
<script setup>
import RegionPicker from '@/components/RegionPicker/index.vue'
const queryRegion = ref({
  provinceId: '',
  cityId: '',
  districtId: ''
})
const handleChange = (val) => {
  console.log('選中的省市區(qū):', val)
}
</script>

最終達到的效果

        三級聯(lián)動選擇省自動加載市,選擇市自動加載區(qū)縣

        v-model 雙向綁定父組件直接使用 v-model 綁定

        數(shù)據(jù)回顯:編輯頁面可直接賦值

        自動清空:切換上級,下級自動清空

        禁用聯(lián)動:未選擇上級,下級無法選擇

        支持清空:每個 select 都支持 clearable

        復用性強:查詢表單、彈窗新增、彈窗編輯都能調用

總結

封裝成通用組件后,所有頁面只需要寫一行代碼,就能實現(xiàn)省市區(qū)三級聯(lián)動,大大減少重復代碼,提升開發(fā)效率和項目可維護性。

如果需要,還可以擴展:

  • 接口動態(tài)獲取省市區(qū)
  • 支持四級聯(lián)動(省市區(qū)街道)
  • 支持默認值
  • 支持禁用某項

到此這篇關于Vue3 + Element Plus 省市區(qū)縣級聯(lián)組件封裝,支持 v-model 雙向綁定 + 回顯,可直接復用的文章就介紹到這了,更多相關Vue3 Element Plus 省市區(qū)縣級聯(lián)組件封裝內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue3獲取、設置元素高度的代碼舉例

    vue3獲取、設置元素高度的代碼舉例

    這篇文章主要給大家介紹了關于vue3獲取、設置元素高度的相關資料,小編通過實際案例向大家展示操作過程,操作方法簡單易懂,需要的朋友可以參考下
    2024-08-08
  • Vue cli構建及項目打包以及出現(xiàn)的問題解決

    Vue cli構建及項目打包以及出現(xiàn)的問題解決

    這篇文章主要介紹了Vue cli構建及項目打包以及出現(xiàn)的問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 如何解決Vue3組合式API模式下動態(tài)組件不渲染問題

    如何解決Vue3組合式API模式下動態(tài)組件不渲染問題

    這篇文章主要介紹了如何解決Vue3組合式API模式下動態(tài)組件不渲染問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教<BR>
    2024-03-03
  • 在vscode中使用腳手架搭建vue項目

    在vscode中使用腳手架搭建vue項目

    這篇文章主要介紹了在vscode中使用腳手架搭建vue項目的相關資料,包括創(chuàng)建Vue2和Vue3項目,并展示了如何自定義項目配置,如選擇特性、路由模式、CSS預處理器和工具配置,通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • vue.js引入外部CSS樣式和外部JS文件的方法

    vue.js引入外部CSS樣式和外部JS文件的方法

    這篇文章主要介紹了vue.js引入外部CSS樣式和外部JS文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 帶你一文了解Vue生命周期鉤子

    帶你一文了解Vue生命周期鉤子

    生命周期鉤子又被叫做生命周期時間,生命周期函數(shù),生命周期鉤子就是vue生命周期中出發(fā)的各類事件,這些事件被稱為生命周期鉤子,下面這篇文章主要給大家介紹了關于Vue生命周期鉤子的相關資料,需要的朋友可以參考下
    2022-06-06
  • Vue中如何實現(xiàn)proxy代理

    Vue中如何實現(xiàn)proxy代理

    本篇文章主要介紹了Vue中如何實現(xiàn)proxy代理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • vue 使用html2canvas將DOM轉化為圖片的方法

    vue 使用html2canvas將DOM轉化為圖片的方法

    這篇文章主要介紹了vue 使用html2canvas將DOM轉化為圖片的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • vue 根據(jù)選擇條件顯示指定參數(shù)的例子

    vue 根據(jù)選擇條件顯示指定參數(shù)的例子

    今天小編就為大家分享一篇vue 根據(jù)選擇條件顯示指定參數(shù)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue如何使用driver.js實現(xiàn)項目功能向導指引

    vue如何使用driver.js實現(xiàn)項目功能向導指引

    driver.js 是一個輕量級、無依賴的原生JavaScript引擎,在整個頁面中驅動用戶的注意力,強大的、高度可定制的原生JavaScript引擎,無外部依賴,支持所有主流瀏覽器,這篇文章主要介紹了vue如何使用driver.js實現(xiàn)項目功能向導指引,需要的朋友可以參考下
    2023-03-03

最新評論

阿鲁科尔沁旗| 达州市| 朝阳市| 温州市| 响水县| 昌都县| 建始县| 毕节市| 托克托县| 旅游| 遂平县| 元谋县| 大同市| 渑池县| 汉寿县| 麻江县| 竹溪县| 南昌市| 台江县| 闽清县| 马公市| 云南省| 邮箱| 赣州市| 凭祥市| 肇东市| 江门市| 临朐县| 象山县| 渭南市| 广昌县| 清新县| 电白县| 汶川县| 沾益县| 四会市| 中方县| 靖西县| 息烽县| 神农架林区| 讷河市|