URL changes but component is not render - React Router

Viewed 150

I'm new in react/react-router.

App.js file:

 import React , {useState , useEffect} from 'react'; 
 import './App.css'; 
 import {Route, Switch} from 'react-router-dom'; 
 import Header from './components/ui/Header'; 
 import axios from 'axios';
 import CharacterGrid from './components/characters/characterGrid';
 import Search from './components/ui/Search'; 
 import QuotesFetch from './Quotes/QuotesFetch'; 
 import Quotes from './Quotes/Quotes';


  return (

    <div className="container">
      <Header />
      <Switch>
      <Route path="/">
          <Search getQuery={(q) => setQuery(q)} />
          <CharacterGrid
            item={item}
            isLoading={isLoading}
          />
          
        </Route>
        <Route path="/characters">
          <Search getQuery={(q) => setQuery(q)} />
          <CharacterGrid
            item={item}
            isLoading={isLoading}
          />
        </Route>
          
        <Route path="/quotes">
        <Quotes />
        </Route>

          <Route path="/series">
            
          </Route>
        </Switch>
      
    </div>   ); }

export default App;

index.js file:

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import App from './App'; 
import {   BrowserRouter } from "react-router-dom";
    
    ReactDOM.render(   <BrowserRouter> 
        <App />   </BrowserRouter>      ,   document.getElementById('root') );
    
    

QoutesFetch.js file:

import React , { useState , useEffect} from 'react'; 
import Quotes from './Quotes'; 
import axios from 'axios'; 
import Spinner from '../img/spinner.gif';
    
    const QuotesFetch = (props) => {
        const [quote , setQuotes] = useState([]);
        const [isLoading , setIsLoading] = useState(true);
    
    
      useEffect(() => {
        const url =
          `https://www.breakingbadapi.com/api/quotes`;
    
        axios
          .get(url)
          .then((res) => {
            setQuotes(res.data);
            setIsLoading(false);
          })
          .catch((err) => console.log("QuotesList Error=>", err));   }, []);
        
        return isLoading ? (<img style={{width: '200px' , margin: 'auto' , display: 'block'}} src= {Spinner} />) : 
        (
        <section>
            {quote.map((quote) => (
            <Quotes key={quote.quote_id} quote={quote} />
          ))}
        </section>
        ) }
    
        export default QuotesFetch
1 Answers

I think you are not rendering the component QuotesFetch but Quotes in App.js.

Thus Quotes render is empty ?

Try replacing


      <Route path="/quotes">
        <Quotes />
      </Route>

with


      <Route path="/quotes">
        <QuotesFetch />
      </Route>

[EDIT]

You should also move the Route "/" to the end of the list or add 'exact' property, otherwise the first route intercepts all traffic :

<Switch>
  <Route exact path="/">
    <Search getQuery={(q) => setQuery(q)} />
    <CharacterGrid
      item={item}
      isLoading={isLoading}
    />

  </Route>
  <Route path="/characters">
    <Search getQuery={(q) => setQuery(q)} />
    <CharacterGrid
      item={item}
      isLoading={isLoading}
    />
  </Route>

  <Route path="/quotes">
    <QuotesFetch />
  </Route>

  <Route path="/series">

  </Route>
</Switch>
Related