当前位置:   article > 正文

uniapp内置组件pick完成省市区三级联动_pick组件和数据库

pick组件和数据库

1.模板渲染及事件绑定

  1. <uni-forms-item label="地址" name="address">
  2. <picker mode="multiSelector" :range="areaData" range-key="name" :value="multiIndex"
  3. @change="pickerChange" @columnchange="pickerColumnchange">
  4. <view class="myarea">{{select}}</view>
  5. </picker>
  6. </uni-forms-item>

说明: mode="multiSelector" 表示多列选择(省、市、区), :range="areaData" 表示省市区相应的数据源, range-key="name" 表示数据源中的数据是数组包对象,则使用该属性绑定对象中的属性名渲染到页面中(本数据[{id:1, name:'北京',pid:1000}]);  :value="multiIndex"表示省市区选中的索引;@columnchange="pickerColumnchange" 表示绑定切换省市区时触发的事件; @change="pickerChange" 表示选择完成后确定事件; <view class="myarea">{{select}}</view> 表示选择后的结果

2.相应的数据源和变量准备(本次使用的是vue3语法糖)

  1. <script setup>
  2. import {reactive,ref} from 'vue'
  3. const areaData = ref([[],[],[]]) // 是一个二维数组,二维数组中的第一个数组为省的数据,第二个为市的数据,第三个为区的数据
  4. const pdata = ref([]) // 省数据
  5. const cdata = ref({}) // 市数据
  6. const adata = ref({}) // 区数据
  7. const multiIndex = ref([0, 0, 0]) // 选择省市区后的索引,默认为第一个索引
  8. const select = ref('请选择地区') // 省市区选择后的结果,默认为请选择地区
  9. </script>

3.页面加载后请求省市区数据源

  1. const getArea = async () => {
  2. let pro = await uni.$http.get(`获取省数据接口地址`) // 所有省的数据接口
  3. let city = await uni.$http.get(`获取市数据接口地址`) // 所有市的数据接口
  4. let area = await uni.$http.get(`获取区数据接口地址`) // 所有区的数据接口
  5. pdata.value = pro.data.msg // 在变量中保存省的数据
  6. cdata.value = city.data.msg // 在变量中保存市的数据
  7. adata.value = area.data.msg // 在变量中保存区的数据
  8. areaData.value[0] = pdata.value // 把省的数据添加到数据源的第一个位置
  9. areaData.value[1] = cdata.value[pdata.value[0].pid] // 通过把第一个省的id把市的数据添加到数据源的第二个位置
  10. areaData.value[2] = adata.value[cdata.value[pdata.value[0].pid][0].pid] // 通过把第一个省的id且把它应下第一个市的id找到,把区的数据添加到数据源的第三个位置
  11. }
  12. getArea()
  13. // 省的数据结构如下:
  14. [
  15. {
  16. "id": 1,
  17. "name": "北京市",
  18. "pid": "110000"
  19. },
  20. {
  21. "id": 2,
  22. "name": "天津市",
  23. "pid": "120000"
  24. },
  25. {
  26. "id": 3,
  27. "name": "河北省",
  28. "pid": "130000"
  29. },
  30. {
  31. "id": 4,
  32. "name": "山西省",
  33. "pid": "140000"
  34. }
  35. ]
  36. // 市的数据结构如下:
  37. {
  38. "110000": [
  39. {
  40. "id": 1,
  41. "name": "市辖区",
  42. "pid": "110100"
  43. },
  44. {
  45. "id": 2,
  46. "name": "县",
  47. "pid": "110200"
  48. }
  49. ],
  50. "120000": [
  51. {
  52. "id": 3,
  53. "name": "市辖区",
  54. "pid": "120100"
  55. },
  56. {
  57. "id": 4,
  58. "name": "县",
  59. "pid": "120200"
  60. }
  61. ],
  62. "130000": [
  63. {
  64. "id": 5,
  65. "name": "石家庄市",
  66. "pid": "130100"
  67. },
  68. {
  69. "id": 6,
  70. "name": "唐山市",
  71. "pid": "130200"
  72. },
  73. {
  74. "id": 7,
  75. "name": "秦皇岛市",
  76. "pid": "130300"
  77. },
  78. {
  79. "id": 8,
  80. "name": "邯郸市",
  81. "pid": "130400"
  82. },
  83. {
  84. "id": 9,
  85. "name": "邢台市",
  86. "pid": "130500"
  87. },
  88. {
  89. "id": 10,
  90. "name": "保定市",
  91. "pid": "130600"
  92. },
  93. {
  94. "id": 11,
  95. "name": "张家口市",
  96. "pid": "130700"
  97. },
  98. {
  99. "id": 12,
  100. "name": "承德市",
  101. "pid": "130800"
  102. },
  103. {
  104. "id": 13,
  105. "name": "沧州市",
  106. "pid": "130900"
  107. },
  108. {
  109. "id": 14,
  110. "name": "廊坊市",
  111. "pid": "131000"
  112. },
  113. {
  114. "id": 15,
  115. "name": "衡水市",
  116. "pid": "131100"
  117. }
  118. ]
  119. }
  120. // 区的数据结构如下:
  121. {
  122. 110100: [{
  123. id: 1,
  124. name: "东城区"
  125. }, {
  126. id: 2,
  127. name: "西城区"
  128. }, {
  129. id: 3,
  130. name: "崇文区"
  131. }, {
  132. id: 4,
  133. name: "宣武区"
  134. }, …],
  135. }
  136. 110100
  137. : [{
  138. id: 1,
  139. name: "东城区"
  140. }, {
  141. id: 2,
  142. name: "西城区"
  143. }, {
  144. id: 3,
  145. name: "崇文区"
  146. }, {
  147. id: 4,
  148. name: "宣武区"
  149. }, …]
  150. 110200
  151. : [{
  152. id: 17,
  153. name: "密云县"
  154. }, {
  155. id: 18,
  156. name: "延庆县"
  157. }]
  158. 120100
  159. : [{
  160. id: 19,
  161. name: "和平区"
  162. }, {
  163. id: 20,
  164. name: "河东区"
  165. }, {
  166. id: 21,
  167. name: "河西区"
  168. }, {
  169. id: 22,
  170. name: "南开区"
  171. }, …],
  172. }

