CourseSelect.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <el-select
  3. v-model="selected"
  4. class="course-select"
  5. :placeholder="placeholder"
  6. filterable
  7. :clearable="clearable"
  8. :disabled="disabled"
  9. @change="select"
  10. >
  11. <el-option
  12. v-for="item in optionList"
  13. :key="item.code"
  14. :value="item.code"
  15. :label="item.name"
  16. >
  17. </el-option>
  18. </el-select>
  19. </template>
  20. <script>
  21. import { commonCourseQuery } from "../../modules/client/api";
  22. export default {
  23. name: "course-select",
  24. props: {
  25. disabled: { type: Boolean, default: false },
  26. placeholder: { type: String, default: "请选择" },
  27. value: { type: [Number, String], default: "" },
  28. clearable: { type: Boolean, default: true },
  29. filterData: {
  30. type: Object,
  31. default: null,
  32. },
  33. },
  34. data() {
  35. return {
  36. optionList: [],
  37. selected: "",
  38. };
  39. },
  40. watch: {
  41. value: {
  42. immediate: true,
  43. handler(val) {
  44. this.selected = val;
  45. },
  46. },
  47. filterData(val, oldval) {
  48. if (val !== oldval) {
  49. this.search();
  50. this.$emit("input", "");
  51. this.$emit("change", {});
  52. }
  53. },
  54. },
  55. async created() {
  56. this.search();
  57. },
  58. methods: {
  59. async search() {
  60. this.optionList = [];
  61. if (
  62. this.filterData &&
  63. (!this.filterData.semesterId || !this.filterData.examId)
  64. )
  65. return;
  66. const datas = this.filterData || {};
  67. const res = await commonCourseQuery(datas);
  68. this.optionList = res;
  69. },
  70. select() {
  71. this.$emit("input", this.selected);
  72. this.$emit(
  73. "change",
  74. this.optionList.find((item) => item.code === this.selected)
  75. );
  76. },
  77. },
  78. };
  79. </script>