RemoteSelect.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <template>
  2. <el-select
  3. v-model="value"
  4. filterable
  5. :multiple="multiple"
  6. :multiple-limit="multiple ? 0 : 1"
  7. remote
  8. reserve-keyword
  9. :placeholder="placeholder"
  10. :remote-method="getSelectList"
  11. :loading="loading"
  12. @change="selectItem"
  13. >
  14. <el-option
  15. v-for="item in options"
  16. :key="item.key"
  17. :label="item.value"
  18. :value="item.key"
  19. />
  20. </el-select>
  21. </template>
  22. <script>
  23. import { onMounted, ref } from "vue";
  24. import api from "../apis/fetch";
  25. import _ from "lodash";
  26. export default {
  27. props: {
  28. placeholder: {
  29. type: String,
  30. default: "请填写",
  31. },
  32. size: {
  33. type: String,
  34. default: "small",
  35. },
  36. clearable: {
  37. type: Boolean,
  38. default: true,
  39. },
  40. api: String,
  41. params: Object,
  42. value: [String, Number, Array],
  43. multiple: {
  44. type: Boolean,
  45. default: false,
  46. },
  47. },
  48. emits: ["selectItem"],
  49. setup(props, { emit }) {
  50. let loading = ref(true);
  51. const getSelectList = _.debounce(
  52. async (term) => {
  53. if (!term) return;
  54. loading.value = true;
  55. let res = await api[props.api]({
  56. ...props.params,
  57. term,
  58. });
  59. if (res.data.status == 0) {
  60. options.value = res.data.result;
  61. } else {
  62. options.value = [];
  63. }
  64. loading.value = false;
  65. },
  66. 1000,
  67. { leading: true }
  68. );
  69. let options = ref([]);
  70. const selectItem = (item) => {
  71. emit("selectItem", item);
  72. };
  73. onMounted(() => {});
  74. return {
  75. getSelectList,
  76. selectItem,
  77. options,
  78. loading,
  79. };
  80. },
  81. };
  82. </script>
  83. <style></style>