select-sned.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import OSticky from '@/components/o-sticky'
  2. import { useRect } from '@vant/use'
  3. import { Button, Sticky, Tab, Tabs } from 'vant'
  4. import { defineComponent, onMounted, reactive, ref, watch } from 'vue'
  5. import ClassList from './component/class-list'
  6. import ManageList from './component/manage-list'
  7. import StudentList from './component/student-list'
  8. import TeacherList from './component/teacher-list/teacher-list'
  9. import styles from './index.module.less'
  10. export default defineComponent({
  11. name: 'select-send',
  12. props: {
  13. selectList: {
  14. type: Object,
  15. default: () => ({})
  16. },
  17. selectStatus: {
  18. type: Boolean,
  19. default: false
  20. }
  21. },
  22. emits: ['close', 'confirm', 'update:selectList'],
  23. setup(props, { emit }) {
  24. const state = reactive({
  25. height: 'auto' as any,
  26. bottomHeight: 0,
  27. tabValue: 'class',
  28. selectClass: [] as any,
  29. selectStudent: [] as any,
  30. selectTeacher: [] as any,
  31. selectManage: [] as any
  32. })
  33. const onSubmit = async () => {
  34. const params = {
  35. class: state.selectClass,
  36. student: state.selectStudent,
  37. teacher: state.selectTeacher,
  38. school: state.selectManage
  39. }
  40. emit('close')
  41. emit('update:selectList', params)
  42. emit('confirm', params)
  43. }
  44. watch(
  45. () => props.selectList,
  46. () => {
  47. console.log('watch', props.selectList)
  48. resetSelectItems()
  49. },
  50. { deep: true }
  51. )
  52. const resetSelectItems = () => {
  53. const list = props.selectList || {}
  54. state.selectClass = list.class || []
  55. state.selectTeacher = list.teacher || []
  56. state.selectManage = list.school || []
  57. state.selectStudent = list.student || []
  58. }
  59. onMounted(() => {
  60. const { height } = useRect(document.querySelector('.van-tab') as HTMLElement)
  61. state.height = height
  62. resetSelectItems()
  63. console.log(state, 'select')
  64. })
  65. return () => (
  66. <div
  67. class={styles.orchestraDetail}
  68. style={{ background: '#f6f6f6', minHeight: '100vh' }}
  69. id="select-send-message"
  70. >
  71. <Tabs sticky lineWidth={20} lineHeight={4} v-model:active={state.tabValue}>
  72. <Tab title="班级列表" name="class">
  73. <ClassList
  74. height={state.height}
  75. bottomHeight={state.bottomHeight}
  76. v-model:selectItem={state.selectClass}
  77. />
  78. </Tab>
  79. <Tab title="学员列表" name="student">
  80. <StudentList
  81. height={state.height}
  82. bottomHeight={state.bottomHeight}
  83. v-model:selectItem={state.selectStudent}
  84. />
  85. </Tab>
  86. <Tab title="伴学指导" name="teacher">
  87. <TeacherList
  88. height={state.height}
  89. bottomHeight={state.bottomHeight}
  90. v-model:selectItem={state.selectTeacher}
  91. />
  92. </Tab>
  93. <Tab title="管理老师" name="manage">
  94. <ManageList
  95. height={state.height}
  96. bottomHeight={state.bottomHeight}
  97. v-model:selectItem={state.selectManage}
  98. />
  99. </Tab>
  100. </Tabs>
  101. <OSticky
  102. position="bottom"
  103. onGetHeight={(height: any) => {
  104. state.bottomHeight = height
  105. }}
  106. >
  107. <div class={'btnGroup'}>
  108. <Button round block type="primary" onClick={onSubmit}>
  109. 确认
  110. </Button>
  111. </div>
  112. </OSticky>
  113. </div>
  114. )
  115. }
  116. })