index.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { defineComponent, onMounted, ref } from 'vue';
  2. import styles from './index.module.less';
  3. import { Button, Cell, Icon, Image, Radio, RadioGroup } from 'vant';
  4. import checkBoxActive from '../../images/new/icon-n-1.png';
  5. import checkBoxDefault from '../../images/new/icon-n-2.png';
  6. export default defineComponent({
  7. name: 'select-student',
  8. props: {
  9. list: {
  10. type: Array,
  11. default: () => []
  12. },
  13. studentItem: {
  14. type: Object,
  15. default: () => ({})
  16. }
  17. },
  18. emits: ['close', 'confirm'],
  19. setup(props, { emit }) {
  20. const radioChecked = ref();
  21. onMounted(() => {
  22. if (props.studentItem && props.studentItem.userId) {
  23. radioChecked.value = props.studentItem.userId;
  24. }
  25. });
  26. return () => (
  27. <div>
  28. <div class={styles.popupTitle}>选择学生</div>
  29. <RadioGroup class={styles.selectStudent} v-model={radioChecked.value}>
  30. {props.list.map((item: any) => (
  31. <div
  32. class={[
  33. styles.cell,
  34. radioChecked.value === item.userId && styles.cellSelected
  35. ]}
  36. onClick={() => {
  37. radioChecked.value = item.userId;
  38. emit('confirm', item);
  39. emit('close');
  40. }}>
  41. <Radio name={item.userId}>
  42. {{
  43. icon: (props: any) => (
  44. <Image
  45. class={styles.iconImage}
  46. src={props.checked ? checkBoxActive : checkBoxDefault}
  47. />
  48. )
  49. }}
  50. </Radio>
  51. <div class={styles.userInfo}>
  52. <Image src={item.avatar} class={styles.userImg} fit="cover" />
  53. <div class={styles.usernames}>
  54. <div class={styles.name}>{item.nickname}</div>
  55. {item.schoolName && (
  56. <div class={styles.schoolname}>{item.schoolName}</div>
  57. )}
  58. </div>
  59. </div>
  60. </div>
  61. ))}
  62. </RadioGroup>
  63. <div class={styles.addStudentBtn}>
  64. <Button
  65. block
  66. color="linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)"
  67. onClick={() => {
  68. //
  69. radioChecked.value = null;
  70. emit('confirm', {});
  71. emit('close');
  72. }}>
  73. <i class={styles.iconAdd}></i>
  74. <span>新增学生</span>
  75. </Button>
  76. </div>
  77. </div>
  78. );
  79. }
  80. });