index.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { baseURL, myData } from '@/utils/http'
  4. import history from '@/utils/history'
  5. import classNames from 'classnames'
  6. import B3txt from './B3txt'
  7. function B3yun() {
  8. // 一级图标id
  9. const [ac1, setAc1] = useState(0)
  10. useEffect(() => {
  11. ac2FlagRef.current = true
  12. setAc2('')
  13. }, [ac1])
  14. // 热点点位数组
  15. const hotArr = useMemo(() => {
  16. if (myData.yun.iconArr[ac1 - 1]) return myData.yun.iconArr[ac1 - 1].dian || []
  17. else return []
  18. }, [ac1])
  19. // 是否进入二级状态
  20. const ac2Time = useRef(-1)
  21. const ac2FlagRef = useRef(true)
  22. const [ac2, setAc2] = useState('')
  23. // 图片的放大和位移
  24. const [imgChange, setImgChange] = useState('')
  25. const setAc2Fu = useCallback(
  26. (id: string) => {
  27. if (!ac2FlagRef.current) return
  28. setAc2(id)
  29. // 控制图片放大
  30. const chage = hotArr.find(v => v.id === id)?.change
  31. if (chage) setImgChange(chage)
  32. // else setImgChange('')
  33. ac2FlagRef.current = false
  34. clearTimeout(ac2Time.current)
  35. ac2Time.current = window.setTimeout(() => {
  36. ac2FlagRef.current = true
  37. setImgChange('')
  38. setAc2('')
  39. }, 4000)
  40. },
  41. [hotArr]
  42. )
  43. return (
  44. <div className={styles.B3yun} style={{ backgroundImage: `url(${baseURL + myData.yun.bjImg})` }}>
  45. {/* 左侧主体 */}
  46. <div className='yunll' style={{ pointerEvents: ac2 ? 'none' : 'auto' }}>
  47. {/* 主要 */}
  48. <div className='yunllCon'>
  49. <div
  50. className='yunll1'
  51. style={{ backgroundImage: `url(${baseURL}yun/di.jpg)`, transform: imgChange }}
  52. >
  53. {/* 高亮白色盒子 */}
  54. {ac1 > 0 ? (
  55. <div
  56. style={{ backgroundImage: `url(${baseURL}yun/liang${ac1}.png)` }}
  57. className={classNames('yunll1Ac', ac2 ? 'yunll1AcHide' : '')}
  58. >
  59. {/* 点 */}
  60. {hotArr.map(v => (
  61. <div
  62. className='yunDian'
  63. onClick={() => setAc2Fu(v.id)}
  64. key={v.id}
  65. style={{ top: v.loc.top, left: v.loc.left }}
  66. >
  67. <img src={`${baseURL}yun/hot.png`} alt='' />
  68. </div>
  69. ))}
  70. </div>
  71. ) : null}
  72. {/* 二级别高亮 */}
  73. <div className={classNames('yunAc2Box', ac2 ? 'yunAc2BoxAc' : '')}>
  74. {ac2 ? <img className='yunShan' src={`${baseURL}yun/${ac2}.png`} alt='' /> : null}
  75. </div>
  76. {/* {ac1 > 0 && ac2 ? <div className=''></div> : null} */}
  77. </div>
  78. </div>
  79. <div className='yunll2'>
  80. {myData.yun.iconArr.map(item => (
  81. <div
  82. onClick={() => setAc1(item.id)}
  83. className={classNames('yunll2Row', ac1 === item.id ? 'yunll2RowAc' : '')}
  84. key={item.id}
  85. title={item.title}
  86. ></div>
  87. ))}
  88. </div>
  89. </div>
  90. {/* 右侧文字 */}
  91. <div className='yunrr' style={{ pointerEvents: ac2 ? 'none' : 'auto' }}>
  92. <div className='yunrr1'>
  93. <h2>{myData.yun.name}</h2>
  94. <div style={{ backgroundImage: `url(${baseURL}yun/titLiang.png)` }}>{myData.yun.tit}</div>
  95. </div>
  96. <div className='yunrr2'>
  97. <div>
  98. <B3txt ac1={ac1} ac2={ac2} setAc2Fu={val => setAc2Fu(val)} />
  99. </div>
  100. </div>
  101. </div>
  102. {/* 右下角的图标 */}
  103. <div className='yunBtn'>
  104. <div
  105. className='yunBtn1 hoverD'
  106. title='仙居世界'
  107. onClick={() => history.push('/hots')}
  108. ></div>
  109. <div className='yunBtn2 hoverD' title='返回' onClick={() => history.go(-1)}></div>
  110. </div>
  111. </div>
  112. )
  113. }
  114. const MemoB3yun = React.memo(B3yun)
  115. export default MemoB3yun