import { Provider } from 'jotai'
import React from 'react'
import ReactDOM from 'react-dom/client'
import { RouterProvider, createBrowserRouter } from 'react-router-dom'
import App from './App.tsx'
import Auth from './Auth.tsx'
import NewPass from './NewPass.tsx'
import ResetPassword from './ResetPassEmail.tsx'
import './index.css'

const router = createBrowserRouter([
  {
    path: "/",
    element: <Auth />,
  },
  {
    path: "/chatroom",
    element: <App />,
  },
  {
    path: "/psdResetEmail",
    element: <ResetPassword />,
  },
  {
    path: "/psdReset/:access_token=:access_token&token_type=:token_type&type=:type",
    element: <NewPass />,
  },
  {
    path: "/psdReset/:error=:error&error_code=:error_code&error_description=:error_description",
    element: <Auth />,
  },
]);

ReactDOM.createRoot(document.getElementById("root")!).render(
  <React.StrictMode>
    <Provider>
      <RouterProvider router={router} />
    </Provider>
  </React.StrictMode>
);

我目前正在使用此方法创建路由,但在try 为access_tokenerror创建新路径时遇到错误,但返回404错误.

错误URL如下所示:"http://localhost:5173/psdReset#error=unauthorized_client&error_code=401&error_description=Email+link+is+invalid+or+has+expired"

access_tokenURL看起来是一样的,但有access_token个参数.

我正在try 使用URL散列.

推荐答案

组件Routepath属性只使用URL路径部分进行路由匹配,添加hash/queryString将不起作用,实际上会 destruct 路由匹配.

我建议创建一个组件,该组件可以读取hash/queryString并有条件地呈现被路由的组件,或者在没有"匹配"的情况下发出反向导航.

示例:

const PasswordReset = () => {
  const navigate = useNavigate();
  const { hash } = useLocation();
  
  // Create a URLSearchParams object from the hash value
  const searchParams = React.useMemo(() => new URLSearchParams(hash), [hash]);

  // Unpack any token values
  const accessToken = searchParams.get("access_token");
  const tokenType = searchParams.get("token_type");

  // Unpack any error values
  const error = searchParams.get("error");
  const errorCode = searchParams.get("error_code");
  const errorDescription = searchParams.get("error_description");

  // Compute which component type you want to render
  const isNewPass = accessToken && tokenType;
  const isAuth = error && errorCode && errorDescription;

  useEffect(() => {
    // If no "match" then navigate back
    if (!(isNewPass || isAuth)) {
      navigate(-1);
    }
  }, [isNewPass, isAuth, navigate]);

  // Render appropriate "match"
  if (isNewPass) {
    return <NewPass />;
  } else if (isAuth) {
    return <Auth />;
  }

  // No "match" render null
  return null;
};
const router = createBrowserRouter([
  {
    path: "/",
    element: <Auth />,
  },
  {
    path: "/chatroom",
    element: <App />,
  },
  {
    path: "/psdResetEmail",
    element: <ResetPassword />,
  },
  {
    path: "/psdReset",
    element: <PasswordReset />,
  },
]);

Javascript相关问答推荐

容器如何更改默认插槽中子项的显示?

提交表格后保留Web表格中的收件箱值?

字节数组通过echo框架传输到JS blob

类型自定义lazy Promise. all

如何从一个列表中创建一个2列的表?

Chromium会将URL与JS一起传递到V8吗?

如何从html元素创建树 struct ?

如何在bslib nav_insert之后更改导航标签的CSS类和样式?

并不是所有的iframe都被更换

为什么我的导航条打开状态没有在窗口addeventlistener(Reaction Js)中更新?

我可以使用空手道用户界面来获取网页的当前滚动位置吗?

如何创建返回不带`new`关键字的实例的类

在不删除代码的情况下禁用Java弹出功能WordPress

使用API调用的VUE 3键盘输入同步问题

TabNavigator和StackNavigator之间的Reaction Native中的导航问题

使用Perl Selify::Remote::Driver执行Java脚本时出错

如何在Reaction中设置缺省值, Select 下拉列表,动态追加剩余值?

在点击链接后重定向至url之前暂停

如果我将高度设置为其内容的100%,则在Java脚本中拖动以调整面板大小时会冻结

在AgGrid中显示分组行的单元格值