4.切换省市区数据时,对应数据改变

  1. const pickerColumnchange = (e) => {
  2. // 第几列滑动
  3. console.log("第几列滑动 = " + e.detail.column)
  4. // 第几列滑动选中的下标
  5. console.log("第几列滑动选中的下标 = " + JSON.stringify(e.detail.value))
  6. // 第一列滑动
  7. if (e.detail.column == 0) {
  8. // 滑动的是第一列:省 滑动省需要改变市和区的数据
  9. multiIndex.value[0] = e.detail.value // 第一个位置把选中的省索引存储起来
  10. // 重新绑定市的数据
  11. console.log(cdata.value[pdata.value[e.detail.value].pid]);
  12. areaData.value[1] = cdata.value[pdata.value[e.detail.value].pid]
  13. areaData.value[2] = adata.value[cdata.value[pdata.value[e.detail.value].pid][0].pid] // 重新绑定区的数据
  14. } else if (e.detail.column == 1) {
  15. // 滑动第二列是市的数据:市改变只需要改变区的数据
  16. multiIndex.value[1] = e.detail.value // 第二个位置把选中的市索引存储起来
  17. areaData.value[2] = adata.value[areaData.value[1][e.detail.value].pid]
  18. } else {
  19. multiIndex.value[2] = e.detail.value // 第三个位置把选中的区索引存储起来
  20. }
  21. }

5.选好省市区确定事件

  1. const pickerChange = (e) => {
  2. console.log('picker发送选择改变,携带值为', e.detail)
  3. multiIndex.value = e.detail.value
  4. // 根据获取的索引找到对应的名称赋值给select渲染到页面中
  5. select.value = areaData.value[0][multiIndex.value[0]].name + ' ' + areaData.value[1][multiIndex.value[1]].name + ' ' + areaData.value[2][multiIndex.value[2]].name
  6. }

6.最终效果图

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/571118
推荐阅读
相关标签
  

闽ICP备14008679号