• uniapp-地区的四级联动


    本来填写订单的页面选地址是三级联动

    但是由于领导的要求,需要改成四级联动

    解决思路

    最开始用的是官方的 picker , 所以我去翻看了uniapp 的官网

    我们需要用到的是多列模式

    解决步骤

    1. 先封装对应的请求

    1. /**
    2. * 获取省市县街道的列表
    3. */
    4. export const getAddressList = (data) => request({url: '/system/region/list', method: 'get', data: data })

    2. 在data内去定义对应的数据

    3. 在页面的 created 钩子函数内去调用方法

    1. data () {
    2. return {
    3. provinceList: [], // 地区列表
    4. province: [], //省数组
    5. city: [], //市数组
    6. district: [], //区数组
    7. street: [], //街道数组
    8. mulSelect: [], //四级联动显示数组,该数组的值为[[province],[city],[district],[street]]
    9. mulSelectId: [] ,// 四级联动的id
    10. provinceId: 110000, //省的id
    11. cityId: 110101, //市的id
    12. districtId: 110101001,//区的id
    13. streetId: '', // 镇/街道id
    14. address:''
    15. };
    16. },
    17. created() {
    18. this.getList('', '1')
    19. },
    20. methods: {
    21. // 获取地址列表
    22. async getList(id, level) {
    23. const data = {
    24. parentId: id,
    25. level: level
    26. }
    27. const res = await getAddressList(data)
    28. if (this.mulSelect.length !== 4) {
    29. if(level == 1) {
    30. this.province = res.data.data
    31. this.getProvince();
    32. this.mulSelectId.push(res.data.data[0].id)
    33. this.mulSelect.push(this.province);
    34. this.getList(this.provinceId, '2')
    35. } else if (level == 2) {
    36. this.city = res.data.data
    37. this.getCity();
    38. this.mulSelectId.push(res.data.data[0].id)
    39. this.mulSelect.push(this.city);
    40. this.getList(this.cityId, '3')
    41. } else if (level == 3) {
    42. this.district = res.data.data
    43. this.getDistrict();
    44. this.mulSelectId.push(res.data.data[0].id)
    45. this.mulSelect.push(this.district);
    46. this.getList(this.districtId, '4')
    47. }
    48. } else {
    49. if(level == 1) {
    50. // this.provinceId = res.data.data[0].id
    51. console.log(id)
    52. this.mulSelectId[0] = id
    53. console.log(this.mulSelectId)
    54. this.getProvince();
    55. this.getList(this.provinceId, '2')
    56. } else if (level == 2) {
    57. this.city = res.data.data
    58. this.cityId = res.data.data[0].id
    59. this.mulSelectId[1] = this.cityId
    60. this.getCity();
    61. this.mulSelect[1] = this.city;
    62. this.getList(this.cityId, '3')
    63. } else if (level == 3) {
    64. this.district = res.data.data
    65. this.districtId = res.data.data[0].id
    66. this.mulSelectId[2] = this.districtId
    67. this.getDistrict();
    68. this.mulSelect[2] = this.district;
    69. this.getList(this.districtId, '4')
    70. } else if (level == 4) {
    71. this.street = res.data.data
    72. this.streetId = res.data.data[0].id
    73. this.mulSelectId[3] = this.streetId
    74. this.getStreet();
    75. this.mulSelect[3] = this.street;
    76. }
    77. }
    78. },
    79. }

    因为这个接口需要两个参数 而第一层级的省份是不需要id,只需要层级 所以在created内去调用的时候 只用传一个参数

    这个方法是分了两种情况

    第一种情况是刚进入页面的时候去获取地区的时候 因为我们定义的列表 mulSelect 数据是空的,所以说,这个时候 发请求获取到的数据 就是向这个数组内去push

    第二种情况是 当后续切换地区的时候 这个时候就不能用push了 只能对应的地方去替换原来的数据

    例如: this.mulSelectId[1] = this.cityId

    判断条件的话 我预想的比较好的方法就是通过去判断 mulSelect 数组的长度 因为最开始添加的时候length肯定是为0 的 但是这个时候就需要做一个小改动 因为不能直接写

    if (this.mulSelect.length == 0) 一些特殊情况 例如北京市 的情况下 总共是只有三级的 然后切换到xx省之后 就有四层数据 这个时候第四层数据怎么去替换呢 只能说push进去

    当然 这个方法是接收两个参数的 第一个是对应的id 第二个是层级

    因为我们发请求的时候是需要判断层级的 所以我又加了一层if判断 目的是为了区分一下

    4. 初次调用请求方法

    在实际开发中,为了用户的体验效果 肯定是第一次把四级的数据都展示出来,但是一次只能发一次请求

    这个时候层级就派上用场了 当为第一层的时候发第一个请求, 得到省级别的列表,先调另外的方法把列表添加进入 muSelect 数组内

    请求成功的时候也是拿到了第一个省份的id,我们拿到id后 递归 调用自身 但是传层级为2和对应的省id,这个时候就进入到了层级为2的逻辑内了 其实和层级1一样 这一层级也是获取到对应的市列表,调用方法添加到数组内 ,然后再调用自身传递3 ...........依次循环,直到循环完四次循环

    下面是图解

    因为默认第一个北京 只有三层 所以写三层就够了

    5. 切换时请求

    切换时 绑定的事件 @columnchange="colChange"

    1. // 地址改变触发
    2. colChange(e) {
    3. // console.log(e.detail);
    4. // console.log(this.mulSelect[0][e.detail.value])
    5. switch (e.detail.column){
    6. case 0://选择省
    7. this.mulSelect[1] =[]
    8. this.mulSelect[2] =[]
    9. this.mulSelect[3] =[]
    10. this.provinceId=this.mulSelect[0][e.detail.value].id;
    11. console.log(this.provinceId)
    12. this.getList(this.provinceId, e.detail.column+2 )
    13. break;
    14. case 1://选择市
    15. this.mulSelect[2] =[]
    16. this.mulSelect[3] =[]
    17. this.cityId = this.mulSelect[1][e.detail.value].id;
    18. this.getList(this.cityId, e.detail.column+2 )
    19. break;
    20. case 2://选择区
    21. this.mulSelect[3] =[]
    22. this.districtId = this.mulSelect[2][e.detail.value].id;
    23. this.getList(this.districtId, e.detail.column+2 )
    24. break;
    25. case 3://选择街道
    26. this.streetId = this.mulSelect[3][e.detail.value].id
    27. break;
    28. default:
    29. break;
    30. }
    31. },

    触发该事件 事件的e内有一个 detail 里面有两个属性 一个是value 一个是column

    value 是对应的层级下的索引

    column 是对应的层级

    我这里+2 是因为 1. 此处的层级也为索引 是从0开始的,而请求时是从1开始的

    2. 得到第一层的id 应该去请求的是第二层的数据 所以还要+1

    所以此处的处理逻辑和3差不多,只是多了一个切换 在对应的层级调用对应的接口

    请求后的操作也有所区别 ,例如请求得到的数据是直接去赋值替换 不是push添加

    再细节一点的地方就是: 发请求前 先把对应需要替换的值先赋值一个空值

    6. 完整代码

    1. // 1
    2. // 2
    3. <script>
    4. import { getAddressList} from '@/api/add-house/add-house.js'
    5. export default {
    6. data () {
    7. return {
    8. provinceList: [], // 地区列表
    9. province: [], //省数组
    10. city: [], //市数组
    11. district: [], //区数组
    12. street: [], //街道数组
    13. mulSelect: [], //四级联动显示数组,该数组的值为[[province],[city],[district],[street]]
    14. mulSelectId: [] ,// 四级联动的id
    15. provinceId: 110000, //省的id
    16. cityId: 110101, //市的id
    17. districtId: 110101001,//区的id
    18. streetId: '', // 镇/街道id
    19. address:''
    20. };
    21. },
    22. created() {
    23. this.getList('', '1')
    24. },
    25. methods: {
    26. // 获取地址列表
    27. async getList(id, level) {
    28. const data = {
    29. parentId: id,
    30. level: level
    31. }
    32. const res = await getAddressList(data)
    33. if (this.mulSelect.length !== 4) {
    34. if(level == 1) {
    35. this.province = res.data.data
    36. this.mulSelectId.push(res.data.data[0].id)
    37. this.mulSelect.push(this.province);
    38. this.getList(this.provinceId, '2')
    39. } else if (level == 2) {
    40. this.city = res.data.data
    41. this.mulSelectId.push(res.data.data[0].id)
    42. this.mulSelect.push(this.city);
    43. this.getList(this.cityId, '3')
    44. } else if (level == 3) {
    45. this.district = res.data.data
    46. this.mulSelectId.push(res.data.data[0].id)
    47. this.mulSelect.push(this.district);
    48. this.getList(this.districtId, '4')
    49. }
    50. // } else if (level == 4) {
    51. // this.street = res.data.data
    52. // this.mulSelectId.push(res.data.data[0].id)
    53. // this.mulSelect.push(this.street);
    54. // }
    55. } else {
    56. if(level == 1) {
    57. this.mulSelectId[0] = id
    58. this.getList(this.provinceId, '2')
    59. } else if (level == 2) {
    60. this.city = res.data.data
    61. this.cityId = res.data.data[0].id
    62. this.mulSelectId[0] = id
    63. this.mulSelect[1] = this.city;
    64. this.getList(this.cityId, '3')
    65. } else if (level == 3) {
    66. this.district = res.data.data
    67. this.districtId = res.data.data[0].id
    68. this.mulSelectId[1] = id
    69. this.mulSelect[2] = this.district;
    70. this.getList(this.districtId, '4')
    71. } else if (level == 4) {
    72. this.street = res.data.data
    73. this.streetId = res.data.data[0].id
    74. this.mulSelectId[2] = id
    75. this.mulSelectId[3] = this.streetId
    76. console.log(this.mulSelectId)
    77. this.mulSelect[3] = this.street;
    78. }
    79. }
    80. },
    81. // 选中的地址发生改变时触发
    82. pickerChange(e) {
    83. console.log(e,'change')
    84. //什么都不选的话,e.detail.value的值为[null,null,null,null]
    85. //只选择省的话,e.detail.value的值为[数字,null,null,null]
    86. //只选择市的话,e.detail.value的值为[数字,数字,null,null]
    87. //所以获取e.detail.value的值先判断是否为null,如果为null则取值为0
    88. for(var i=0;idetail.value.length;i++){
    89. if(e.detail.value[i]===null){
    90. e.detail.value[i]=0;
    91. }
    92. }
    93. var s_province=this.mulSelect[0][e.detail.value[0]];//获取选中的省
    94. var s_city=this.mulSelect[1][e.detail.value[1]||0];//获取选中的市
    95. var s_district=this.mulSelect[2][e.detail.value[2]||0];//获取选中的区
    96. if(this.mulSelect[3].length !== 0) {
    97. console.log(this.mulSelect)
    98. var s_street=this.mulSelect[3][e.detail.value[3]||0];//获取选中的街
    99. this.address=s_province.fullname+s_city.fullname+s_district.fullname+s_street.fullname;
    100. } else {
    101. this.address=s_province.fullname+s_city.fullname+s_district.fullname
    102. }
    103. //赋值显示在页面
    104. },
    105. // 地址改变触发
    106. colChange(e) {
    107. // console.log(e.detail);
    108. // console.log(this.mulSelect[0][e.detail.value])
    109. switch (e.detail.column){
    110. case 0://选择省
    111. this.mulSelect[1] =[]
    112. this.mulSelect[2] =[]
    113. this.mulSelect[3] =[]
    114. this.provinceId=this.mulSelect[0][e.detail.value].id;
    115. console.log(this.provinceId)
    116. this.getList(this.provinceId, e.detail.column+2 )
    117. break;
    118. case 1://选择市
    119. this.mulSelect[2] =[]
    120. this.mulSelect[3] =[]
    121. this.cityId = this.mulSelect[1][e.detail.value].id;
    122. this.getList(this.cityId, e.detail.column+2 )
    123. break;
    124. case 2://选择区
    125. this.mulSelect[3] =[]
    126. this.districtId = this.mulSelect[2][e.detail.value].id;
    127. this.getList(this.districtId, e.detail.column+2 )
    128. break;
    129. case 3://选择街道
    130. this.streetId = this.mulSelect[3][e.detail.value].id
    131. break;
    132. default:
    133. break;
    134. }
    135. },
    136. }
    137. script>

  • 相关阅读:
    Spring自带的这11个工具类,真香!
    netty 底层的工作原理
    【Flask使用】全知识md文档,4大部分60页第3篇:状态cookie和session保持
    前端技术koa/egg和es6入门
    JavaScript——APIs
    Eclipse中集成Tomcat
    mysql索引
    Matlab:字符向量元胞数组
    poi判断excel单元格内容是否为日期
    Seata0.7.1配合nacos实现分布式事务
  • 原文地址:https://blog.csdn.net/Anorry/article/details/132787117