index.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. // console.log(searchVal,'searchVal')
  43. state.search = searchVal.search?searchVal.search:''
  44. state.subject = Number(props.searchVal.subject)?Number(props.searchVal.subject):''
  45. }
  46. )
  47. const getSubjectList = async () => {
  48. try {
  49. const res = await request.get(
  50. '/api-website/open/subject/subjectSelect',
  51. {}
  52. )
  53. state.subjectList = res.data
  54. } catch (e) {
  55. console.log(e)
  56. }
  57. }
  58. const startSearch = () => {
  59. conent.emit('startSearch', {
  60. search: state.search,
  61. subject: state.subject
  62. })
  63. }
  64. onMounted(() => {
  65. getSubjectList()
  66. })
  67. let classStyle
  68. props.isWhile ? (classStyle = white) : (classStyle = classes)
  69. return () => (
  70. <>
  71. <div class={[classStyle.wrap, props.isWhile ? 'While' : '']}>
  72. <ElInput
  73. clearable
  74. v-model={state.search}
  75. placeholder="搜一搜你想练习的曲目"
  76. class={classStyle.inputSelect}
  77. v-slots={{
  78. prepend: () => (
  79. <div class={classStyle.selectWrap}>
  80. <ElSelect
  81. clearable
  82. v-model={state.subject}
  83. placeholder="请选择声部"
  84. style="width: 115px"
  85. popper-class="subSelect"
  86. v-slots={{
  87. suffix: () => <div class={classStyle.san}></div>
  88. }}
  89. >
  90. {state.subjectList.map((item: any) => (
  91. <ElOption label={item.name} value={item.id} />
  92. ))}
  93. </ElSelect>
  94. <div class={classStyle.line}></div>
  95. </div>
  96. ),
  97. append: () => (
  98. <ElButton
  99. onClick={startSearch}
  100. v-slots={{
  101. icon: () => (
  102. <ElIcon class={classStyle.searchIcon}>
  103. <Search></Search>
  104. </ElIcon>
  105. )
  106. }}
  107. style={{ color: '#2DC7AA', font: '20px' }}
  108. />
  109. )
  110. }}
  111. ></ElInput>
  112. </div>
  113. </>
  114. )
  115. }
  116. })