标签: react-router-dom

React router v6 和路由内页面的相关链接

您好,我正在尝试使用 React Router 将项目更新到 v6。我了解了基础知识,但在相关链接方面遇到了困难。

我们有一个页面,通过“id”呈现给定项目的参考文档。该文档可以使用同级 ID 链接到其他“同级”材料。换句话说,用户可以在文档中导航,而无需离开相同的基本路线(由“id”参数化)。

我在codesandbox上做了一些重现,下面是基本代码。

import React from "react";
import {
  BrowserRouter,
  Routes,
  Route,
  Link,
  useParams
} from "react-router-dom";

import "./styles.css";

function GenericPage() {
  const { id } = useParams();
  return (
    <div className="page">
      <p>Document id: {id}</p>
      <div>
        Links from within page don't work:
        <Link to="./foo" className="link">
          Foo
        </Link>
        <Link to="./bar" className="link">
          Bar
        </Link>
      </div>
    </div>
  );
}

export default function App() {
  return (
    <BrowserRouter>
      <div>
        Working top nav:
        <Link to="docs/generic/foo" className="link">
          Foo …
Run Code Online (Sandbox Code Playgroud)

reactjs react-router react-router-dom

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

React Router 6,同时处理多个搜索参数

我已经setSearchParams在 Parent 组件中使用了 hook,它query根据inputJSX 元素的输入进行设置。现在,我需要实现第二个搜索参数 = sortBy,但不要删除已经存在的query搜索参数,或者可能是我每次执行 If() 检查时需要执行的现有搜索参数。而且我现在还需要 if() 检查父元素的参数sortBy。我可能会在不同的 React 组件中引入更多的搜索参数 - 这会让代码变得混乱。

有没有更好的方法来使用 React Router 6 处理分散在项目中的多个搜索参数?

import { useSearchParams } from 'react-router-dom';

const titles = ['Name', 'Sex', 'Born', 'Died', 'Father', 'Mother', 'Slug'];

export const TableHead = () => {
  const [searchParams, setSearchParams] = useSearchParams();

  const query = searchParams.get('query');

  return (
    <tr className="person">
      {
        titles.map(el => (
          <th
            key={el}
            onClick={() => {
              if (query) {
                setSearchParams({ …
Run Code Online (Sandbox Code Playgroud)

reactjs react-router react-router-dom

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

React Router v6.4.1 createBrowserRouter 不工作

我正在使用react v18和react-router-dom v6.4.1创建一个应用程序,其中我使用createBrowserRouter文档中显示的功能(https://reactrouter.com/en/main/start/tutorial#adding- a-路由器)。div但是,即使仅配置一个简单的根路由(返回一个简单的“Hello World!”),它也根本不起作用。在里面。

这是我使用的代码和我得到的错误。我有什么遗漏的吗?

import { createBrowserRouter } from 'react-router-dom'

const router = createBrowserRouter([
  {
    path: '/',
    element: <div>Hello World!</div>
  }
])

export default router
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

typescript reactjs react-router-dom

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

useLoaderData 必须在数据路由器内使用

我正在使用react-roter-dom v 6.4.2。我想在我的主页中使用 useLoaderData,如下所示:

import React from 'react';
import { useLoaderData } from 'react-router-dom';

const Home = () => {
  try {
    const user = useLoaderData();
    console.log(user);
  } catch (error) {
    console.log(error);
  }
  return (
    <div>
      <h2>This is Home</h2>
    </div>
  );
}

export default Home;

Run Code Online (Sandbox Code Playgroud)

我在 Route 组件中使用 loader,如下所示:

import logo from './logo.svg';
import './App.css';
import { Route, Routes } from 'react-router-dom';
import About from './components/About';
import Products from './components/Products';
import Header from './components/Header';
import Home from './components/Home';

function App() …
Run Code Online (Sandbox Code Playgroud)

reactjs react-router react-router-dom

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

反应路由器V6.4.3 useLoaderData

我对此很陌生,当我使用 V6.4.3 时,我发现它更新为似乎使用加载程序进行身份验证,因此我尝试简化原始方法。但是当我使用 时useLoaderData(),我变得未定义。

索引.js

const router = createBrowserRouter(
  createRoutesFromElements(
    <>
      <Route path="sign-in" element={<SignIn />} />    
      <Route path="/" element={<App />} errorElement={<LayoutError />}>
      <Route
        path="data"
        loader={() => { AuthProvider() }}
        element={<DataLayout />}
      />
      <Route path="about" element={<About />} />
      </Route>
    </>
));
ReactDOM.createRoot(document.getElementById('root'))
  .render(
    <ThemeProvider theme={theme}>
      <RouterProvider router={router} />
    </ThemeProvider>
  );
Run Code Online (Sandbox Code Playgroud)

AuthProvider.js

export default function AuthProvider(){
  //{token: '4r8gjifendinsd'}
  const user = authService.getCurrentUser();
  //{"token":"asdasdasd"}
  console.log(JSON.stringify(user));
  if (!user.token) {
    throw redirect("/sign-in");
  }
  return user;
}
Run Code Online (Sandbox Code Playgroud)

数据布局.js

export default function DataLayout() {
  const …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-router react-router-dom

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

如何在同一路由路径上重新渲染组件(链接,V6)reactjs

我有一个侧边栏菜单可以更改页面

我发现如果我单击当前路径的菜单项,页面将不会触发重新渲染。

(例如当前路径是 /user 并单击相同的路径 /user )

进入页面时它会调用 useEffect 来获取数据,但我想再次单击相同的链接来重新加载数据而不是重新加载页面

我有以下 React 路由器。

 <Routes>
   <Route path="" element={<MainLayout />}>
     <Route path="/user" element={<User />} />
     <Route path="/contact" element={<Contact />} />
     <Route exact path="/" element={<Login />} />
   </Route>
</Routes>
Run Code Online (Sandbox Code Playgroud)

MainLayout.jsx

<Layout>
      <Sidebar />
      <Layout>
        <Header></Header>

        <Content >
          <Outlet />
        </Content>

        <Footer >
           Sorftware
        </Footer>
      </Layout>
</Layout>
Run Code Online (Sandbox Code Playgroud)

侧边栏.jsx

<Menu>
  <Menu.Item key="users" >
     <Link to="/user">User</Link>
  </Menu.Item>
</Menu>
Run Code Online (Sandbox Code Playgroud)

*更新:我删除了index.jsCustomRouter.jsx因为它似乎与我的问题无关

reactjs react-router-dom

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

为什么我的组件在所有路由中都保持渲染?

当我输入一个不存在的 url 时,我试图呈现一个组件。但是,该组件会在所有路由中保持渲染。我正在使用react-router-dom@4.1.1. 这是我设置的路线:

import * as React from "react";
import { Route, RouteComponentProps } from "react-router-dom";
import glamorous from "glamorous";
import ElementList from "./elementlist";
import AddElement from "./addelement";
import NotFound from "./NotFound";

const Styling = glamorous.div({
  minHeight: 5,
  minWidth: 8
});

const NavRouter = () => (
  <Styling>
    <Route path="/" exact={true} component={ElementList} />
    <Route path="/addelement" component={(props: 
       RouteComponentProps<{}>) => (
         <AddElement onSubmitSuccess={() => props.history.push("/")} />
       )} />
    <Route path="*" exact={true} component={NotFound}/>
  </Styling>
);

export default NavRouter;
Run Code Online (Sandbox Code Playgroud)

这是我的NotFound …

typescript reactjs react-router-dom glamorous

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

React-router-dom-链接更改URL但不呈现

我是React的新手,我已经<Link>从dy数据中转到下一个或上一个项目(例如,如果我在user / 2视图上,则上一个链接转到user / 1,下一个链接转到user / 3 ),则正确更改了url,但根本没有呈现该组件,也根本没有重新加载数据。

我读到这是由于组件未检测到子代未更改状态,因此父组件未呈现。

我尝试使用,withRouter但出现错误:You should not use <Route> or withRouter() outside a <Router>如果有人有解决方案并对此有一些解释,我不明白我在做什么,我将不胜感激:)

App.js:

import React, { Component } from 'react';
import {
  Route,
  Switch,
  withRouter,
} from 'react-router-dom';


import HomePage from './pages/home';
import SinglePage from './pages/single';

class App extends Component {



  render() {


    return (
      <Switch>
        <div>
          <Route exact path="/" component={HomePage} />
          <Route path="/:id" component={SinglePage} />
        </div>
      </Switch>
    );
  }
}

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

Single.js:

import React, …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-router react-router-dom

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

为什么在新的react-router-dom &lt;Redirect /&gt;中不会在setTimout内部触发?

因此,我尝试在注销页面和重定向到主网站页面之间进行一些延迟。但是,我陷入了问题,该反应路由器-DOM <Redirect/>方法并不想火的时候,我们把它里面setTimeout()setInterval()

因此,如果我们将其从计时器中解开,<Redirect/>它将正常工作。

问题是什么,有什么建议吗?

我的代码:

import React, { Component } from 'react';
import { Redirect } from 'react-router-dom';
import axios from 'axios';

class LogoutPage extends Component {
    constructor(props) {
        super(props);
        this.state = {
            navigate: false
        }
    }

    componentDidMount(e) {
        axios.get('http://localhost:3016/logout')
        .then(
            this.setState({
                navigate: true
            }),
        )
        .catch(err => {
            console.error(err);
        });

        if (this.state.navigate) {
            setTimeout(() => {
                return <Redirect to="/employers" />
            }, 2000);
        }
    };

    render() {
        if (this.state.navigate) {
            setTimeout(() => …
Run Code Online (Sandbox Code Playgroud)

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

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

将样式化的组件样式应用于第三方组件

我正在学习反应,因此我开始使用styled-componentsreact-router dom

但是我面临困难,无法将自定义样式的组件应用于我自己创建的现有组件。

这是代码:

import React from "react";
import { NavLink } from "react-router-dom";
import styled from "styled-components";

const NavStyle = styled.div`
  color: red;
  margin: 10px;
`;

const Navigation = () => {
  return (
    <div>
      <NavStyle>
        <NavLink to="/">Home</NavLink>
      </NavStyle>
      <NavLink to="/about">About</NavLink>
      <NavLink to="/contact">Contact</NavLink>
    </div>
  );
};

export default Navigation;
Run Code Online (Sandbox Code Playgroud)

问题是color: red没有应用,但是margin: 10px在视图中应用了。这样吗

reactjs styled-components react-router-dom

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