标签: react-router-dom

从 React Router 数据路由器操作调用钩子

我正在使用 React Router 6.4.3 和新的数据路由器。

第三方身份验证库通过挂钩公开身份验证上下文和登录函数,例如:

const { AuthenticationContext, login } = useAuthentication();
Run Code Online (Sandbox Code Playgroud)

我已经设法AuthenticationContext通过使用 中的无路径路由将路由包装到 中createBrowserRouter

但是,我无法理解如何利用路由操作来执行登录并随后重定向用户。由于配置和操作现在位于功能组件之外,因此我无法使用该useAuthentication钩子。

我的配置如下:

import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import { AuthProvider } from 'auth';
import Login, { action as loginAction } from './routes/login';

const router = createBrowserRouter([
    {
        element: <AuthProvider />,
        children: [
            {
                path: '/login',
                element: <Login />,
                action: loginAction,
            },
        ],
    },
]);

function App() {
    return (
        <RouterProvider router={router} />
    );
}
Run Code Online (Sandbox Code Playgroud)

目前loginAction …

typescript react-router-dom

4
推荐指数
1
解决办法
1335
查看次数

如何将 React 路由添加到 AntD 水平菜单?

我有以下组件作为主要布局。当我单击菜单项时,我希望它们导航到主页、假日日历和活动页面。我可以用这个水平菜单做什么?下面的代码显示了围绕上述页面的主要布局。我正在使用 AntD 和反应路由器。这个主要布局围绕着所有其他路由器。

import { Layout, Menu, Button, Avatar, Row, Col, Space, Dropdown } from "antd";
import React, { useState } from "react";
import { Outlet } from "react-router-dom";

const navigation = [
  { label: "Home", key: 1 },
  { label: "Holiday Calendar", key: 2 },
  { label: "Event", key: 3 },
];

