CourseSelect.vue 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. <span>{{ `${item.name}(${item.code})` }}</span>
  18. </el-option>
  19. </el-select>
  20. </template>
  21. <script>
  22. import { commonCourseQuery } from "../../modules/base/api";
  23. export default {
  24. name: "course-select",
  25. props: {
  26. disabled: { type: Boolean, default: false },
  27. placeholder: { type: String, default: "请选择" },
  28. value: { type: [Number, String], default: "" },
  29. clearable: { type: Boolean, default: true },
  30. filterData: {
  31. type: Object,
  32. default() {
  33. return {
  34. paperArchivesId: "",
  35. semesterId: ""
  36. };
  37. }
  38. }
  39. },
  40. data() {
  41. return {
  42. optionList: [],
  43. selected: ""
  44. };
  45. },
  46. watch: {
  47. value: {
  48. immediate: true,
  49. handler(val) {
  50. this.selected = val;
  51. }
  52. },
  53. filterData(val, oldval) {
  54. if (val !== oldval) {
  55. this.search();
  56. this.$emit("input", "");
  57. this.$emit("change", {});
  58. }
  59. }
  60. },
  61. async created() {
  62. this.search();
  63. },
  64. methods: {
  65. async search() {
  66. const res = await commonCourseQuery({
  67. ...this.filterData
  68. });
  69. this.optionList = res;
  70. },
  71. select() {
  72. this.$emit("input", this.selected);
  73. this.$emit(
  74. "change",
  75. this.optionList.find(item => item.code === this.selected)
  76. );
  77. }
  78. }
  79. };
  80. </script>