首页 > 其他分享 >前端Vue自定义个性化三级联动自定义简洁中国省市区picker选择器

前端Vue自定义个性化三级联动自定义简洁中国省市区picker选择器

时间:2024-11-07 12:43:59浏览次数:6  
标签:picker city 自定义 provinceIndex 前端 area cityIndex 组件 选择器

一、 前端组件概述

前端组件开发在现代前端开发中占据着至关重要的地位。随着互联网的快速发展,前端应用的规模和复杂性不断增加,传统的开发方式已经难以满足需求。前端组件开发应运而生,成为提高开发效率、代码可维护性和可复用性的关键手段。

二、 组件化的重要性

通过将复杂的用户界面拆分成独立的、可复用的组件,开发者可以并行开发多个组件,避免重复劳动。

前端组件开发提高了代码的可维护性。每个组件都是一个独立的单元,具有自己的状态和行为。这使得组件可以单独进行测试和维护,降低了维护成本。当某个组件出现问题时,只需要修复该组件即可,而不需要在整个应用中进行搜索和替换。此外,组件的独立性还使得代码的可读性更高,便于其他开发者理解项目。

三、 Vue uni-app 实现三级联动自定义,省市区picker选择器

通过自定义三级联动组件,我们可以轻松实现三级联动省市区选择器,包括省市区,联动效果,可以滚动选择省市区效果。同时,通过定义事件处理函数,就能满足业务等需求。

效果如下:

使用方法:调用组件即可


<c-city
        :province="addressData.province"
        :city="addressData.city"
        :area="addressData.area"
        :show="showPicker"
        @updateSelection="handleUpdateSelection"
        @confirm="confirmSelection"
        @cancel="closePicker"
      ></c-city>

组件代码实现部分


<template>
  <view>
    <view v-if="isVisible" class="overlay"></view>
    <view :class="['picker-container', isVisible ? 'slide-up' : 'slide-down']">
      <view class="picker-actions">
        <text class="btn-cancel" @tap="cancelSelection">取消</text>
        <text class="btn-confirm" @tap="confirmSelection">确定</text>
      </view>
      <picker-view class="picker-view" :value="pickerValue" @change="handlePickerChange">
        <picker-view-column>
          <view v-for="(province, index) in provinces" :key="index" class="picker-item">{{ province }}</view>
        </picker-view-column>
        <picker-view-column>
          <view v-for="(city, index) in cities" :key="index" class="picker-item">{{ city }}</view>
        </picker-view-column>
        <picker-view-column>
          <view v-for="(area, index) in areas" :key="index" class="picker-item">{{ area }}</view>
        </picker-view-column>
      </picker-view>
    </view>
  </view>
</template>

<script>
  import AreaData from "./area.js";

  export default {
    data() {
      return {
        provinces: [],
        cities: [],
        areas: [],
        pickerValue: [0, 0, 0],
        isVisible: false
      };
    },
    props: {
      province: { type: String, default: '' },
      city: { type: String, default: '' },
      area: { type: String, default: '' },
      show: { type: Boolean, default: false }
    },
    watch: {
      province: 'initializePicker',
      city: 'initializePicker',
      area: 'initializePicker',
      show(newVal) {
        this.isVisible = newVal;
      }
    },
    mounted() {
      this.loadProvinces();
      this.initializePicker();
    },
    methods: {
      loadProvinces() {
        this.provinces = AreaData.map(province => province.name);
      },
      loadCities(provinceIndex) {
        this.cities = AreaData[provinceIndex]?.city.map(city => city.name) || [];
      },
      loadAreas(provinceIndex, cityIndex) {
        this.areas = AreaData[provinceIndex]?.city[cityIndex]?.area.map(area => area.name) || [];
      },
      initializePicker() {
        const provinceIndex = this.provinces.indexOf(this.province);
        this.loadCities(provinceIndex);
        const cityIndex = this.cities.indexOf(this.city);
        this.loadAreas(provinceIndex, cityIndex);
        const areaIndex = this.areas.indexOf(this.area);
        this.pickerValue = [provinceIndex, cityIndex, areaIndex];
      },
      handlePickerChange(e) {
        const [provinceIndex, cityIndex, areaIndex] = e.detail.value;
        this.loadCities(provinceIndex);
        this.loadAreas(provinceIndex, cityIndex);
        this.pickerValue = [provinceIndex, cityIndex, areaIndex];
        const selectedProvince = this.provinces[provinceIndex];
        const selectedCity = this.cities[cityIndex];
        const selectedArea = this.areas[areaIndex];
        const areaCode = AreaData[provinceIndex]?.city[cityIndex]?.area[areaIndex]?.id || '';
        this.$emit('updateSelection', { province: selectedProvince, city: selectedCity, area: selectedArea, areaCode });
      },
      confirmSelection() {
        this.$emit('confirm', {
          province: this.provinces[this.pickerValue[0]],
          city: this.cities[this.pickerValue[1]],
          area: this.areas[this.pickerValue[2]]
        });
        this.isVisible = false;
      },
      cancelSelection() {
        this.$emit('cancel');
        this.isVisible = false;
      }
    }
  };
</script>