const MainLayout = () => {

  const [open, setOpen] = useState(false);

  const showDrawer = () => {
    setOpen(true);
  };

  const onClose = () => {
    setOpen(false);
    window.dispatchEvent(new …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-router antd react-router-dom

4
推荐指数
1
解决办法
4254
查看次数

createBrowserRouter 和 RouterProvider 应如何与应用程序上下文一起使用

任何大型应用程序都会有可能需要路由器重定向用户的一般上下文。由于RouterProvider只能在根级别使用。如何将它与应用程序上下文一起使用。

例如,ApiContext如果用户无权访问 API,我会重定向到 403 路由/组件。

如何将此上下文包装在 中,而RouterProvider不必在每次路由更改时重新渲染它。换句话说。我怎样才能拥有使用路由器的父上下文?

如果我使用 ,它工作得很好BrowserRouter,但在 v6.8 中卸载之前使用任何类型的提示的唯一方法是使用数据 api 和方法createBrowserRouter

标题导航也是如此。我不希望我的标头出现在每个路由组件和路由的一部分中。我希望我的标头是静态的,而路由组件是动态的。

// Aplication Context
export const ApiContext = React.createContext({});

export const ApiProvider = memo((p: { children: React.ReactNode; }) => {
  const navigate = useNavigate();
  const [token, setToken] = useState<string>()

  if (!token) {
    navigate('/403');
  }

  const value = useMemo(() => ({}), []);
  return (
    <ApiContext.Provider value={value}>
      {p.children}
    </ApiContext.Provider>
  );
});
Run Code Online (Sandbox Code Playgroud)
// Index
const router = createBrowserRouter([
  {
    path: …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs react-router-dom

4
推荐指数
1
解决办法
1万
查看次数

TypeError: t.useContext(...) is null 错误在react router Link (React + Webpack)中

我有一个react + django + webpack的项目。我在我的上定义了路线App.js

<NavBar />
<Router>
  <Routes>
    <Route exact path="/" element={<Home />} />
    <Route path="/about" element={<About />} />
  </Routes>
</Router>
Run Code Online (Sandbox Code Playgroud)

Links我在我的组件中定义NavBar.js

import React from "react";
import { Link } from "react-router-dom";

export default function NavBar() {
  return (
    <nav>
      <Link to="/">Home</Link>
      <Link to="/about">About</Link>
    </nav>
  );
}
Run Code Online (Sandbox Code Playgroud)

如果我Link在其中使用App.js它可以正常工作,但是当我在组件中使用它时NavBar.js我会收到此错误:

在此输入图像描述

网络包配置:

<NavBar />
<Router>
  <Routes>
    <Route exact path="/" element={<Home />} />
    <Route path="/about" element={<About />} />
  </Routes>
</Router>
Run Code Online (Sandbox Code Playgroud)

Switch也尝试使用,但它只能使用超链接 …

javascript reactjs webpack react-router-dom

4
推荐指数
1
解决办法
3561
查看次数

React router dom v6.10 重定向功能不起作用(以编程方式重定向)

自 v5 以来,我一直在使用 的redirect方法react-router-dom,但现在它不起作用。我尝试过useNavigate钩子,但无法通过useParams钩子获取参数。它只是不会对路由中定义的组件进行任何重定向。我的应用程序是使用创建的create-react-app。这是我的配置:

索引.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>
);
reportWebVitals();
Run Code Online (Sandbox Code Playgroud)

应用程序.js

import './App.css';
import { Route, Routes } from 'react-router-dom';
import Person from './entities/person/Person';
import UpdatePerson from './entities/person/UpdatePerson';

function App() {
  return (
    <Routes>
      <Route path='/' element={<Person />} …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-router-dom

4
推荐指数
1
解决办法
4147
查看次数

反应路由器或链接不工作

我在redux应用程序中使用react-router-dom.

这是我在index.js中的初始设置:

ReactDOM.render(

  <Provider store={store}>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </Provider>

  , document.getElementById('root'));
Run Code Online (Sandbox Code Playgroud)

然后在我的App.js中我有:

render() {
    return (
      <div className="App">
        <Route exact path="/" render={ () => {
          return (
              <div>
                {
                  this.props.categories.map((category)=>{
                    console.log('category', category)
                    return (
                          <Link key={category.name} to="/category"  >{category.name}</Link>
                    )
                  })
                }
              </div>
          )

          }}
        />

        <Route path="/category" render={ () => {
          console.log('category path this.props', this.props)
          return (<p>Category is whatever</p>)
        }}
        />

      </div>
    );
  }
Run Code Online (Sandbox Code Playgroud)

我认为每当我点击显示的任何链接时,浏览器会自动知道如何呈现新的路径路径/类别,但由于某种原因它不会.

我究竟做错了什么?

reactjs react-redux react-router-redux react-router-dom

3
推荐指数
2
解决办法
1万
查看次数

当我的React应用程序中的路线发生变化时,我clearInterval()和应用程序中断

我正在使用React-router-dom开发一个React应用程序

我有一个带有一些react-router-dom的菜单<NavLink />,每个菜单都将我带到不同的路线。

在我的主要路线中,path="/"我的chartComponent具有一个图表,该图表会随着随机数据而不断变化,如下所示:this.chartChangeId = setInterval(()=> this.setState(data), 1500)

在我添加以下内容之前:

componentWillUnmount(){
    clearInterval(this.chartChangeId);
}
Run Code Online (Sandbox Code Playgroud)

chartComponent我的应用程序没有中断,但是出现了以下错误:

警告:只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了setState,replaceState或forceUpdate。这是无人值守。请检查BrainWaveChart组件的代码。

所以我将其添加到生命周期中。

但是现在,当我单击其中一个<NavLink />转到另一条路线时,我的应用程序中断了,并且出现此错误:

未捕获到的TypeError错误:timeout.close不是在BrainWaveChart.componentWillUnmount(brainwaveChart.jsx:116x)处的export.clearTimeout.exports.clearInterval(main.js:14)处,在HTMLUnknownElement.call处的callComponentWillUnmountWithTimer(vendor_f02cab182c1842c98837.js:45235)处的export.clearTimeout.exports.clearInterval(main.js:14) vendor_f02cab182c1842c98837.js:37015)在Object.invokeGuardedCallbackDev(vendor_f02cab182c1842c98837.js:37054)在invokeGuardedCallback(vendor_f02cab182c1842c98837.js:36911)在safelyCallComponentWillUnmount(vendor_f02cab182c1842c98837.js:45242)在commitUnmount(vendor_f02cab182c1842c98837.js:45368)在commitNestedUnmounts(vendor_f02cab182c1842c98837.js :45404)在unmountHostComponents(vendor_f02cab182c1842c98837.js:45687)

我做错了吗?

javascript setinterval reactjs react-router-dom

3
推荐指数
1
解决办法
1490
查看次数

反应路由器的嵌套路由。不呈现子路线

我有一个称为Dashboard的父组件,该组件被渲染为Route,如下所示:

const Routes = ({ authenticated }: { authenticated: boolean }) => (

    <Switch>
        <AuthenticatedRoute path="/home" exact={true} component={Dashboard} authenticated={authenticated} />
        <UnauthenticatedRoute path="/login" exact={true} component={Login} authenticated={authenticated} />
        <AuthenticatedRoute path="/onboarding" exact={true} component={Onboarding} authenticated={authenticated} />
        <AuthenticatedRoute path="/meets" exact={true} component={Meets} authenticated={authenticated} />
        <Route component={NotFound} />
    </Switch>

)

export default Routes
Run Code Online (Sandbox Code Playgroud)

在Dashboard组件中,我还要呈现路线,该组件如下所示:

class Dashboard extends React.Component<IProps, {}> {
    public render() {
        return (
            <div>
                <Navigation />

                <Route exact={true} path="/home" component={Home} />
                <Route exact={true} path="/home/profile" component={Profile} />
                <Route exact={true} path="/home/messages" component={Messages} />

                HALLO
            </div>
        )
    } …
Run Code Online (Sandbox Code Playgroud)

reactjs react-router react-router-v4 react-router-dom

3
推荐指数
1
解决办法
1035
查看次数

反应挂钩-更改路线时不会重置useState()中的状态

const Create = () => {
  console.log('rerender !!')
  const [parcelType, setParcelType] = useState('paper')
  console.log('parcelType =', parcelType)

  return (
    <Container onClick={() => setParcelType('plastic')}>
      <BookingList />
      <Card title="Business">
        <p>Header</p>
      </Card>
    </Container>
  )
}

export default Create
Run Code Online (Sandbox Code Playgroud)

单击创建组件中的容器时,我想将parcelType状态更改为“可塑”。我想在更改路线时将parcelType状态重置为“纸”(创建组件重新渲染)。但是当组件重新渲染状态未设置为纸张时

有关更多详细信息:在BookingList组件中更改路线时,将重新渲染CreateComponent

 const BookingList = props => {
  const { id } = props.match.params
  const containerStyle = useTranslateSpring('-100px', '0')

  const itemList = items.map((item, idx) => {
    const itemStyle = useTranslateSpring('-100px', '0', '0', 200 + 200 * idx)
    const url = `/booking/${item.id}/create`

    return (
      <ItemContainer
        onClick={() => …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-router-dom react-hooks

3
推荐指数
1
解决办法
2822
查看次数

使用“ withRouter”和Typescript时类型出现问题

我正在尝试对React + Typescript进行更深入的了解和实践,使用withRouterfrom 时遇到了这种输入错误react-router-dom

我的代码段非常简单,我尝试找出存在相同问题的人员,并且一些答案指出升级时出错(但它们来自2016年,所以...),其中一些正在使用一条connect()我没有使用的陈述(这导致了一个问题:“由于未使用,我做错了吗?”)。我看到其中一些建议还涉及将“ Props”映射到“ State”,到目前为止,我还没有做过(也没有看到)。我希望有人对我所缺少的内容以及我应该关注的内容提出一些建议。

代码是:

import React from "react";
import { withRouter } from "react-router-dom";

interface ISection {
  id: number;
  title: string;
  imageUrl: string;
  size: string;
}

class MenuItem extends React.Component<ISection> {
  render() {
    return (
      <div className={`${this.props.size} menu-item`}>
        <div
          className="background-image"
          style={{ backgroundImage: `url(${this.props.imageUrl})` }}
        />
        <div className="content">
          <h1 className="title">{this.props.title}</h1>
          <span className="subtitle">some subtitle</span>
        </div>
      </div>
    );
  }
}

export default withRouter(MenuItem);
Run Code Online (Sandbox Code Playgroud)

从这里我期望可以平稳地工作(我不得不说我首先尝试了一个功能组件,因为我没有任何状态,但是我看到的所有解决方案都涉及一个类组件,因此我将其移入了该组件中。 ),但MenuItem在最后一行的上却出现以下错误:

Argument of type 'typeof MenuItem' is …
Run Code Online (Sandbox Code Playgroud)

typescript react-router react-router-dom

3
推荐指数
1
解决办法
562
查看次数