You should not use Route or withRouter() outside a Router when using react-router 4 and styled-component in react

JavascriptReactjsReact RouterStyled Components

Javascript Problem Overview


I'm trying to build my first portfolio website and got stuck in routing using react-router-dom 4.2.2 and styled-components 2.2.3.

error message: You should not use Route or withRouter() outside a Router

I also try using Link instead of NavLink but got error too(You should not use Link outside a Router)

Someone help me please.

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;
`;

Javascript Solutions


Solution 1 - Javascript

Make sure you wrap the main react render code in the Router. For example, with react-dom you need to wrap the app in Browser-Router. If this is a Udacity project, this is typically the index.js file.

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

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

  , document.getElementById('root'));

Solution 2 - Javascript

Well you're using a NavLink outside of the BrowserRouter/HashRouter (whatever you're using)

You said it yourself

> You should not use Link outside a Router

Make sure that you have the structure like this

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

You must always render them inside a Router

Solution 3 - Javascript

A possible origin is answered in spanish Stackoverflow, its a typescript project.

Original post: https://es.stackoverflow.com/a/372161/24877

According to the React documentation, this usually happens by having the React duplicated (more than one copy of React) https://reactjs.org/warnings/invalid-hook-call-warning.html

Apparently when using the npm link the application Try to use react from projects "react-app" and "react-app-components" and therefore when publishing it to the npm repository the error no longer comes out.

To fix it I removed the dependencies react, react-router-dom from the package.json and rerun npm install to remove the folders from node_modules.

package.json

Before:

<code>

{ //... "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" } }

After:

<code>

{ //... "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" } }

I just leave the "@types" to work with typescript

Solution 4 - Javascript

I uninstalled @types/react-router-dom and installed it back. The error went away, don't know the magic but it worked for me.

Solution 5 - Javascript

This may be a result of some confusions in node_modules for multirepo projects with some integration approaches.

The simplest way to avoid problems is to keep only one node_modules folder for all projects integrated together in one application. Otherwise some subproject can use different versions of same library (as example React or Router etc) which can be not compatible with each other in internal data structs (react contexts and so on) and that brings problems like this.

Solution 6 - Javascript

this is solved when you use <Router>, just add outside </Router></AppProvider>

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

Solution 7 - Javascript

One possible issue is using 'React Router DOM' and 'React Router' simultaneously in package.json.

They are technically three different packages: React Router, React Router DOM, and React Router Native. The primary difference between them lies in their usage. React Router DOM is for web applications and React Router Native is for mobile applications made with React Native

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJongHun LeeView Question on Stackoverflow
Solution 1 - JavascriptBruce SeymourView Answer on Stackoverflow
Solution 2 - JavascriptJoão CunhaView Answer on Stackoverflow
Solution 3 - JavascriptMarbin274View Answer on Stackoverflow
Solution 4 - JavascriptDinesh KhetarpalView Answer on Stackoverflow
Solution 5 - JavascriptoklasView Answer on Stackoverflow
Solution 6 - JavascriptTri Mueri SandesView Answer on Stackoverflow
Solution 7 - JavascriptAmin TurkzadehView Answer on Stackoverflow