index.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { defineComponent, onMounted, ref, watch } 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. // 变化时
  22. watch(
  23. () => props.studentItem,
  24. () => {
  25. if (props.studentItem && props.studentItem.userId) {
  26. radioChecked.value = props.studentItem.userId;
  27. }
  28. }
  29. );
  30. onMounted(() => {
  31. if (props.studentItem && props.studentItem.userId) {
  32. radioChecked.value = props.studentItem.userId;
  33. }
  34. });
  35. return () => (
  36. <div>
  37. <div class={styles.popupTitle}>选择学生</div>
  38. <RadioGroup class={styles.selectStudent} v-model={radioChecked.value}>
  39. {props.list.map((item: any) => (
  40. <div
  41. class={[
  42. styles.cell,
  43. radioChecked.value === item.userId && styles.cellSelected
  44. ]}
  45. onClick={() => {
  46. radioChecked.value = item.userId;
  47. emit('confirm', item);
  48. emit('close');
  49. }}>
  50. <Radio name={item.userId}>
  51. {{
  52. icon: (props: any) => (
  53. <Image
  54. class={styles.iconImage}
  55. src={props.checked ? checkBoxActive : checkBoxDefault}
  56. />
  57. )
  58. }}
  59. </Radio>
  60. <div class={styles.userInfo}>
  61. <Image src={item.avatar} class={styles.userImg} fit="cover" />
  62. <div class={styles.usernames}>
  63. <div class={styles.name}>{item.nickname}</div>
  64. {item.schoolName && (
  65. <div class={styles.schoolname}>{item.schoolName}</div>
  66. )}
  67. </div>
  68. </div>
  69. </div>
  70. ))}
  71. </RadioGroup>
  72. <div class={styles.addStudentBtn}>
  73. <Button
  74. block
  75. color="linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)"
  76. onClick={() => {
  77. //
  78. radioChecked.value = null;
  79. emit('confirm', {});
  80. emit('close');
  81. }}>
  82. <i class={styles.iconAdd}></i>
  83. <span>新增学生</span>
  84. </Button>
  85. </div>
  86. </div>
  87. );
  88. }
  89. });