RemoteSelect.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <template>
  2. <el-select
  3. filterable
  4. :multiple="multiple"
  5. :multiple-limit="multiple ? 0 : 1"
  6. remote
  7. clearable
  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="{ value: item.key, key: item.value }"
  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. multiple: {
  43. type: Boolean,
  44. default: false,
  45. },
  46. },
  47. emits: ["selectItem"],
  48. setup(props, { emit }) {
  49. let loading = ref(true);
  50. const getSelectList = _.debounce(
  51. async (term) => {
  52. if (!term) return;
  53. loading.value = true;
  54. let res = await api[props.api]({
  55. ...props.params,
  56. term,
  57. });
  58. if (res.data.status == 0) {
  59. options.value = res.data.result;
  60. } else {
  61. options.value = [];
  62. }
  63. loading.value = false;
  64. },
  65. 1000,
  66. { leading: true }
  67. );
  68. let options = ref([]);
  69. const selectItem = (item) => {
  70. emit("selectItem", item);
  71. };
  72. onMounted(() => {});
  73. return {
  74. getSelectList,
  75. selectItem,
  76. options,
  77. loading,
  78. };
  79. },
  80. };
  81. </script>
  82. <style></style>