CourseSelect.vue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <el-select
  3. v-model="selected"
  4. class="size-select"
  5. placeholder="请选择"
  6. @change="select"
  7. :style="styles"
  8. filterable
  9. remote
  10. :remote-method="search"
  11. clearable
  12. >
  13. <el-option
  14. v-for="item in optionList"
  15. :key="item.courseCode"
  16. :label="item.courseName"
  17. :value="item.courseCode"
  18. >
  19. <span>{{ item.courseName }}</span>
  20. </el-option>
  21. </el-select>
  22. </template>
  23. <script>
  24. import { searchCourses } from "@/api/examwork-course";
  25. export default {
  26. name: "CourseSelect",
  27. props: {
  28. value: String,
  29. examId: String,
  30. styles: { type: String, default: "width: 100px;" },
  31. },
  32. data() {
  33. return {
  34. optionList: [],
  35. selected: "",
  36. };
  37. },
  38. async created() {
  39. this.search();
  40. },
  41. watch: {
  42. value: {
  43. immediate: true,
  44. handler(val) {
  45. this.selected = val;
  46. },
  47. },
  48. examId() {
  49. this.search();
  50. },
  51. },
  52. methods: {
  53. async search(query) {
  54. const res = await searchCourses({
  55. examId: this.examId,
  56. courseName: query,
  57. pageNumber: 1,
  58. pageSize: 30,
  59. });
  60. this.optionList = res?.data.data.records;
  61. },
  62. select() {
  63. this.$emit("input", this.selected);
  64. this.$emit("change", this.selected);
  65. },
  66. },
  67. };
  68. </script>
  69. <style></style>