|
@@ -1,67 +1,86 @@
|
|
-import React, { useEffect, useMemo, useRef, useState } from "react";
|
|
|
|
|
|
+import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
import styles from "./index.module.scss";
|
|
import styles from "./index.module.scss";
|
|
import classNames from "classnames";
|
|
import classNames from "classnames";
|
|
import { envUrl } from "@/utils/env";
|
|
import { envUrl } from "@/utils/env";
|
|
-import { maoData2, mapData1 } from "./data";
|
|
|
|
|
|
+import { imgLodingFu, maoData2, mapData1 } from "./data";
|
|
import iconImg1 from "@/assets/img/map/icon1.png";
|
|
import iconImg1 from "@/assets/img/map/icon1.png";
|
|
import iconImg1Ac from "@/assets/img/map/icon1Ac.png";
|
|
import iconImg1Ac from "@/assets/img/map/icon1Ac.png";
|
|
import iconImg2 from "@/assets/img/map/icon2.png";
|
|
import iconImg2 from "@/assets/img/map/icon2.png";
|
|
import iconImg2Ac from "@/assets/img/map/icon2Ac.png";
|
|
import iconImg2Ac from "@/assets/img/map/icon2Ac.png";
|
|
|
|
+import MapSon from "./MapSon";
|
|
|
|
+import { useSelector } from "react-redux";
|
|
|
|
+import { RootState } from "@/store";
|
|
|
|
+import { domShowFu } from "@/utils/domShow";
|
|
|
|
|
|
type Props = {
|
|
type Props = {
|
|
type: number;
|
|
type: number;
|
|
|
|
+ sonChaneType: (val: number) => void;
|
|
};
|
|
};
|
|
|
|
|
|
-function A0Map({ type }: Props) {
|
|
|
|
- const [videoInd, setVidoeInd] = useState(true);
|
|
|
|
|
|
+function A0Map({ type, sonChaneType }: Props) {
|
|
|
|
+ // 进页面显示加载中
|
|
|
|
+ useEffect(() => {
|
|
|
|
+ domShowFu("#AsyncSpinLoding", true);
|
|
|
|
+ }, []);
|
|
|
|
|
|
- const [moveInd, setMoveInd] = useState(0);
|
|
|
|
|
|
+ // 一级地图 图片的加载
|
|
|
|
+ const imgLodingArr = useSelector(
|
|
|
|
+ (state: RootState) => state.A0layout.imgLodingArr
|
|
|
|
+ );
|
|
|
|
|
|
- // 30个动画帧div
|
|
|
|
- const moveDiv = useMemo(() => {
|
|
|
|
- const arr = [];
|
|
|
|
-
|
|
|
|
- for (let i = 0; i <= 30; i++) {
|
|
|
|
- arr.push(
|
|
|
|
- <div
|
|
|
|
- className={classNames("videoRow", moveInd === i ? "videoRowAc" : "")}
|
|
|
|
- key={i}
|
|
|
|
- >
|
|
|
|
- <img src={`${envUrl}/yunMove/yan_${i}.png`} alt="" />
|
|
|
|
- </div>
|
|
|
|
- );
|
|
|
|
|
|
+ // 控制二级地图的显示
|
|
|
|
+ const [mapSon, setMapSon] = useState(0);
|
|
|
|
+
|
|
|
|
+ // 大图片是否已经加载完
|
|
|
|
+ const isImgLodingFu = useCallback(() => {
|
|
|
|
+ let flag = false;
|
|
|
|
+
|
|
|
|
+ if (imgLodingArr.includes(mapSon)) {
|
|
|
|
+ domShowFu("#AsyncSpinLoding", false);
|
|
|
|
+ flag = true;
|
|
}
|
|
}
|
|
- return arr;
|
|
|
|
- }, [moveInd]);
|
|
|
|
|
|
|
|
- const moveTime = useRef(-1);
|
|
|
|
|
|
+ return flag;
|
|
|
|
+ }, [imgLodingArr, mapSon]);
|
|
|
|
|
|
- useEffect(() => {
|
|
|
|
- if (videoInd) {
|
|
|
|
|
|
+ // 开场动画帧的变化
|
|
|
|
+ const [moveInd, setMoveInd] = useState(0);
|
|
|
|
+ const moveTime = useRef(-1);
|
|
|
|
+ const moveYun = useCallback(() => {
|
|
|
|
+ if (!isImgLodingFu()) {
|
|
clearInterval(moveTime.current);
|
|
clearInterval(moveTime.current);
|
|
let num = 0;
|
|
let num = 0;
|
|
moveTime.current = window.setInterval(() => {
|
|
moveTime.current = window.setInterval(() => {
|
|
setMoveInd(num);
|
|
setMoveInd(num);
|
|
num++;
|
|
num++;
|
|
- if (num > 30) {
|
|
|
|
|
|
+ if (num > 30 || isImgLodingFu()) {
|
|
clearInterval(moveTime.current);
|
|
clearInterval(moveTime.current);
|
|
- setVidoeInd(false);
|
|
|
|
}
|
|
}
|
|
}, 50);
|
|
}, 50);
|
|
}
|
|
}
|
|
|
|
+ }, [isImgLodingFu]);
|
|
|
|
+
|
|
|
|
+ useEffect(() => {
|
|
|
|
+ moveYun();
|
|
|
|
|
|
return () => {
|
|
return () => {
|
|
clearInterval(moveTime.current);
|
|
clearInterval(moveTime.current);
|
|
};
|
|
};
|
|
- }, [videoInd]);
|
|
|
|
|
|
+ }, [moveYun]);
|
|
|
|
+
|
|
|
|
+ // 鼠标hover
|
|
|
|
+ const [isHover, setIsHover] = useState(0);
|
|
|
|
|
|
return (
|
|
return (
|
|
<div className={styles.A0Map}>
|
|
<div className={styles.A0Map}>
|
|
{/* 开场动画帧 */}
|
|
{/* 开场动画帧 */}
|
|
<div
|
|
<div
|
|
- className={classNames("videoBoxMove", !videoInd ? "videoBoxHide" : "")}
|
|
|
|
|
|
+ className={classNames(
|
|
|
|
+ "videoBoxMove",
|
|
|
|
+ isImgLodingFu() ? "videoBoxHide" : ""
|
|
|
|
+ )}
|
|
>
|
|
>
|
|
- {moveDiv}
|
|
|
|
|
|
+ <img src={`${envUrl}/yunMove/yan_${moveInd}.png`} alt="" />
|
|
</div>
|
|
</div>
|
|
|
|
|
|
{/* 一级地图 */}
|
|
{/* 一级地图 */}
|
|
@@ -74,6 +93,12 @@ function A0Map({ type }: Props) {
|
|
{/* 定位大图标 */}
|
|
{/* 定位大图标 */}
|
|
{mapData1.map((v) => (
|
|
{mapData1.map((v) => (
|
|
<div
|
|
<div
|
|
|
|
+ onMouseEnter={() => setIsHover(v.id)}
|
|
|
|
+ onMouseLeave={() => setIsHover(0)}
|
|
|
|
+ onClick={() => {
|
|
|
|
+ setMapSon(v.id);
|
|
|
|
+ sonChaneType(2);
|
|
|
|
+ }}
|
|
key={v.id}
|
|
key={v.id}
|
|
className="A0iconBox"
|
|
className="A0iconBox"
|
|
style={{ top: v.y, left: v.x, zIndex: v.ind }}
|
|
style={{ top: v.y, left: v.x, zIndex: v.ind }}
|
|
@@ -84,7 +109,12 @@ function A0Map({ type }: Props) {
|
|
<img className="iconImg2" src={iconImg1Ac} alt="" />
|
|
<img className="iconImg2" src={iconImg1Ac} alt="" />
|
|
|
|
|
|
{/* 文字标题 */}
|
|
{/* 文字标题 */}
|
|
- <div className="txtBox">
|
|
|
|
|
|
+ <div
|
|
|
|
+ className="txtBox"
|
|
|
|
+ hidden={
|
|
|
|
+ (isHover === 2 && v.id === 1) || (isHover === 1 && v.id === 2)
|
|
|
|
+ }
|
|
|
|
+ >
|
|
<div>{v.name}</div>
|
|
<div>{v.name}</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
@@ -103,6 +133,11 @@ function A0Map({ type }: Props) {
|
|
{/* 定位小图标 */}
|
|
{/* 定位小图标 */}
|
|
{maoData2.map((v) => (
|
|
{maoData2.map((v) => (
|
|
<div
|
|
<div
|
|
|
|
+ onClick={() => {
|
|
|
|
+ window.open(v.link);
|
|
|
|
+ // setMapSon(v.id);
|
|
|
|
+ sonChaneType(3);
|
|
|
|
+ }}
|
|
key={v.id}
|
|
key={v.id}
|
|
className={classNames(
|
|
className={classNames(
|
|
"A0iconSmBox",
|
|
"A0iconSmBox",
|
|
@@ -140,13 +175,29 @@ function A0Map({ type }: Props) {
|
|
))}
|
|
))}
|
|
|
|
|
|
<div className="mapBac">
|
|
<div className="mapBac">
|
|
- <img src={`${envUrl}/map/1.jpg`} alt="" />
|
|
|
|
|
|
+ <img
|
|
|
|
+ onLoad={() => imgLodingFu(0)}
|
|
|
|
+ src={`${envUrl}/map/0.jpg`}
|
|
|
|
+ alt=""
|
|
|
|
+ />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
- <div className="yunBox">
|
|
|
|
|
|
+
|
|
|
|
+ {/* 二级地图 */}
|
|
|
|
+ {mapSon ? <MapSon sId={mapSon} /> : null}
|
|
|
|
+
|
|
|
|
+ {/* <div className="yunBox">
|
|
<div className="yunSon1"></div>
|
|
<div className="yunSon1"></div>
|
|
<div className="yunSon2"></div>
|
|
<div className="yunSon2"></div>
|
|
- </div>
|
|
|
|
|
|
+ <div className="yunSon3"></div>
|
|
|
|
+ </div> */}
|
|
|
|
+
|
|
|
|
+ {/* 左下角的返回 */}
|
|
|
|
+ {mapSon ? (
|
|
|
|
+ <div className="sonToBack" onClick={() => setMapSon(0)}>
|
|
|
|
+ <img src={`${envUrl}/map/map${mapSon}.png`} alt="" />
|
|
|
|
+ </div>
|
|
|
|
+ ) : null}
|
|
</div>
|
|
</div>
|
|
);
|
|
);
|
|
}
|
|
}
|