<style scoped>
  .overlay {
    width: 100%;
    height: 100vh;
    background-color: rgba(0, 0, 0, 0.6);
    position: fixed;
    top: 0;
    left: 0;
    z-index: 10;
  }

  .picker-container {
    width: 100%;
    position: fixed;
    bottom: 0;
    left: 0;
    background-color: #fff;
    transition: all 0.3s;
    z-index: 11;
  }

  .picker-view {
    height: 250px;
    width: 100%;
  }

  .picker-item {
    text-align: center;
    font-size: 16px;
  }

  .picker-actions {
    display: flex;
    justify-content: space-between;
    padding: 10px 20px;
    border-bottom: 1px solid #eee;
    background-color: #f8f8f8;
  }

  .btn-cancel,
  .btn-confirm {
    font-size: 16px;
    color: #007aff;
    cursor: pointer;
  }

  .slide-up {
    bottom: 0;
  }

  .slide-down {
    bottom: -300px;
  }
</style>

四、结论

前端组件开发在现代前端工程中占据着至关重要的地位。通过合理的开发流程,我们能够构建出高效、可维护且可复用的前端组件。

热门的前端组件开发框架为我们提供了丰富的工具和资源,助力我们在不同的项目场景中快速实现功能。同时,注意事项中的各项原则能够引导我们避免常见的错误,提高组件的质量。

随着前端技术的不断发展,前端组件开发也将持续演进。我们应紧跟技术潮流,不断探索新的方法和技术,以更好地满足日益复杂的业务需求,为用户提供更加优质的前端体验。

 阅读全文下载完整组件代码请关注微信公众号: 前端101

标签:picker,city,自定义,provinceIndex,前端,area,cityIndex,组件,选择器
From: https://blog.csdn.net/qianduan342/article/details/143482228

相关文章

  • windows下电脑自定义磁盘图标,u盘图标,文件夹图标
    闲言更改图标要确定有ico(icon)格式图片文件,文件比例1:1,一般像素大小比例推荐128:128确保文件后缀有显示目录闲言寻找或制作ico图片直接下载网络图片制作ico文件在线制作本地制作ico磁盘/U盘图标更改文件夹图标更改寻找或制作ico图片直接下载网络图片这里推荐阿里巴巴......
  • 学习笔记(二十八):ArkUi-自定义弹窗 (CustomDialog)
    概述:CustomDialog是自定义弹窗,可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹窗一、创建自定义弹框1、使用@CustomDialog装饰器装饰自定义弹窗,可在此装饰器内自定义弹窗内容//自定义弹框内容@CustomDialogst......
  • Jest进阶知识:深入测试 React Hooks-确保自定义逻辑的可靠性
    测试ReactHooks在React开发中,Hooks是一个非常重要的功能模块,允许开发者在函数组件中使用状态和其他React特性。自定义Hooks作为一种公共逻辑的抽离,经常被多个组件复用,因此对其测试是非常必要的。然而,由于Hooks必须在组件内部使用,直接测试它们并不像普通函数那......
  • netdxf中创建一个新的自定义视图
    需求是我想使用netdxf创建一个文件,插入一个长方体块进去,保存文件后打开就是我想要的视图,例如一个等二测的角度谢谢惊惊,南胜,鸿,和尚,大佬们关键1:DxfDocument.Viewport.ViewDirection关键2:向量与大小无关,只要等比例即可获取原图形中的视图角度,使用ifox的代码如下......
  • QCustomPlot添加自定义的图例,实现隐藏、删除功能(一)
    文章目录实现步骤:实现代码:代码讲解:功能说明:优化建议:其他参考:要实现一个支持勾选并可以控制曲线显示和隐藏的自定义QCPLegend类,可以通过继承QCPLegend并重写其相关方法来实现。我们需要添加一个自定义的复选框元素,并捕捉用户交互来实现曲线的隐藏......
  • Bootstrap Blazor自定义图片预览组件
            BootstrapBlazor的官方虽然有提供图片预览组件ImagePreviewer,但是,它是置于窗口顶层的,而且是全屏显示,如果业务中有在预览组件中添加其它功能的需求,它是不支持扩展的。    为此,我参考官方的源码,自己写了一个自定义图片预览组件,文件的源码在下面,可自行......
  • web前端实现地址选择器精确到省市区街道(腾讯地图WebService API)
    目录先看效果,这里以移动端为例一、省市区街道选择器弹窗组件代码二、父组件引用“一”组件三、pc端效果总结先看效果,这里以移动端为例pc端稍微改下标签名和样式即可使用。一、省市区街道选择器弹窗组件代码html<template> <viewclass="page-content":styl......
  • WinNTSetup 使用教程的框架,您可以根据自己的需求深入研究每个部分,特别是集成驱动、应
    WinNTSetupv5.3.5.2-InstallWindowsfromUSB-MSFNWinNTSetup官方原版多国语言版下载链接:https://www.mediafire.com/folder/53um6k2nmhvd5/https://www.mediafire.com/file/rbpu88tre4nxwbe/WinNTSetup_v5352.rar/fileWinNTSetupv5352初级使用教程大纲引言WinNTSet......
  • el-date-picker设置起止时间间隔与setDate方法
    背景在对时间进行选择时,可能会因为选择的时间范围过大,导致数据量过大从而造成性能和视觉上的体验不佳。解决这个问题,设置可选择的时间的最大间隔,并且在超过间隔时将结束时间改为范围内的日期。解决方法步骤1.将日期字符串转化为Date对象,计算起止时间的时间差(此例子中为31......
  • 07LangChain实战课 - LLM模块使用与自定义模型调用
    LangChain实战课-LLM模块使用与自定义模型调用1.课程简介本节课聚焦于LangChain中的LLM(LargeLanguageModel)模块,探讨如何使用不同的大语言模型,包括开源模型和自定义模型。2.大语言模型的发展Transformer架构:Google在2018年提出的架构,是现代预训练模型的核心。基础......