标签: react-router-dom

React Router 4.x - 连接到Redux后PrivateRoute无法正常工作

与Redux连接后,示例https://reacttraining.com/react-router/web/example/auth-workflow中的 PrivateRoute无效.

我的PrivateRoute看起来与原始版本几乎相同,但只连接到Redux并在原始示例中使用它而不是fakeAuth.

const PrivateRoute = ({ component: Component, auth, ...rest }) => (
  <Route
   {...rest}
   render={props =>
   auth.isAuthenticated
    ? <Component {...props} />
    : <Redirect to={{ pathname: "/login" }} />}
  />
);

 PrivateRoute.propTypes = {
  auth: PropTypes.object.isRequired,
  component: PropTypes.func.isRequired
 }

 const mapStateToProps = (state, ownProps) => {
  return {
     auth: state.auth
  }
};

export default connect(mapStateToProps)(PrivateRoute);
Run Code Online (Sandbox Code Playgroud)

用法和结果: -

  1. 不工作,但希望和期望工作
    • <PrivateRoute path="/member" component={MemberPage} />
  2. 工作,但不希望像这样使用
    • <PrivateRoute path="/member" component={MemberPage} auth={auth} />
  3. 工作.只是工作,但根本不想使用.从这一点可以理解,如果你将原始的PrivateRoute连接到Redux,你需要传递一些额外的道具(任何道具)来使PrivateRoute工作,否则它不起作用.任何人,请对这种行为给出一些暗示.这是我的主要问题
    • <PrivateRoute path="/member" component={MemberPage} …

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

13
推荐指数
3
解决办法
5778
查看次数

不变式失败:您不应在&lt;Router&gt;外使用&lt;Route&gt;

react-router-domReact应用程序中使用路由。我的应用程序的一部分提取到另一个软件包中。依赖项列表如下所示:

./app/dashboard/package.json

