Accessing field of an object

Viewed 25

I'm new to React and for learning purpose I'm trying to create an App, but when I'm compiling my code I'm getting error TypeError: Cannot read property 'state' of undefined. Can someone please help me with how can I access Object field for comparison purpose. I'm getting error in line: if(this.state.planType==='prepaid') How can I access/ get the value of 'planType' of plan object?

Login.js

import React from 'react';
import 'bootstrap/dist/css/bootstrap.min.css';
import { Navbar,Nav } from 'react-bootstrap';
import axios from 'axios';


class Login extends React.Component{
    constructor(){
        super();
        this.state={plan:{id:'',planType:'',data:'',minData:'',maxData:'',calls:''},
        message:'',errorMessage:'',isChecked:''}
    }
    handelChange=(e)=>{
        e.preventDefault();
        let {state:fieldName,value}=e.target
        this.setState({[fieldName]:value})
       }
    handelPtype=(e)=>{
       
       axios.get('plan.json')
        .then(response=>{
            this.setState({plan:response.data})
            console.log(response.data)
        })
        this.setState({planType:e.target.value});
     
      }
   
    validate(e){
        e.preventDefault();
       if(this.state.planType==='prepaid'){
           if(this.state.data>this.state.minData)
           {
               this.setState({errorMessage:"Data should be less than 20 Gigs"})
           }
           
           }
       }

render(){
    return(<React.Fragment>

        <Navbar className="mr-auto" bg="primary" variant="dark">
            <Navbar.Brand>XYZ Telecom</Navbar.Brand>
            <Nav className="text text-white">Add Plan</Nav>
            <Nav className="text text-white">Show Plan</Nav>
        </Navbar>
        <form onSubmit={this.validate} className="form" style={{border:"1px solid black", width:"50%",marginLeft:"250px",marginTop:"100px"}}>
            <h1 style={{backgroundColor:"lightblue"}}>Plans</h1>
            <div className="form-group form-inline">
            <label>Plan Type&nbsp;
                <input type="radio" value="prepaid" onChange={this.handelPtype} checked={this.state.planType==="prepaid"} className="form-control"/>Prepaid &nbsp;
                <input type="radio" value="postpaid" onChange={this.handelPtype} checked={this.state.planType==="postpaid"} className="form-control"/>Postpaid
             </label>
            </div>
            <div className="form-group"> <label>
                Plan Data</label>&nbsp;
                
                <input type="text" className="form-control" value={this.state.data} onChange={this.handelChange} name="data"/></div>
                {this.state.errorMessage}
             <div className="form-group">
            <label>Calls</label>
            <input type="text" value={this.state.calls} onChange={this.handelChange} className="form-control" name="calls"/><br/></div>
<button type="submit" onClick={this.validate} className="btn btn-primary">Set Plan</button>
 </form>
    </React.Fragment>)
}
}
export default Login;
   

Plan.json

[{"id":"1","planType":"postpaid","data":"200","minData":"20","maxData":"200","calls":"500"},
    {"id":"2","planType":"prepaid","data":"300","minData":"20","maxData":"200","calls":"500"},
    {"id":"3","planType":"postpaid","data":"300","minData":"20","maxData":"200","calls":"500"},
    {"id":"4","planType":"prepaid","data":"400","minData":"20","maxData":"200","calls":"500"}
]

Thanks in advance.

1 Answers

You just need to change

validate(e) { ... }

to

validate = e => { ... }

To avoid using the context this. of the function validate.

Related