teacher-list.tsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import OHeader from '@/components/o-header'
  2. import OPopup from '@/components/o-popup'
  3. import OSticky from '@/components/o-sticky'
  4. import { state } from '@/state'
  5. import { Button, Cell, CellGroup, Field, List, Image, Tag } from 'vant'
  6. import { defineComponent, onMounted, PropType, reactive, watch } from 'vue'
  7. import TeacherList from '../modal/teacher-list'
  8. import styles from './teacher-list.module.less'
  9. import iconTeacher from '@common/images/icon_teacher.png'
  10. import OEmpty from '@/components/o-empty'
  11. import request from '@/helpers/request'
  12. import OSearch from '@/components/o-search'
  13. export default defineComponent({
  14. name: 'teacher-list',
  15. props: {
  16. header: {
  17. // 是否显示头部
  18. type: Boolean,
  19. default: true
  20. },
  21. mode: {
  22. type: String as PropType<'fixed' | 'sticky'>,
  23. default: 'fixed'
  24. },
  25. subjectId: {
  26. type: String,
  27. default: ''
  28. }
  29. },
  30. emits: ['close', 'select'],
  31. setup(props, { slots, attrs, emit }) {
  32. const forms = reactive({
  33. teacherStatus: false,
  34. isLoad: false,
  35. list: [] as any,
  36. listState: {
  37. dataShow: true, // 判断是否有数据
  38. loading: false,
  39. finished: false
  40. },
  41. params: {
  42. keyword: null,
  43. subjectId: props.subjectId,
  44. page: 1,
  45. rows: 20
  46. }
  47. })
  48. const getList = async () => {
  49. try {
  50. if (forms.isLoad) return
  51. forms.isLoad = true
  52. const res = await request.post('/api-school/teacher/page', {
  53. data: {
  54. ...forms.params,
  55. schoolId: state.user.data.school.id
  56. }
  57. })
  58. forms.listState.loading = false
  59. const result = res.data || {}
  60. // 处理重复请求数据
  61. if (forms.list.length > 0 && result.current === 1) {
  62. return
  63. }
  64. const rows = result.rows || []
  65. rows.forEach((item: any) => {
  66. item.subjectNames = item.subjectName ? item.subjectName.split(',') : []
  67. })
  68. forms.list = forms.list.concat(rows)
  69. forms.listState.finished = result.current >= result.pages
  70. forms.params.page = result.current + 1
  71. forms.listState.dataShow = forms.list.length > 0
  72. forms.isLoad = false
  73. } catch {
  74. forms.listState.dataShow = false
  75. forms.listState.finished = true
  76. forms.isLoad = false
  77. }
  78. }
  79. // 搜索
  80. const onSearch = () => {
  81. forms.params.page = 1
  82. forms.list = []
  83. forms.listState.dataShow = true // 判断是否有数据
  84. forms.listState.loading = false
  85. forms.listState.finished = false
  86. getList()
  87. }
  88. const onSelect = (item: any) => {
  89. emit('close')
  90. emit('select', item)
  91. }
  92. // 声部变化时重新请求接口
  93. watch(
  94. () => props.subjectId,
  95. () => {
  96. forms.params.subjectId = props.subjectId
  97. onSearch()
  98. }
  99. )
  100. onMounted(() => {
  101. getList()
  102. })
  103. return () => (
  104. <div>
  105. <OSticky position="top" mode={props.mode}>
  106. {props.header && <OHeader title="选择老师" />}
  107. <OSearch
  108. inputBackground="white"
  109. background="#F8F8F8"
  110. placeholder="老师名称/手机号"
  111. onSearch={(val: any) => {
  112. forms.params.keyword = val
  113. onSearch()
  114. }}
  115. />
  116. </OSticky>
  117. {forms.listState.dataShow ? (
  118. <List
  119. v-model:loading={forms.listState.loading}
  120. finished={forms.listState.finished}
  121. finishedText=" "
  122. onLoad={getList}
  123. immediateCheck={false}
  124. >
  125. {forms.list.map((item: any) => (
  126. <Cell center class={styles.cellTeacher} onClick={() => onSelect(item)}>
  127. {{
  128. icon: () => <Image class={styles.img} src={item.avatar || iconTeacher} />,
  129. title: () => (
  130. <div class={styles.content}>
  131. <p class={styles.name}>{item.nickname}</p>
  132. <p class={styles.class}>
  133. {item.subjectNames &&
  134. item.subjectNames.map((subject: any) => (
  135. <Tag type="primary">{subject}</Tag>
  136. ))}
  137. </p>
  138. </div>
  139. )
  140. }}
  141. </Cell>
  142. ))}
  143. </List>
  144. ) : (
  145. <OEmpty btnStatus={false} classImgSize="SMALL" tips="暂无老师" />
  146. )}
  147. </div>
  148. )
  149. }
  150. })