CourseSelect.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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}(${item.code})`"
  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. defaultSelect: { type: Boolean, default: false },
  34. },
  35. data() {
  36. return {
  37. optionList: [],
  38. selected: "",
  39. };
  40. },
  41. watch: {
  42. value: {
  43. immediate: true,
  44. handler(val) {
  45. this.selected = val;
  46. },
  47. },
  48. filterData(val, oldval) {
  49. if (val && oldval) {
  50. const vse = `${val.semesterId}-${val.examId}`;
  51. const oldvse = `${oldval.semesterId}-${oldval.examId}`;
  52. if (vse !== oldvse) {
  53. this.search();
  54. this.$emit("input", "");
  55. this.$emit("change", {});
  56. }
  57. return;
  58. }
  59. if (val !== oldval) {
  60. this.search();
  61. this.$emit("input", "");
  62. this.$emit("change", {});
  63. }
  64. },
  65. },
  66. async created() {
  67. this.search();
  68. },
  69. methods: {
  70. async search() {
  71. this.optionList = [];
  72. if (
  73. this.filterData &&
  74. (!this.filterData.semesterId || !this.filterData.examId)
  75. )
  76. return;
  77. const datas = this.filterData || {};
  78. const res = await commonCourseQuery(datas);
  79. this.optionList = res;
  80. if (this.defaultSelect && !this.value) this.selectDefault();
  81. },
  82. select() {
  83. this.$emit("input", this.selected);
  84. this.$emit(
  85. "change",
  86. this.optionList.find((item) => item.code === this.selected)
  87. );
  88. },
  89. selectDefault() {
  90. const defaultData = this.optionList[0];
  91. if (defaultData) {
  92. this.selected = defaultData.code;
  93. this.select();
  94. this.$emit("default-selected", defaultData);
  95. }
  96. },
  97. },
  98. };
  99. </script>