Cannot read props of undefined at this.props.history.push()

I am using Axios for POST API in my project, so after I get back response from my server I want to navigate to other page by

this.props.history.push('/****') 

but I always get error of TypeError: Cannot read property 'props' of undefined

Here is my code

class Banner extends Component {   constructor(props) {     super(props);     this.state = {       redirectToLogin: false,       logout: false,       loading: true,     };   }        viewInsight = (item) => {     let res;     axios       .post("https://webquickfix.com/controlcenter/get_banner_insight", {         id: item._id,       })       .then(function(response) {         console.log(response.status);         console.log(response.data.data)         localStorage.setItem(           "bannerInsight",           JSON.stringify(response.data.data)         );          if (response.status == 200) {           this.props.history.push("/*****");         }       })       .catch(function(error) {         console.log(error);                });         };    render() {      return (       <Container fluid className="main-content-container px-4">         <div noGutters className="page-header py-4 contactUs">           <PageTitle sm="4" title="Banners" className="text-sm-left" />           <Button theme="danger" onClick={() => this.logout()}>             Logout           </Button>         </div>          <Row>           <Col>             <Card small className="mb-4">               <CardHeader className="border-bottom">                 {" "}                 <h6 className="m-0">                   All Banners{" "}                   <button                     title="Add Banner"                     onClick={() =>                       this.props.history.push("/controlcenter/add-banner")                     }                     className="btn ml-3 btn-primary"                   >                     <i className="fa fa-plus"></i>                   </button>                 </h6>               </CardHeader>               <CardBody className="p-0 pb-3">                 <table className="table mb-0">                   <thead className="bg-light">                     <tr>                       <th scope="col" className="border-0">                         #                       </th>                       <th scope="col" className="border-0">                         Banner Link                       </th>                       <th scope="col" className="border-0">                         Webinar                       </th>                       <th scope="col" className="border-0">                         Page                       </th>                       <th scope="col" className="border-0">                         Insights                       </th>                       {/* <th scope="col" className="border-0">                         Actions                       </th> */}                     </tr>                   </thead>                   <tbody>                     {this.state.banners.map((item, index) => {                       return (                         <tr>                           <td>{index + 1}</td>                           <td>                             <img src={item.image} style={{ width: 200 }} />                           </td>                           <td>                             {item.isWebinar                               ? this.props.webinars.filter(                                   (webinar) => webinar._id == item.webinar_id                                 )[0].title                               : ""}                           </td>                           <td>{item.page}</td>                           <td                             className="insightsBanner"                             onClick={() => this.viewInsight(item)}                           >                             View Insights                           </td>                         </tr>                       );                     })}                   </tbody>                 </table>               </CardBody>             </Card>           </Col>         </Row>       </Container>     );   } }  export default Banner; 

I have noticed an issue that if I use fetch instead of Axios then I am not getting this error, how could I make this work with Axios instead of fetch?

Here is the code if I use fetch:

let formData = new FormData();     formData.append("id", item._id);     fetch("https://webquickfix.com/controlcenter/get_banner_insight", {       method: "POST",       body: formData,     })       .then((response) => response.json())       .then((responsejson) => {         console.log(responsejson);         if (responsejson.status === 200) {           this.props.history.push("/*****");         }       }); 
Add Comment
2 Answer(s)

You are using function as callback and not the arrow function so the context would not be the context of the react component. Use arrow function inside the then like this –

.then((response) => {     console.log(response.status);     console.log(response.data.data)     localStorage.setItem(       "bannerInsight",       JSON.stringify(response.data.data)     );      if (response.status == 200) {       this.props.history.push("/*****");     }   }) 
Answered on July 16, 2020.
Add Comment

Try this:

const options = {     url: 'https://webquickfix.com/controlcenter/get_banner_insight',     method: 'POST',     headers: {         'Accept': 'application/json',         'Content-Type': 'application/json;charset=UTF-8'     },     data: {         id: item._id     } }  axios(options)    .then((response) => response.json())    .then((responsejson) => {        console.log(responsejson);        if (responsejson.status === 200) {            this.props.history.push("/*****");        } }); 
Answered on July 16, 2020.
Add Comment

Your Answer

By posting your answer, you agree to the privacy policy and terms of service.