在 react 中使用 react-router 4 和 styled-component 时,不应在 Router 外部使用 Route 或 withRouter()

Posted

技术标签:

【中文标题】在 react 中使用 react-router 4 和 styled-component 时,不应在 Router 外部使用 Route 或 withRouter()【英文标题】:You should not use Route or withRouter() outside a Router when using react-router 4 and styled-component in react 【发布时间】:2018-04-29 02:22:47 【问题描述】:

我正在尝试构建我的第一个投资组合网站,但在使用 react-router-dom 4.2.2 和 styled-components 2.2.3 时遇到了路由问题。

错误消息:您不应在路由器之外使用 Route 或 withRouter()

我也尝试使用 Link 而不是 NavLink,但也出现错误(您不应该在路由器之外使用 Link

请有人帮助我。

navigationBar.js

import React,  Component  from 'react';
import  NavigationContainer, NavItem  from './navigationBar.style';

class NavigationBar extends Component 
  render() 
    return (
      <NavigationContainer>
        <NavItem to="/">Home</NavItem>
        <NavItem to="/projects">Project</NavItem>
      </NavigationContainer>
    );
  


export default NavigationBar;

navigationBar.style.js

import styled from 'styled-components';
import  Flex, Div  from 'theme/grid';
import  NavLink  from 'react-router-dom';

export const NavigationContainer = styled(Flex)`
  position: fixed;
  right: 20px;
  top: 0.5em;
  font-size: 1em;  
`;
export const NavItem = styled(NavLink)`
  position: relative;
  padding-left: 10px;
  cursor: pointer;
`;

【问题讨论】:

【参考方案1】:

一个可能的问题是在 package.json 中同时使用“React Router DOM”和“React Router”。

从技术上讲,它们是三个不同的包:React Router、React Router DOM 和 React Router Native。它们之间的主要区别在于它们的用法。 React Router DOM 用于 Web 应用程序,React Router Native 用于使用 React Native 制作的移动应用程序

https://www.freecodecamp.org/news/react-router-cheatsheet/

【讨论】:

【参考方案2】:

当你使用&lt;Router&gt;时解决了这个问题,只需在&lt;/Router&gt;&lt;/AppProvider&gt;之外添加

<BrowserRouter>
    <Switch>
        //sample route
        <Route path="/index" render=(props) => <Index ...props /> />
    </Switch>
</BrowserRouter>

【讨论】:

【参考方案3】:

这可能是由于在 node_modules 中对采用某些集成方法的 multirepo 项目存在一些混淆。

避免问题的最简单方法是只为一个应用程序中集成的所有项目保留一个node_modules 文件夹。否则,某些子项目可能会使用同一库的不同版本(例如 React 或 Router 等),它们在内部数据结构(反应上下文等)中可能相互不兼容,从而带来这样的问题。

【讨论】:

【参考方案4】:

在西班牙语 *** 中回答了一个可能的来源,它是一个打字稿项目。

原帖:https://es.***.com/a/372161/24877

根据 React 文档,这通常是通过复制 React(多个 React 副本)https://reactjs.org/warnings/invalid-hook-call-warning.html

来实现的

显然,当使用 npm link 应用程序时,尝试使用项目“react-app”和“react-app-components”中的反应,因此当将其发布到 npm repository 时,错误不再出现。

为了修复它,我从 package.json 中删除了依赖项 reactreact-router-dom 并重新运行 npm install 以从 node_modules 中删除文件夹。

package.json

之前:

//... "license": "ISC", "devDependencies": "@babel/core": "^7.10.4", "@babel/preset-env": "^7.10.4", "@babel/preset-react": "^7.10.4", "@types/react": "^16.9.41", "@types/react-dom": "^16.9.8", "@types/react-router-dom": "^5.1.5", "babel-loader": "^8.1.0", "glob": "^7.1.6", "react": "^16.13.1", "react-router": "^5.2.0", "react-router-dom": "^5.2.0", "source-map-loader": "^1.0.1", "ts-loader": "^7.0.5", "typescript": "^3.9.6", "webpack": "^4.43.0", "webpack-cli": "^3.3.12" , "peerDependencies": "react": "^16.13.1", "react-router-dom": "^5.2.0"

之后:

//... "license": "ISC", "devDependencies": "@babel/core": "^7.10.4", "@babel/preset-env": "^7.10.4", "@babel/preset-react": "^7.10.4", "@types/react": "^16.9.41", "@types/react-dom": "^16.9.8", "@types/react-router-dom": "^5.1.5", "babel-loader": "^8.1.0", "glob": "^7.1.6", "source-map-loader": "^1.0.1", "ts-loader": "^7.0.5", "typescript": "^3.9.6", "webpack": "^4.43.0", "webpack-cli": "^3.3.12" , "peerDependencies": "react": "^16.13.1", "react-router-dom": "^5.2.0"

我只是留下“@types”来使用打字稿

【讨论】:

【参考方案5】:

我卸载了@types/react-router-dom 并重新安装了它。错误消失了,不知道魔法,但它对我有用。

【讨论】:

【参考方案6】:

确保将主要的反应渲染代码包装在路由器中。例如,使用 react-dom,您需要将应用程序包装在 Browser-Router 中。如果这是一个 Udacity 项目,这通常是 index.js 文件。

import  BrowserRouter  from 'react-router-dom';

ReactDOM.render(
   <BrowserRouter>
     <App />
   </BrowserRouter>

  , document.getElementById('root'));

【讨论】:

【参考方案7】:

您在 BrowserRouter/HashRouter 之外使用 NavLink(无论您使用什么)

你自己说的

你不应该在路由器之外使用链接

确保你有这样的结构

// App render or whatever
render() 
  return (
    <BrowserRouter>
       <NavigationBar />
       `whatever else you doin'`
    </BrowserRouter>
  );

您必须始终在路由器中渲染它们

【讨论】:

非常感谢!将 更改为 后,您的答案有效。在我的代码中, 中的 在哪里。我感觉好多了。再次感谢! 路由器可能只有一个子元素 @MuhammadUmer 我知道。但我只是在证明他应该将他的组件封装在路由器中 你拯救了我的一天

以上是关于在 react 中使用 react-router 4 和 styled-component 时,不应在 Router 外部使用 Route 或 withRouter()的主要内容,如果未能解决你的问题,请参考以下文章

react-router 4.0踩到的坑

在 React-router 中没有带链接的 href

关于react-router最新版本的使用

在带有 webpack 的 React-Router 中使用嵌套路由的问题

使用 Django + react-router 找不到 404 页面

如何在 django 项目中使用 react-router 处理 404 错误