react v18 +react-redux v6 +react-router-dom v6实现动态添加路由(路由表根据后端返回)

react v18 + ts +react-router-dom v6 +react redux v8 如何实现动态路由,我的想法是,在一开始有一个登录的路由,保证可以正常进入,然后,登录时会调用一个后端接口,返回其他路由,然后我保存在react redux里面,并且从react redux读取出去,添加到当前的路由表中。当然每次刷新页面的时候会重新调用后端路由接口,保证路由一直存在,并且只有登录状态就是判断token是否存在,才能访问接口传来的路由,如果不是登录状态就跳转登录

//模拟接口返回路由
const routers = [
  {
    path: "/Bbb",
    element: "Bbb",
    //权限信息
    mate: {
      add: true,
      del:false
    },
  },
  {
    path: "/Home",
    element: "Home",
    mate: {
      add: true,
    },
  },
  {
    path: "/Aaa",
    element: "Aaa",
  },
]

这是app.tsx 

function App() {
  const location = useLocation()
  //获取react-redux中的保存的路由
  const routes = useSelector((state: any) => state.route)
  const dispatch = useDispatch()
  //切换页面时调用
  useEffect(() => {
    //取消请求
    requestManager.cancelAllRequests()
    if (routes) {
      //模拟刷新路由丢失重新请求
      dispatch({ type: "addRoute", data: routers })
    }
    return () => {
      // 在组件卸载时执行清理操作(可选)
    }
  }, [location])

  return (
    <Routes>
      <Route
        path="/"
        element={
          <Appraisal>
            <Home />
          </Appraisal>
        }
      ></Route>
      <Route path="/Login" element={<Login />}></Route>
      {routes.map((rou: { path: string | undefined; element: string }) => {
        return (
          <Route
            key={rou.path}
            path={rou.path}
            element={
              <React.Suspense fallback={<div>Loading...</div>}>
                {/*
                  调用 startTransition 函数来处理悬挂的更新
                */}
                <Appraisal>{lazyLoad(rou.element)}</Appraisal>
              </React.Suspense>
            }
          ></Route>
        )
      })}
      {/* 默认路由,重定向到登录页面 */}
      <Route
        path="/*"
        element={
          <React.Suspense fallback={<div>Loading...</div>}>
            <Appraisal>
              {/*
                在这里进行登录状态的判断,并根据需要进行重定向
              */}
              {checkLoginStatus() ? <Home /> : <Login />}
            </Appraisal>
          </React.Suspense>
        }
      ></Route>
    </Routes>
  )
}

function checkLoginStatus() {
  // 假设你有一个名为 `isLoggedIn` 的状态来表示登录状态
  const isLoggedIn = sessionStorage.getItem("token")
  return isLoggedIn
}
export default App

这是登录

const Login = () => {
  const navigate = useNavigate()
  const dispatch = useDispatch()

  const routers = [
    {
      path: "/Bbb",
      element: "Bbb",
      mate: {
        auth: true,
      },
    },
    {
      path: "/Home",
      element: "Home",
      mate: {
        auth: true,
      },
    },
    {
      path: "/Aaa",
      element: "Aaa",
    },
  ]
  const addNum = async () => {
    const data = {
      pt_account: "aaaa",
      pt_pwd: "123456",
    }
    const res = await PostLogin(data)
    if (res.data.code == 200) {
      //保存token
      sessionStorage.setItem("token", res.data.token)
      //保存路由
      dispatch({ type: "addRoute", data: routers })
      navigate("/Home")
    }
  }

  return (
    <>
      <button onClick={addNum}> 登录</button>
    </>
  )
}

export default Login

 大概就是这样了,react小白,如果有不对,或者有优化的话,希望可以指出来,谢谢大家了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要添加由,首先需要在react-router-dom v6中导入BrowserRouter和Routes组件。然后在Routes组件中添加Route组件,并指定path和component属性,用于指定径和对应的组件。例如: ``` import { BrowserRouter, Routes, Route } from 'react-router-dom'; import Home from './components/Home'; import About from './components/About'; function App() { return ( <BrowserRouter> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> </Routes> </BrowserRouter> ); } ``` 在上面的示例中,当用户访问根径时,会渲染Home组件,当访问/about径时,会渲染About组件。需要注意的是,在v6中,使用element属性来指定要渲染的组件。 ### 回答2: 在使用React的项目中添加React Router Dom V6的由非常简单。首先,确保项目中已经安装了ReactReact Router Dom V6的依赖。 然后,在项目的入口文件中,导入`BrowserRouter`组件,并在`ReactDOM.render`方法中将根组件包装在`<BrowserRouter></BrowserRouter>`标签中。 接下来,在根组件中,导入`Routes`和`Route`组件,分别用于定义由规则和具体的径。 使用`Routes`组件,可以在其内部使用多个`Route`组件来定义不同的由。每个`Route`都包含两个属性:`path`和`element`。`path`表示由的径,`element`表示对应的组件。 通过这种方式,可以轻松地添加不同径的由。例如,可以创建一个`Home`组件,并在由中添加`path="/" element={<Home />}`。这样,当用户访问根径时,将加载`Home`组件。 除了基本的径匹配,React Router Dom V6还引入了`<Switch>`组件用于由的排他性匹配。在`Switch`组件内部,可以使用`<Route>`组件来定义不同的由。当匹配到第一个由后,就不会继续匹配后面的由。 此外,React Router Dom V6还提供了一些其他的组件和钩子,如`<Link>`组件用于创建链接,`useNavigate`钩子用于进行编程方式的导航等。 总结起来,通过使用React Router Dom V6的`<Routes>`和`<Route>`组件,可以轻松地添加径和对应的组件。并且,通过`<Switch>`组件可以实现由的排他性匹配。在需要进行导航操作时,可以使用`<Link>`组件或`useNavigate`钩子。 ### 回答3: 在 React 中使用 react-router-dom v6 添加由非常简单。以下是一个简单的演示: 首先,确保已经安装了 react-router-dom v6: ```shell npm install react-router-dom@next ``` 然后,在你的 App.js(或其他根组件)中导入所需的库和组件: ```jsx import React from 'react'; import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; import Home from './Home'; import About from './About'; import NotFound from './NotFound'; const App = () => { return ( <Router> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> <Route path="*" element={<NotFound />} /> </Routes> </Router> ); }; export default App; ``` 这里我们使用了 `<BrowserRouter>` 组件来为应用程序提供由功能,然后使用 `<Routes>` 和 `<Route>` 组件来设置由规则。 在 `<Routes>` 中,我们可以使用 `<Route>` 组件来定义具体的径和对应的组件。`<Route>` 组件的 `path` 属性用于定义径,`element` 属性用于指定该径对应的组件。 在上面的例子中,我们将根径 `/` 对应的组件设置为 `Home` 组件,径 `/about` 对应的组件设置为 `About` 组件,而径 `*` 对应的组件设置为 `NotFound` 组件(即未匹配到任何由时显示的组件)。 当我们访问应用程序的不同径时,react-router-dom v6 会根据径自动加载相应的组件进行渲染。 希望这个简单的例子能够帮助你理解如何使用 react-router-dom v6 添加由。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值