RouteWrapper.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import React, {useMemo, useState, useEffect, useRef} from 'react';
  2. import Popup from "@components/Popup";
  3. import { useNavigate } from 'react-router-dom';
  4. import {ROUTE_TYPE_FULL, ROUTE_TYPE_IN, ROUTE_TYPE_POP, ROUTE_TYPE_POP_OR_FULL} from "@constants/routes";
  5. import {useThemeProvider} from "@contexts/themeContext";
  6. import SubScreen from "@components/SubScreen";
  7. import useScrollLock from "@hooks/useScrollLock";
  8. import {useLocation} from "react-router";
  9. const i18n=global.i18n;
  10. const RouteWrapper = (props) => {
  11. const {isMobile} = useThemeProvider();
  12. const { Comp, route} = props;
  13. const navigate = useNavigate()
  14. const {pathname,hash} = useLocation();
  15. const setLock=(isLocked)=>{
  16. if (isLocked) {
  17. document.documentElement.classList.add('no-scroll');
  18. } else {
  19. document.documentElement.classList.remove('no-scroll');
  20. }
  21. }
  22. useEffect(() => {
  23. if (route){
  24. if (route.type===ROUTE_TYPE_IN||route.type===ROUTE_TYPE_FULL)setLock(false);
  25. else setLock(true);
  26. }
  27. }, [pathname,hash]);
  28. /** useMemo 缓存query,避免每次生成生的query */
  29. const renderIn=()=>{
  30. let isexit=false;
  31. if (Comp!=null)isexit=true;
  32. return (
  33. <>
  34. {
  35. isexit?<Comp pageID={route.id} {...props} />:<></>
  36. }
  37. </>
  38. );
  39. }
  40. const handleClose = () => {
  41. navigate(-1);
  42. }
  43. const renderPop=()=>{
  44. let comp=(<></>);
  45. // if (Comp!=null)comp=Comp;
  46. if (Comp!=null)comp=<Comp pageID={route.id} {...props} />;
  47. // return(
  48. // <Popup pageID={route.id} open={true} onClose={handleClose}>
  49. // <div className="pop_content">
  50. // {comp}
  51. // </div>
  52. // </Popup>
  53. // )
  54. return (
  55. <div className="pop_content">
  56. {comp}
  57. </div>
  58. )
  59. }
  60. const renderSub=()=>{
  61. let comp=(<></>);
  62. // const renderComp=(extra)=>{
  63. // if (Comp!=null){
  64. // return (<Comp pageID={route.id} {...extra} />)
  65. // }
  66. // else return (<></>);
  67. // }
  68. if (Comp!=null)comp=<Comp pageID={route.id} {...props} />;
  69. // return (
  70. // <SubScreen route={route} onClose={handleClose} open={true} renderComp={renderComp}>
  71. // {comp}
  72. // </SubScreen>
  73. // )
  74. return (
  75. <>
  76. {comp}
  77. </>
  78. )
  79. }
  80. const renderPopOrFull=()=>{
  81. return (
  82. <>
  83. {
  84. isMobile()?renderSub():renderPop()
  85. }
  86. </>
  87. )
  88. }
  89. const renderComp=()=>{
  90. let comp=(<></>);
  91. if (route.type===ROUTE_TYPE_FULL||route.type===ROUTE_TYPE_IN){
  92. comp=renderIn();
  93. }
  94. else if (route.type===ROUTE_TYPE_POP_OR_FULL){
  95. comp=renderPopOrFull();
  96. }
  97. else if (route.type===ROUTE_TYPE_POP){
  98. comp=renderPop();
  99. }
  100. return comp;
  101. }
  102. return (
  103. renderComp()
  104. );
  105. };
  106. export default RouteWrapper;