'how fix Cannot read properties of undefined (reading 'pathname')

how i fix Cannot read properties of undefined (reading 'pathname')? router dom verision "react-router-dom": "^6.2.1", error description like this

TypeError: Cannot read properties of undefined (reading 'pathname') at FilmDetail.getDataDetail (FilmDetail.js:15:1) at FilmDetail.componentDidMount (FilmDetail.js:31:1) at commitLifeCycles (react-dom.development.js:20663:1) at commitLayoutEffects (react-dom.development.js:23426:1) at HTMLUnknownElement.callCallback (react-dom.development.js:3945:1) at Object.invokeGuardedCallbackDev (react-dom.development.js:3994:1) at invokeGuardedCallback (react-dom.development.js:4056:1) at commitRootImpl (react-dom.development.js:23151:1) at unstable_runWithPriority (scheduler.development.js:468:1) at runWithPriority$1 (react-dom.development.js:11276:1)

App.js

import React from 'react';
import { BrowserRouter as Router, Routes,Route ,  } from "react-router-dom";

function App() {
  return (
    <div className="App">
       <Router>
      <Routes>
        <Route path="/" element={<Navbar />}>
          <Route index element={<Home />} />
          <Route path="/detail/:id" element={<FilmDetail />} />
          <Route exact  path="/film" element={<About />} />
        </Route>
      </Routes>
    </Router>
    </div>
  );
}

export default App;

Film.js

import axios from "axios";
import React from 'react';
import { Link } from "react-router-dom";

class Film extends Component {
  getDataCarousel = async () =>{
    try{
      await axios
      .get(API,{crossDomain:true})
      .then((res) => {
        this.setState({ dataFilm: res.data.slice(0,20),
          loading:false
        })
      })
      }
      catch(error)  {
        console.log("error", error);
        
      }
  }

  componentDidMount =() => {
    this.getDataCarousel()
  }
render(){
return(
  {this.state.dataFilm.map((item,index) => (
            <div className="Card col-lg-3" key={index}  >
                <Link to={`/detail/${item.id}`} style={{textDecoration:'none'}}>
<Card>
</Link>
</div>
)
}

export default Film;

FilmDetail.js

import React, { Component } from "react";
import axios from "axios";


class FilmDetail extends Component {
  constructor(props){
    super(props)
  this.state = {
    filmDetail: [],
  }
  }

  getDataDetail = async () => {
    try {
      let id = this.props.location.pathname.split('/')[2]    //error pointing here
      // console.log(id)
      await axios.get(`http://api/shows/${id}?embed=cast`, {crossDomain:true})
      .then( (res) => {
          console.log(res.data)
          this.setState({
            filmDetail: res.data,
          })
      })
  }
  catch(error){
      console.log(error)
  }
  }

  componentDidMount = () => {
    this.getDataDetail()
  }

  render() {
    const { filmDetail} = this.state

    return (
      <>
      <h1>Detail Film</h1>
      <p>{filmDetail.name}</p>
      {/* <p>{filmDetail.genres}</p> */}
     {/* <img src={filmDetail.image?.medium} alt="helo"/> */}
      </>
    );
  }
}

export default FilmDetail;



Solution 1:[1]

<Route
  path='/detail/:id'
  render={(props) => (
    <FilmDetail {...props}  />
  )}
/>

If you do this then the props from the react router will be passed into your FilDetail Component. Generally when people are setting auth guards for their routes they use this logic.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Aashish Peepra