RemoteSelect.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. :loading="loading"
  11. @change="selectItem"
  12. @focus="getSelectList"
  13. >
  14. <el-option
  15. v-for="item in options"
  16. :key="item.key"
  17. :label="item.value"
  18. :value="{ value: item.value, key: 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. 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. loading.value = true;
  53. let res = await api[props.api]({
  54. ...props.params,
  55. term: term.target.value,
  56. });
  57. if (res.data.status == 0) {
  58. options.value = res.data.result;
  59. } else {
  60. options.value = [];
  61. }
  62. loading.value = false;
  63. },
  64. 1000,
  65. { leading: true }
  66. );
  67. let options = ref([]);
  68. const selectItem = (item) => {
  69. emit("selectItem", item);
  70. };
  71. onMounted(() => {});
  72. return {
  73. getSelectList,
  74. selectItem,
  75. options,
  76. loading,
  77. };
  78. },
  79. };
  80. </script>
  81. <style></style>