index.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import React, { useEffect, useState, useRef } from 'react'
  2. import styles from './index.module.scss'
  3. import Zback from '@/components/Zback'
  4. import { useSelector } from 'react-redux'
  5. import { RootState } from '@/store'
  6. import lian1 from '@/assets/img/frame_lian1.png'
  7. import lian2 from '@/assets/img/frame_lian2.png'
  8. import bei1 from '@/assets/img/frame_bei1.png'
  9. import bei2 from '@/assets/img/frame_bei2.png'
  10. type ActiveItem = 'lian1' | 'lian2' | 'bei1' | 'bei2' | 'normal'
  11. function Shufa({ setIsShowShufa }: { setIsShowShufa: (isShowShufa: boolean) => void }) {
  12. const [showName, setName] = useState('shufa1')
  13. const [activeItem, setActiveItem] = useState<ActiveItem>('normal')
  14. const timerRef = useRef<NodeJS.Timeout | null>(null)
  15. const { myData, myLangue } = useSelector((state: RootState) => state.A0Layout)
  16. const Line = ({ index }: { index: number }) => {
  17. return (
  18. <div className={index % 2 !== 0 ? styles.shufaLine1 : styles.shufaLine2}>
  19. <div className='leftLine'>
  20. <div className='dot'>●</div>
  21. </div>
  22. <div className='rightLine'>
  23. <div className='dot'>●</div>
  24. </div>
  25. </div>
  26. )
  27. }
  28. useEffect(() => {
  29. if (timerRef.current) {
  30. clearTimeout(timerRef.current)
  31. }
  32. const delayMap = {
  33. lian1: 5000,
  34. lian2: 4000,
  35. bei1: 4000,
  36. bei2: 4000
  37. }
  38. if (activeItem && activeItem !== 'normal' && delayMap.hasOwnProperty(activeItem)) {
  39. timerRef.current = setTimeout(() => {
  40. setActiveItem('normal')
  41. // 定时器执行后清空 ref
  42. timerRef.current = null
  43. }, delayMap[activeItem])
  44. }
  45. return () => {
  46. if (timerRef.current) {
  47. clearTimeout(timerRef.current)
  48. }
  49. }
  50. }, [activeItem])
  51. const backClick = () => {
  52. if (showName === 'shufa2') {
  53. setActiveItem('normal')
  54. setName('shufa1')
  55. }
  56. if (showName === 'shufa1') setIsShowShufa(false)
  57. }
  58. return (
  59. <div className={styles.shufa} style={{ zIndex: showName === 'shufa1' ? 3 : 4 }}>
  60. <Zback clickFu={backClick} />
  61. <div
  62. className='shufa1'
  63. style={{
  64. opacity: showName === 'shufa1' ? 1 : 0,
  65. pointerEvents: showName === 'shufa1' ? 'auto' : 'none'
  66. }}
  67. >
  68. <div className='sLeft'>
  69. <div className='zi' onClick={() => setName('shufa2')}>
  70. <img src={require('@/assets/img/A2_shufa_lian.png')} alt='' />
  71. </div>
  72. <div className='zi' onClick={() => setName('shufa2')}>
  73. <img src={require('@/assets/img/A2_shufa_bei.png')} alt='' />
  74. </div>
  75. <div className='leftTxt1'>{myData?.shufa?.lIntro}</div>
  76. </div>
  77. <div className='sRight'>
  78. <div className='rightTitle1 songFont'>{myData?.shufa?.rIntro}</div>
  79. <div className='rightTitleLine1' />
  80. <div className='rightIntro'>
  81. {myData?.shufa?.rItems?.map((item, index) => (
  82. <div className='rightItem' key={index}>
  83. <div className='rLabel'>{item?.label}</div>
  84. <div className='rtext'>{item?.txt}</div>
  85. </div>
  86. ))}
  87. </div>
  88. <div className='rightTxt1'>{myData?.shufa?.rTxt}</div>
  89. <div className='shufa1Btn songFont' onClick={() => setName('shufa2')}>
  90. 字形赏析
  91. </div>
  92. </div>
  93. <Line index={1} />
  94. <Line index={2} />
  95. </div>
  96. <div
  97. className='shufa2'
  98. style={{
  99. opacity: showName === 'shufa2' ? 1 : 0,
  100. pointerEvents: showName === 'shufa2' ? 'auto' : 'none'
  101. }}
  102. >
  103. {/* 琏 */}
  104. <div className='lianContainer'>
  105. <div className='zicontent'>
  106. {myData?.shufa2?.lian?.map((item, index) => (
  107. <div
  108. className={`txtitem ${activeItem === `lian${index}` ? 'txtitemAc' : ''}`}
  109. key={index}
  110. onClick={() =>
  111. index > 0 && index < 3 && setActiveItem(`lian${index}` as ActiveItem)
  112. }
  113. >
  114. <div className='txt' dangerouslySetInnerHTML={{ __html: item }} />
  115. <div
  116. className='icon'
  117. style={{ visibility: index === 0 || index === 3 ? 'hidden' : 'visible' }}
  118. >
  119. <img src={require('@/assets/img/A7base3_icon.png')} alt='' />
  120. </div>
  121. </div>
  122. ))}
  123. </div>
  124. <div className={`zi1`}>
  125. <img
  126. className={activeItem}
  127. src={
  128. activeItem === 'lian1'
  129. ? lian1
  130. : activeItem === 'lian2'
  131. ? lian2
  132. : require('@/assets/img/A2_shufa_lian.png')
  133. }
  134. alt=''
  135. />
  136. </div>
  137. </div>
  138. {/* 碑 */}
  139. <div className='beiContainner'>
  140. <div className={`zi2 ${activeItem}`}>
  141. <img
  142. className={activeItem}
  143. src={
  144. activeItem === 'bei1'
  145. ? bei1
  146. : activeItem === 'bei2'
  147. ? bei2
  148. : require('@/assets/img/A2_shufa_bei.png')
  149. }
  150. alt=''
  151. />
  152. </div>
  153. <div className='zicontent'>
  154. {myData?.shufa2?.bei?.map((item, index) => (
  155. <div
  156. className={`txtitem ${activeItem === `bei${index}` ? 'txtitemAc' : ''}`}
  157. key={index}
  158. onClick={() => index > 0 && index < 3 && setActiveItem(`bei${index}` as ActiveItem)}
  159. >
  160. <div
  161. className='icon'
  162. style={{ visibility: index === 0 || index === 3 ? 'hidden' : 'visible' }}
  163. >
  164. <img src={require('@/assets/img/A7base3_icon.png')} alt='' />
  165. </div>
  166. <div className='txt' dangerouslySetInnerHTML={{ __html: item }} />
  167. </div>
  168. ))}
  169. </div>
  170. </div>
  171. </div>
  172. </div>
  173. )
  174. }
  175. const MemoShufa = React.memo(Shufa)
  176. export default MemoShufa