index.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React, { useCallback, useEffect, useState } from "react";
  2. import styles from "./index.module.scss";
  3. import Lazyimg from "react-lazyimg-component";
  4. import { baseURL } from "@/utils/http";
  5. import imgLoding from "@/assets/img/loading.gif";
  6. import imgErr from "@/assets/img/IMGerror.png";
  7. import { EyeOutlined } from "@ant-design/icons";
  8. import { useDispatch } from "react-redux";
  9. type Props = {
  10. width?: number | string;
  11. height?: number;
  12. src: string;
  13. noLook?: boolean;
  14. offline?: boolean;
  15. };
  16. function ImageLazy({
  17. width = 100,
  18. height = 100,
  19. src,
  20. noLook,
  21. offline = false,
  22. }: Props) {
  23. const dispatch = useDispatch();
  24. // 图片占位符
  25. const [placeholderUrl, setPlaceholderUrl] = useState(
  26. src ? imgLoding : imgErr
  27. );
  28. // 默认不能预览图片,加载成功之后能预览
  29. const [lookImg, setLookImg] = useState(false);
  30. useEffect(() => {
  31. if (src) {
  32. // 进页面查看图片的加载情况
  33. // 创建一个img标签
  34. const imgDom = document.createElement("img");
  35. imgDom.src = offline ? src : baseURL + src;
  36. // 不管图片加载成功或者失败,都删除掉,提高性能
  37. // 图片加载成功
  38. imgDom.onload = function () {
  39. setLookImg(true);
  40. imgDom.remove();
  41. };
  42. // 图片加载失败
  43. imgDom.onerror = function () {
  44. setPlaceholderUrl(imgErr);
  45. imgDom.remove();
  46. };
  47. return () => {
  48. // 离开页面也删掉掉元素
  49. imgDom.remove();
  50. };
  51. }
  52. }, [offline, src]);
  53. // 点击预览图片
  54. const lookBigImg = useCallback(() => {
  55. dispatch({
  56. type: "login/lookBigImg",
  57. payload: { url: offline ? src : baseURL + src, show: true },
  58. });
  59. }, [dispatch, offline, src]);
  60. return (
  61. <div className={styles.ImageLazy} style={{ width: width, height: height }}>
  62. <div className="lazyBox">
  63. <Lazyimg
  64. src={src ? (offline ? src : baseURL + src) : ""}
  65. width={width}
  66. height={height}
  67. placeholder={placeholderUrl}
  68. alt=""
  69. />
  70. {/* 图片预览 */}
  71. {noLook || !lookImg ? null : (
  72. <div className="lookImg" onClick={lookBigImg}>
  73. <EyeOutlined />
  74. &nbsp;
  75. <div>预览</div>
  76. </div>
  77. )}
  78. </div>
  79. </div>
  80. );
  81. }
  82. const MemoImageLazy = React.memo(ImageLazy);
  83. export default MemoImageLazy;