index.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import TopCom from '@/components/TopCom'
  4. import classNames from 'classnames'
  5. import { A4LookType } from '../type'
  6. type Props = {
  7. info: A4LookType
  8. closeFu: () => void
  9. }
  10. function A4look({ info, closeFu }: Props) {
  11. const [topArr, setTopArr] = useState<string[]>([])
  12. const [topAc, setTopAc] = useState('')
  13. useEffect(() => {
  14. setTimeout(() => {
  15. if (sollrRef.current) sollrRef.current.scrollTo({ top: 0, behavior: 'smooth' })
  16. }, 100)
  17. }, [topAc])
  18. const txtChange = useCallback((val: string, key: 'txt' | 'flag') => {
  19. if (key === 'txt') {
  20. let txt = ''
  21. if (val) {
  22. let obj = JSON.parse(val)
  23. txt = obj.txtArr[0].txt
  24. }
  25. return txt
  26. } else if (key === 'flag') {
  27. const obj = JSON.parse(val)
  28. return !obj.isTxtFlag as boolean
  29. }
  30. }, [])
  31. useEffect(() => {
  32. let { introRtf, teamRtf, infoRtf } = info
  33. let introRtfFlag = txtChange(introRtf, 'flag')
  34. let teamRtfFlag = txtChange(teamRtf, 'flag')
  35. let infoRtfFlag = txtChange(infoRtf, 'flag')
  36. let arr: string[] = []
  37. if (introRtfFlag) arr.push('课程简介')
  38. if (teamRtfFlag) arr.push('教师简介')
  39. if (infoRtfFlag) arr.push('预约须知')
  40. setTopArr(arr)
  41. if (introRtfFlag) setTopAc('课程简介')
  42. else if (teamRtfFlag) setTopAc('教师简介')
  43. else if (infoRtfFlag) setTopAc('预约须知')
  44. }, [info, txtChange])
  45. const sollrRef = useRef<HTMLDivElement>(null)
  46. const txtRes = useMemo(() => {
  47. const obj = {
  48. 课程简介: txtChange(info.introRtf, 'txt'),
  49. 教师简介: txtChange(info.teamRtf, 'txt'),
  50. 预约须知: txtChange(info.infoRtf, 'txt')
  51. }
  52. return Reflect.get(obj, topAc)
  53. }, [info, topAc, txtChange])
  54. return (
  55. <div id='openDom' className={styles.A4look}>
  56. <TopCom txt='课程详情' backFu={closeFu} />
  57. <div className='A4Lmain'>
  58. <div className='A4Ltop'>
  59. {topArr.map(item => (
  60. <div
  61. onClick={() => setTopAc(item)}
  62. className={classNames('A4Ltrow', topAc === item ? 'A4LtrowAc' : '')}
  63. key={item}
  64. >
  65. {item}
  66. </div>
  67. ))}
  68. </div>
  69. <div className='A4Ltxt'>
  70. {txtRes ? (
  71. <div
  72. className='myTextBox'
  73. dangerouslySetInnerHTML={{ __html: txtRes }}
  74. ref={sollrRef}
  75. ></div>
  76. ) : null}
  77. </div>
  78. </div>
  79. </div>
  80. )
  81. }
  82. const MemoA4look = React.memo(A4look)
  83. export default MemoA4look