首页 > 其他分享 >记录--vue3 setup 中国省市区三级联动options最简洁写法,无需任何库

记录--vue3 setup 中国省市区三级联动options最简洁写法,无需任何库

时间:2023-11-09 18:27:24浏览次数:38  
标签:province city const -- setup value newVal vue3 areaObj

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

在写页面的时候,发现表单里面有一个省市区的 options 组件要写,因为表单很多地方都会用到这个地址选择,我便以为很简单嘛。

虽然很简单的一个功能,但是网络上能搜索到的教程大多都是需要配合 elementUI 等各种 UI 库的,但是我的项目并没有使用这些 UI 库,何况我只是想要拿到 一个地址字符串 而已,何必绑定 UI 库呢?

1、地址三级联动制作思路

思路其实很简单:

1、一个地图 json 数据

2、能够拿到 省份、市、区 的 options 数组来绑定就可以了

3、选择一个省份市,对应的市要变化;选择市时,对应的区要变化

这样的话,我们完全可以依赖 vue 强大的数据处理机制来解决

2、地图json

地图json数据我随便搜了一个: 中国省市区数据

3、vue setup 语法糖写法

我们点击上面的链接,下载了地图json数据,这里选择一个普通的就可以了,如图:

 将文件命名为 area.json ,然后在项目中引入:

// 详细地址(省市区 详细地址)
import areaObj from '../../public/area.json';

第一步:首先是处理省份options数组(这里json地图是键名为省份):

// 省
const provinceArr = Object.keys(areaObj)
const province = ref(provinceArr[0])

这样就拿到了一个省份数组,这里随机默认选中第一个,北京市,这里 province 变量用来绑定输入框的值

第二步:处理市的数据,关键就是使用计算属性来监听 省份的变化,省份一改变,市的数据也会跟着改变:

// 市
const cityArr = computed(() => {
    return Object.keys(areaObj[province.value])
})
const city = ref(cityArr.value[0])

// 监听省份变化
watch(province, (newVal) => {
    city.value = Object.keys(areaObj[newVal])[0];
});

同样,这里的市默认选中第一个,city 也是双向绑定到 输入框, 为了能够在页面随时响应式改变,添加了一个watch 监听

第三步:处理区的数据

// 区
const areaArr = computed(() => {
    return areaObj[province.value][city.value]
})
const area = ref(areaArr.value[0])
// 监听市变化
watch(city, (newVal) => {
    area.value = areaObj[province.value][newVal][0]
})

这里同样默认选中第一个,当市变化时,区也会切换到对应的市区数据

4、效果

完美!

这样,就可以不借助任何第三方UI库,直接使用 vue 的计算属性和监听简单解决地图三级联动问题,就是数据的处理而已

以下是完整的代码:

其中 provinceArr、cityArr、areaArr 绑定options选项,province、city、area 绑定input 输入框

import { ref, computed, watch } from 'vue';
// 详细地址(省市区 详细地址)
import areaObj from '../../../../public/area.json';

// 省
const provinceArr = Object.keys(areaObj)
const province = ref(provinceArr[6])
// 市
const cityArr = computed(() => {
    return Object.keys(areaObj[province.value])
})
const city = ref(cityArr.value[0])
// 监听省份变化
watch(province, (newVal) => {
    city.value = Object.keys(areaObj[newVal])[0];
});
// 区
const areaArr = computed(() => {
    return areaObj[province.value][city.value]
})
const area = ref(areaArr.value[0])
// 监听市变化
watch(city, (newVal) => {
    area.value = areaObj[province.value][newVal][0]
})

// 详细地址
const detailArea = ref('')

本文转载于:

https://juejin.cn/post/7297983578548355099

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:province,city,const,--,setup,value,newVal,vue3,areaObj
From: https://www.cnblogs.com/smileZAZ/p/17822469.html

相关文章

  • IDEA (JAVA) 内存使用高堆分析
    ====================HISTOGRAM====================Histogram.Top50byinstancecount[All-objects][Only-strong-ref]:1:[2.0M/141MB][1.75M/127MB]byte[]2:[1.99M/43.8MB][1.74M/38.3MB]java.lang.String3:[421K/15.1MB][369K/13.2MB]java.util.H......
  • 在ASP.NET中上传下载文件实例代码
    usingSystem.IO;//检查上传文件不为空if(File1.PostedFile!=null)  {       string nam=File1.PostedFile.FileName;   //取得文件名(抱括路径)里最后一个"."的索引   int i=nam.LastIndexOf(".");   //取得文件扩展名   string newext=nam......
  • 一些哈希表的使用
    给定两个数组,编写一个函数来计算它们的交集。1classSolution{2public:3vector<int>intersection(vector<int>&nums1,vector<int>&nums2){4unordered_set<int>result_set;//存放结果,之所以用set是为了给结果集去重5unordered_set<......
  • JavaScript--String对象&自定义对象&Windows对象
    String对象 varstr1=newString("abc")varstr2="abc"trim():去除字符串前后两端的空白字符自定义对象  BOM对象 1、Windowconfirm方法会产生一个返回值varflag=confirm("");按确定返回true按取消返回falsesetTimeout()只执行一次setInterval()循环执行......
  • 永远都要有自救的能力和从头再来的勇气
    好像我一直都是这么失败,中考没能达到目标高中的统招线,高考考了两次才去到一所差不多的大学,四六级也考了很多次才过,现在考公考编也很难考上,可是我也明明很认真的学了呀,为什么总是这样,提前焦虑,提前准备,总是比别人花更多的时间和精力,最后的结果却是不尽人意。是我太普通了,走了很多弯......
  • npm install 会把 devDependencies 分开安装
    默认情况下,npminstall 命令会安装 package.json 文件中的所有依赖项,包括 dependencies 和 devDependencies。这意味着开发依赖项(devDependencies)也会被安装。如果你只想安装生产环境依赖项,而不安装开发依赖项,可以使用 --production 标志。例如:npminstall--productio......
  • C#学习-winform窗口程序实践-简易学生信息管理系统
    最近逐步开始学习C#,今天完成了一个简易的C#实现的winform窗口程序,如下图所示,可以实现插入,修改,删除学生信息和查询学生成绩;使用VS并连接了mysql数据库 插入 选中相应的信息可以修改 删除 ......
  • SpringBoot是如何保证服务启动后不自动停止的
    一般项目执行后,当程序结束会自动关闭程序。但Springboot项目,启动后,只要不发生error错误,一般不会自动停止。这是为什么呢?简单Java阻止停止为了保证一个服务能够持续有效地对外提供服务,一般会有相应的处理方式,比如:服务器上的守护进程脚本但是,在Java代码层面,除了shell脚本之外......
  • Bioremediation Technology—— A Solution to Soil Pollution
    BioremediationTechnologyforSoilPolution 1.Whatisbioremediationtechnology?Bioremediationisanaturalprocessbasedremediationtechnologyforcontaminatedland.Microorganismsinsoilorgroundwatercan"eat"certainharmfulchemical......
  • flutter 运行的四种模式
    Debug(调试)模式1、这是开发Flutter应用程序时最常用的模式。可以在真机和模拟器上同时运行。重要用于开发和调试阶段。2、可以进行热重载,即在不重新启动应用程序的情况下实时更新代码。3、应用程序会包含用于调试和开发的额外信息和工具(debugging信息、debuggeraids(比如......