index.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import React, { useMemo, useState } from "react";
  2. import styles from "./index.module.scss";
  3. import classNames from "classnames";
  4. import { baseUrl } from "@/index";
  5. import { useSelector } from "react-redux";
  6. import { RootState } from "@/store";
  7. import history from "@/utils/history";
  8. function A1Home() {
  9. const { dianOut, dianIn } = useSelector(
  10. (state: RootState) => state.A0Layout.dataAll.home
  11. );
  12. const [mapShow, setMapShow] = useState(false);
  13. const hoverData = useMemo(() => {
  14. const arr = dianOut.map((v) => ({ name: v.name, id: v.id, ...v.hover }));
  15. return arr;
  16. }, [dianOut]);
  17. // 鼠标移入的变量
  18. const [hoverAc, setHoverAc] = useState(0);
  19. return (
  20. <div
  21. className={styles.A1Home}
  22. style={{ backgroundImage: `url(${baseUrl}/A1Home/pc/bg.jpg)` }}
  23. >
  24. {/* 图标定位 */}
  25. {dianOut.map((v) => (
  26. <div
  27. className={classNames(
  28. "A1locBox",
  29. hoverAc === v.id ? "A1locBoxHide" : ""
  30. )}
  31. key={v.id}
  32. style={{ top: v.top, left: v.left, right: v.right, bottom: v.bottom }}
  33. >
  34. {/* 名字 */}
  35. <div className="A1locBoxName">{v.name}</div>
  36. {/* 标点 */}
  37. <div className="A1locBoxLoc"></div>
  38. </div>
  39. ))}
  40. {/* hover出来的定位 */}
  41. {hoverData.map((v) => (
  42. <div
  43. className={classNames("A1locHover")}
  44. onMouseEnter={() => setHoverAc(v.id)}
  45. onMouseLeave={() => setHoverAc(0)}
  46. onClick={() => history.push(`/village?id=${v.id}`)}
  47. key={v.id}
  48. style={{
  49. backgroundImage: `url(${baseUrl}/A1Home/pc/hover${v.id}.png)`,
  50. width: v.width,
  51. height: v.height,
  52. top: v.top,
  53. left: v.left,
  54. }}
  55. >
  56. <div>
  57. <div>{v.name}</div>
  58. </div>
  59. </div>
  60. ))}
  61. {/* 左下角的开发保护 */}
  62. <div className="A1leftBtn" onClick={() => setMapShow(true)}>
  63. 开发保护
  64. </div>
  65. {/* 开发保护 */}
  66. <div
  67. className={classNames("A1mapBox", mapShow ? "A1mapBoxShow" : "")}
  68. style={{ backgroundImage: `url(${baseUrl}/A1Home/pc/map.jpg)` }}
  69. >
  70. {/* 主要内容 */}
  71. {dianIn.map((v) => (
  72. <div
  73. className="A1mapRow"
  74. key={v.id}
  75. style={{
  76. top: v.top,
  77. left: v.left,
  78. right: v.right,
  79. bottom: v.bottom,
  80. }}
  81. >
  82. <div className="A1mapRowDian"></div>
  83. <p>{v.name}</p>
  84. {/* 信息盒子 */}
  85. {v.txtLoc ? (
  86. <div
  87. className="A1mapTxt"
  88. style={{
  89. top: v.txtLoc.top,
  90. left: v.txtLoc.left,
  91. right: v.txtLoc.right,
  92. bottom: v.txtLoc.bottom,
  93. }}
  94. >
  95. <div>
  96. <h3>历史事件</h3>
  97. <div className="A1mapXian"></div>
  98. <p>{v.txt}</p>
  99. </div>
  100. </div>
  101. ) : null}
  102. </div>
  103. ))}
  104. {/* 返回按钮 */}
  105. <div className="A1back" onClick={() => setMapShow(false)}></div>
  106. </div>
  107. </div>
  108. );
  109. }
  110. const MemoA1Home = React.memo(A1Home);
  111. export default MemoA1Home;