Namatullah Shahbazi
Namatullah Shahbazi

Reputation: 238

Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'setState')

I am getting this error:

Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'setState')

and this is my code:

class Table extends Component {
    constructor (props) {
        super(props);
        this.state = {
            employees: [],
        }
    }
    componentDidMount() {
        this.getEmployeeList();
    }
    getEmployeeList = () => {
        axios.get("employee/list")
        .then(function(response) {

            this.setState({
                employees: response.data,
            });

        });
        console.log(this.state.employees)
    }
     
    // Remaining codes
    
}

Upvotes: 2

Views: 20131

Answers (3)

Arnold Omondi
Arnold Omondi

Reputation: 55

kindly recheck your spelling. Most typeError issues are due to spelling mistakes

Upvotes: -1

soc221b
soc221b

Reputation: 342

This is because the callback you pass in is a function expression, which has its own this binding.

To solve this error you can:

  1. Use arrow functions:
getEmployeeList = () => {
  axios
    .get("employee/list")
    .then((response) => {
      this.setState({
        employees: response.data,
      });
    });
};
  1. Save this to self variable, and call it instead:
getEmployeeList = () => {
  const self = this;
  axios
    .get("employee/list")
    .then(function (response) {
      self.setState({
        employees: response.data,
      });
    });
};

Upvotes: 0

henk
henk

Reputation: 2848

Here you are passing an anonymous function to the axios.then callback.

axios.get("employee/list")
.then(function(response) {

    this.setState({
        employees: response.data,
    });

});

This function has it's own this that has no setState property on it. To solve this issue, you have to either bind this like so:

axios.then(
  function (response) {
    this.setState({
      employees: response.data
    });
  }.bind(this)
);

Or use an arrow function, which will bind the outer this automatically

axios.then(
 (response) =>{

    this.setState({
      employees: response.data
    });
  }
);

Upvotes: 2

Related Questions