index.tsx 4.3 KB

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