index.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { Search } from '@element-plus/icons-vue'
  2. import { defineComponent, toRefs, reactive, onMounted, ref, watch } from 'vue'
  3. import {
  4. ElButton,
  5. ElForm,
  6. ElFormItem,
  7. ElInput,
  8. ElSelect,
  9. ElOption,
  10. ElIcon
  11. } from 'element-plus'
  12. import white from './while.module.less'
  13. import classes from './index.module.less'
  14. import request from '@/helpers/request'
  15. export default defineComponent({
  16. name: 'searchInput',
  17. props: {
  18. title: {
  19. type: String,
  20. default: ''
  21. },
  22. isWhile: {
  23. type: Boolean,
  24. default: true
  25. },
  26. searchVal: {
  27. type: Object,
  28. default: {}
  29. }
  30. },
  31. emits: ['startSearch'],
  32. setup(props, conent) {
  33. const state = reactive({
  34. title: props.title,
  35. search: props.searchVal.search,
  36. subject: null as null | number | string,
  37. subjectList: []
  38. })
  39. watch(
  40. () => props.searchVal,
  41. searchVal => {
  42. state.search = searchVal.search?searchVal.search:''
  43. state.subject = Number(props.searchVal.subject)?Number(props.searchVal.subject):''
  44. }
  45. )
  46. const getSubjectList = async () => {
  47. try {
  48. const res = await request.get(
  49. '/api-website/open/subject/subjectSelect',
  50. {}
  51. )
  52. state.subjectList = res.data
  53. } catch (e) {
  54. console.log(e)
  55. }
  56. }
  57. const startSearch = () => {
  58. conent.emit('startSearch', {
  59. search: state.search,
  60. subject: state.subject
  61. })
  62. }
  63. onMounted(() => {
  64. getSubjectList()
  65. })
  66. let classStyle
  67. props.isWhile ? (classStyle = white) : (classStyle = classes)
  68. return () => (
  69. <>
  70. <div class={[classStyle.wrap, props.isWhile ? 'While' : '']}>
  71. <ElInput
  72. clearable
  73. v-model={state.search}
  74. placeholder="搜一搜你想练习的曲目"
  75. class={classStyle.inputSelect}
  76. v-slots={{
  77. prepend: () => (
  78. <div class={classStyle.selectWrap}>
  79. <ElSelect
  80. clearable
  81. v-model={state.subject}
  82. placeholder="请选择声部"
  83. style="width: 115px"
  84. popper-class="subSelect"
  85. v-slots={{
  86. suffix: () => <div class={classStyle.san}></div>
  87. }}
  88. >
  89. {state.subjectList.map((item: any) => (
  90. <ElOption label={item.name} value={item.id} />
  91. ))}
  92. </ElSelect>
  93. <div class={classStyle.line}></div>
  94. </div>
  95. ),
  96. append: () => (
  97. <ElButton
  98. onClick={startSearch}
  99. v-slots={{
  100. icon: () => (
  101. <ElIcon class={classStyle.searchIcon}>
  102. <Search></Search>
  103. </ElIcon>
  104. )
  105. }}
  106. style={{ color: '#2DC7AA', font: '20px' }}
  107. />
  108. )
  109. }}
  110. ></ElInput>
  111. </div>
  112. </>
  113. )
  114. }
  115. })