{
  "dependencies": {
    "@app/components": "^1.0.0",
    "react": "^16.8.5",
    "react-dom": "^16.8.5",
    "react-router-dom": "^5.0.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

./app/components/package.json

{
  "peerDependencies": {
    "react-router-dom": "^5.0.0"
  }
}
Run Code Online (Sandbox Code Playgroud)

当我使用@app/components需要组件的组件时,react-router-dom出现以下错误:

Uncaught Error: Invariant failed: You should not use <Route> outside a <Router> 
The above error occurred in the <Context.Consumer> component:
Uncaught (in promise) Error: Invariant failed: You should not use <Route> outside a <Router>
Run Code Online (Sandbox Code Playgroud)

为什么会引发此错误?在App.js我用BrowserRouter

import React, { Suspense } from 'react';
import { Switch, …
Run Code Online (Sandbox Code Playgroud)

reactjs react-router react-router-dom

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

如何在 react-router-dom 中正确定义回退路由

我有以下Router定义:

<Router>
    <Route exact path='/' component={Home}/>
    <Route path='/about' component={About}/>
    <Route path='/code' component={Code}/>
</Router>
Run Code Online (Sandbox Code Playgroud)

我想要任何未映射的路线(即 /foo)重定向回 root /

我试过<Redirect .../>没有成功。还添加一个<Route />没有path=导致每个页面上的重复组件。

reactjs react-router-dom

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

react-router-dom:无效的钩子调用,钩子只能在函数组件体内调用

我尝试嵌套一条路线:我在Catalog组件中有一个产品目录,它与 url "backoffice/catalog"匹配。

如果 url 与"backoffice/catalog/edit"匹配,我想路由到Edition组件,但我需要将Edition组件作为Catalog的子级来共享道具。

我真的不明白为什么嵌套路由不起作用,请救救我!如果我的应用程序有任何问题,请毫不犹豫地告诉我,我很了解 JavaScript,但我是从 React 开始的。

这是我的应用程序组件:

import React from "react";
import { Route, Switch } from "react-router-dom";
import { Home } from "./components/Static/Home.js";
import { Dashboard } from "./components/Backoffice/Dashboard.js";
import { Catalog } from "./components/Backoffice/catalog/Catalog.js";
import { Login } from "./components/Login/Login.js";
import { Signup } from "./components/Signup/Signup.js";
import { PrivateRoute } from "./components/PrivateRoute.js";
import "./scss/App.scss";
import {Header} from "./components/Structure/Header";
import {BOHeader} from …
Run Code Online (Sandbox Code Playgroud)

javascript routes reactjs react-router react-router-dom

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

React - TypeError:无法读取未定义的属性(读取“params”)

所以我收到一条错误消息 - TypeError: Cannot readproperties of undefined (reading 'params')

TypeError: Cannot read properties of undefined (reading 'params')
       5 | import products from '../products'
       6 | 
       7 | function ProductScreen({ match }) {
       8 |     const product = products.find((p) => p._id == match.params.id)
       9 |     return (
      10 |         <div>
      11 |             {product.name}
Run Code Online (Sandbox Code Playgroud)

这是我的 ProductScreen.js 文件,导致出现问题

import React from 'react'
import { Link } from 'react-router-dom'
import { Row, Col, Image, ListGroup, Button, Card } from 'react-bootstrap'
import Rating from '../components/Rating' …
Run Code Online (Sandbox Code Playgroud)

reactjs react-router react-router-dom

13
推荐指数
3
解决办法
6万
查看次数

为什么 React Router v6 似乎无法从 URL 中删除查询字符串参数?

我有一个应用程序,有时会加载查询字符串 param t

一开始,我希望应用程序读取此参数(如果可用)并将其从 URL 中删除。

在根组件上,我正在这样做:

    const [searchParams, setSearchParams] = useSearchParams();

    if (searchParams.has('t')) {
        const token = searchParams.get('t');
        if (token) {
            searchParams.delete('t');
            const newParams: {[key: string]: string} = {};
            searchParams.forEach((value: string, key: string) => {
                newParams[key] = value;
            });
            console.log('setting params: ');
            console.dir(newParams);
            setSearchParams(newParams);
            AuthController.setAccessToken(token);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我看到它正确读取 paramt并且 newParams 对象为空或仅包含其他参数,但由于某种原因setSearchParams(newParams)似乎没有执行任何操作。参数t仍然在 URL 中。

我怎样才能让它从 URL 中删除这个参数?

reactjs react-router react-router-dom

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

React Router 6 和 Typescript - 索引属性类型“true”不可分配给类型“false”| 不明确的'。?

我正在尝试为其父路由中的一个子路由创建索引路由,但我不断收到错误消息,提示类型“true”不可分配给类型“false |” 不明确的'。我如何解决它?

<Routes>
  <Route path="/" element={<Profile />}>
    <Route index path="/username" element={<ProfileDetails />} />
    <Route path="settings/profile" element={<EditProfile />} />
  </Route>
  <Route path="/login" element={<Login />} />
  <Route path="/register" element={<SignUp />} />
</Routes>
Run Code Online (Sandbox Code Playgroud)

您可以查看此图片以更清楚地了解我想说的内容

typescript reactjs react-router-dom

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

使用 React Router 6 导航时恢复滚动位置

如何设置 React Router 6 以在导航和刷新浏览器窗口时恢复滚动位置?

React Router 5 有一个关于滚动恢复的页面,但我在v6 的文档中找不到任何有关滚动的内容,所以我猜你应该用另一个包自己处理这个问题。很公平,但我找不到任何与 React Router 6 兼容的东西。

react-scroll-restorationoaf-react-router需要v5。(oaf-react-router 确实列出了它支持 v6,但基本使用代码示例与 v6 不兼容,相关问题 #210仍然处于开放状态。)

Gatsby 和 Next.js 支持开箱即用的滚动恢复,但我看起来没有一个可以直接使用的整齐打包的包。

这个带有服务器端渲染页面的小演示应用程序可以满足我的需求。当来回导航并刷新浏览器窗口时,滚动位置会恢复。

这是使用 React Router 6 的同一个应用程序,其中滚动位置不会保存和恢复,但实际上在页面之间重用。通常的解决方法是每当导航页面时滚动到顶部,但我对这种行为不感兴趣。

编辑:React Query 写道,滚动恢复的问题是页面正在重新获取数据,这意味着如果用于渲染页面的数据存在,则滚动恢复就可以工作。我无法确认这一点,因为我的小型 React Router 6 应用程序即使根本没有进行任何数据获取也存在问题。我觉得为了让它发挥作用,我缺少一些小东西。

Rant:令我感到非常惊讶的是,这个问题的典型答案是在导航时打电话window.scrollTo(0, 0)。这仅解决了页面之间滚动位置转移的问题。当滚动位置未恢复时,在页面之间导航时的用户体验会严重恶化。我想这就是弹出窗口变得如此流行的部分原因,但它们带来了一系列其他用户体验问题,所以我真的想避免使用它们。

javascript reactjs react-router-dom

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

BrowserRouter 内的链接标记仅更改 URL,但不会呈现组件

我正在构建一个 Netflix 克隆应用程序,并用于react-router-dom v5在不同页面之间切换。但是,当我单击Link中的标签时Navbar.jsx,URL 会发生变化,但相应的组件不会呈现。我查阅了很多关于这个主题的StackOverflow 帖子,但是,我无法让它工作。下面是代码。请帮助我,因为我已经被困在这个问题上三天了。

/series当导航到from时,它应该显示什么/在此输入图像描述

它实际上显示了什么: 在此输入图像描述

  1. 索引.js
import React from "react";
import { createRoot } from "react-dom/client";
import App from "./App";

const container = document.getElementById("root");
const root = createRoot(container);

root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
Run Code Online (Sandbox Code Playgroud)
  1. 应用程序.jsx
import React from "react";

import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import "./app.scss";
import Home from "./pages/home/Home";
import Watch from "./pages/watch/Watch";

const App = () => {
  return …
Run Code Online (Sandbox Code Playgroud)

javascript netflix reactjs react-router-dom

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

PrivateRoute没有在reactjs react-router-dom中工作

PrivateRoute在我的react.js项目中集成HOC时,我完全陷入困境.

这是我的路线文件

import React, { Component } from "react";
import { Route, Redirect, Switch, BrowserRouter as Router } from 'react-router-dom';
import Dashboard from "../view/Dashboard/Dashboard";
import Login from "../view/Login/Login";
import Admin from "../view/UserManagement/Admin";
import cookie from 'react-cookies'

const PrivateRoute = ({ component, ...rest }) => {
  const isAuthed = cookie.load('token')
  console.log(isAuthed, 'dddddddddddddddddddd')
  return (
    <Route {...rest} exact
      render = {(props) => (
        isAuthed ? (
          <div>
            {React.createElement(component, props)}
          </div>
        ) :
        (
          <Redirect
            to={{
              pathname: '/login',
              state: { …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-router react-router-dom

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