main.vue 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <template>
  2. <div class="select-area">
  3. <el-cascader
  4. :size="size || 'medium'"
  5. style="width: 100%"
  6. filterable
  7. clearable
  8. v-model="value"
  9. :props="props"
  10. @change="handleChange"
  11. ></el-cascader>
  12. </div>
  13. </template>
  14. <script>
  15. import asyncRequest from "@/apis/components/select-area";
  16. export default {
  17. name: "SelectArea",
  18. props: ["size", "value"],
  19. /**
  20. * 属性集合
  21. * @param {String} size : 组件大小 非必填
  22. * @param {Array} value : 选中值 必填
  23. */
  24. /**
  25. * 事件集合
  26. * @change : 选中值变化调用 抛出选中数据
  27. */
  28. data() {
  29. return {
  30. props: {
  31. lazy: true, //开启远程加载
  32. async lazyLoad(node, resolve) {
  33. const { level, value } = node;
  34. let list = [];
  35. let res = {};
  36. if (level === 0) {
  37. res = await asyncRequest.provinceList({});
  38. } else if (level === 1) {
  39. res = await asyncRequest.cityList({ code: value });
  40. } else {
  41. res = await asyncRequest.areaList({ code: value });
  42. }
  43. if (res && res.code === 0 && res.data) {
  44. let { data } = res;
  45. data.forEach((v1) => {
  46. let province = {
  47. value:
  48. level === 0
  49. ? v1.province_code
  50. : level === 1
  51. ? v1.city_code
  52. : v1.area_code,
  53. label: v1.name,
  54. leaf: level >= 2,
  55. };
  56. list.push(province);
  57. });
  58. resolve(list);
  59. } else {
  60. resolve([]);
  61. }
  62. },
  63. },
  64. };
  65. },
  66. methods: {
  67. handleChange(value) {
  68. this.$emit("change", value);
  69. },
  70. },
  71. };
  72. </script>
  73. <style>
  74. .select-area {
  75. display: inline-block;
  76. }
  77. </style>