main.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <div class="select-goodsClass">
  3. <el-cascader
  4. v-if="!loading"
  5. :size="size || 'medium'"
  6. style="width: 100%"
  7. filterable
  8. clearable
  9. v-model="value"
  10. :placeholder="placeholder || ''"
  11. :props="props"
  12. :disabled="disabled"
  13. @change="handleChange"
  14. ></el-cascader>
  15. </div>
  16. </template>
  17. <script>
  18. import asyncRequest from "@/apis/components/goods-class";
  19. import resToken from "@/mixins/resToken";
  20. import { isArray } from "@/utils/validate";
  21. export default {
  22. name: "goodClass",
  23. mixins: [resToken],
  24. props: ["size", "value", "placeholder", "isDetail", "disabled"],
  25. /**
  26. * 属性集合
  27. * @param {String} size : 组件大小 非必填
  28. * @param {Array} value : 选中值 必填
  29. * @param {String} placeholder : 提示信息 非必填
  30. * @param {Boolean} isDetail : 是否是详情逻辑 必填
  31. * @param {Boolean} disabled : 是否禁用 必填
  32. */
  33. /**
  34. * 事件集合
  35. * @searchChange : 选中值变化调用 抛出选中数据
  36. */
  37. data() {
  38. return {
  39. loading: false,
  40. props: {
  41. lazy: true, //开启远程加载
  42. async lazyLoad(node, resolve) {
  43. // console.log(node);
  44. const { level, value, root, loading } = node;
  45. let model = {
  46. cat_name: "",
  47. pid: "",
  48. status: "",
  49. };
  50. let list = [];
  51. if (level === 0) {
  52. model.pid = "0";
  53. } else {
  54. model.pid = value;
  55. }
  56. const res = await asyncRequest.list(model);
  57. const { code, data } = res;
  58. if (code === 0) {
  59. data.forEach((v1) => {
  60. let province = {
  61. value: v1.id,
  62. label: v1.cat_name,
  63. leaf: level >= 2,
  64. };
  65. list.push(province);
  66. });
  67. resolve(list);
  68. } else {
  69. resolve([]);
  70. }
  71. },
  72. },
  73. };
  74. },
  75. // watch: {
  76. // // value: function (val, old) {
  77. // // if (val) {
  78. // // this.loading = true;
  79. // // setTimeout(() => {
  80. // // this.loading = false;
  81. // // }, 10);
  82. // // }
  83. // // },
  84. // },
  85. mounted() {
  86. this.options = [];
  87. // this.getInfo();
  88. this.selectLoading = false;
  89. },
  90. methods: {
  91. handleChange(value) {
  92. this.$emit("handleChange", value);
  93. },
  94. async selectChange(e) {
  95. if (e && e.length > 0) {
  96. let index = this.options.findIndex((v) => v.code === e[0]);
  97. if (index !== -1) {
  98. this.$emit("searchChange", this.options[index]);
  99. } else {
  100. this.$emit("searchChange", {});
  101. }
  102. } else {
  103. this.$emit("searchChange", {});
  104. }
  105. },
  106. delChild(list) {
  107. let arr = [];
  108. list.forEach((v) => {
  109. let sitem = JSON.parse(JSON.stringify(v));
  110. if (isArray(sitem.child) && sitem.child.length === 0) {
  111. delete sitem["child"];
  112. } else if (isArray(sitem.child) && sitem.child.length > 0) {
  113. sitem.child = this.delChild(sitem.child);
  114. }
  115. arr.push(sitem);
  116. });
  117. return arr;
  118. },
  119. async getInfo() {
  120. this.selectLoading = true;
  121. let res = await asyncRequest.list({});
  122. if (res && res.code === 0 && res.data) {
  123. let arr = res.data;
  124. let list = [];
  125. list = this.delChild(arr);
  126. this.options = list;
  127. } else if (res && res.code >= 100 && res.code <= 104) {
  128. await this.logout();
  129. } else {
  130. this.$message.warning(res.message);
  131. }
  132. this.selectLoading = false;
  133. },
  134. },
  135. };
  136. </script>
  137. <style lang="scss" scoped>
  138. .select-goodsClass {
  139. .loading-input {
  140. background-color: transparent;
  141. border: 1px solid #dfe4ed;
  142. color: #c0c4cc;
  143. width: 100%;
  144. height: 36px;
  145. line-height: 36px;
  146. padding: 0 30px 0 12px;
  147. border-radius: 4px;
  148. &.disabled {
  149. background-color: #f5f7fa;
  150. }
  151. span {
  152. font-size: 16px;
  153. height: 36px;
  154. line-height: 36px;
  155. padding: 0 0 0 3px;
  156. vertical-align: top;
  157. }
  158. }
  159. }
  160. </style>