|
@@ -0,0 +1,95 @@
|
|
|
+// 导入初始化样式
|
|
|
+import "@/assets/styles/base.css";
|
|
|
+
|
|
|
+// 导入 修改仓库的 dispatch,和获取仓库数据的 useSelector
|
|
|
+import { useDispatch, useSelector } from "react-redux";
|
|
|
+
|
|
|
+// 导入自己定义的 RootState 声明类型
|
|
|
+import { RootState } from "./store";
|
|
|
+
|
|
|
+// 导入自己定义的异步addNunAction
|
|
|
+import { addNunAction } from "./store/action/login";
|
|
|
+
|
|
|
+// 关于路由
|
|
|
+import React from "react";
|
|
|
+import { Router, Route, Switch, Redirect } from "react-router-dom";
|
|
|
+
|
|
|
+// 导入自己封装的 history
|
|
|
+import history from "./utils/history";
|
|
|
+
|
|
|
+// 导入自己封装的 鉴权路由
|
|
|
+import AuthRoute from "./components/AuthRoute";
|
|
|
+
|
|
|
+// 使用 React.lazy 懒加载页面
|
|
|
+const Layout = React.lazy(() => import("./pages/Layout"));
|
|
|
+const Login = React.lazy(() => import("./pages/Login"));
|
|
|
+const Home = React.lazy(() => import("./pages/Home"));
|
|
|
+
|
|
|
+function App() {
|
|
|
+ const dispatch = useDispatch();
|
|
|
+ return (
|
|
|
+ <div>
|
|
|
+ <h1>App总组件</h1>
|
|
|
+ {/* 点击这个按钮 控制 dispatch 来异步 修改仓库的 num 变量*/}
|
|
|
+ <button onClick={() => dispatch(addNunAction())}>点击+1</button>
|
|
|
+ <br />
|
|
|
+ <div onClick={() => history.push("/Login")}>去登录页</div>
|
|
|
+ <br />
|
|
|
+ <div onClick={() => history.push("/Layout")}>去Layout页面</div>
|
|
|
+ <br />
|
|
|
+ <div onClick={() => history.push("/Home")}>去Home页面</div>
|
|
|
+ <hr />
|
|
|
+ <Son1 />
|
|
|
+ <hr />
|
|
|
+ <Son2 />
|
|
|
+
|
|
|
+ {/* 关于路由 */}
|
|
|
+ {/* 这里需要把自己封装的 history 给第一级总路由器,不然项目中的路由信息会链接不上*/}
|
|
|
+ <Router history={history}>
|
|
|
+ {/* 使用了 React.lazy 需要定义一个加载中组件,这里我简单写一个。后面根据需求自己修改更好看的 加载中 组件*/}
|
|
|
+ <React.Suspense fallback={<div>加载中...</div>}>
|
|
|
+ {/* 使用 Switch 包裹路由,匹配到一个之后就不会往下匹配 */}
|
|
|
+ <Switch>
|
|
|
+ {/* 使用路由重定向,回到登录页 */}
|
|
|
+ <Redirect exact path="/" to="Login" />
|
|
|
+ {/* 普通路由,没有鉴权功能 */}
|
|
|
+ <Route path="/Login" component={Login} />
|
|
|
+ {/* 普通路由,没有鉴权功能 */}
|
|
|
+ <Route path="/Layout" component={Layout} />
|
|
|
+ {/* 鉴权路由,没有token,访问改路由,会重定向到 登录页面 */}
|
|
|
+ <AuthRoute path="/Home" component={Home} />
|
|
|
+ {/* 当所有路由匹配不到的时候显示 自己定义的 404 页面,这里我暂时没有定义 */}
|
|
|
+ {/* <Route path='*' component={NotFound} /> */}
|
|
|
+ </Switch>
|
|
|
+ </React.Suspense>
|
|
|
+ </Router>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+}
|
|
|
+
|
|
|
+const Son1 = function Son1() {
|
|
|
+ // 从仓库中获取响应式数据 num
|
|
|
+ const { num } = useSelector((state: RootState) => state.loginStore);
|
|
|
+ return (
|
|
|
+ <>
|
|
|
+ <h2>子组件1</h2>
|
|
|
+ <p>存在仓库的数字:{num}</p>
|
|
|
+ </>
|
|
|
+ );
|
|
|
+};
|
|
|
+
|
|
|
+const Son2 = function Son2() {
|
|
|
+ // 从仓库中获取响应式数据 num
|
|
|
+ const { num } = useSelector((state: RootState) => state.loginStore);
|
|
|
+
|
|
|
+ return (
|
|
|
+ <>
|
|
|
+ <h2>子组件2</h2>
|
|
|
+ <p>存在仓库的数字:{num}</p>
|
|
|
+ </>
|
|
|
+ );
|
|
|
+};
|
|
|
+
|
|
|
+const MemoApp = React.memo(App);
|
|
|
+
|
|
|
+export default MemoApp;
|