Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React this is undefined

Tags:

reactjs

this

React this is undefined in promise . Here is my code:

export default class Album extends React.Component {

    constructor(props) {
        super(props);
    }

    componentDidMount ()  {
        console.log(this.props.route.appState.tracks);  // `this` is working
        axios({
            method: 'get',
            url: '/api/album/' + this.props.params.id + '/' + 'tracks/',
            headers: {
                'Authorization': 'JWT ' + sessionStorage.getItem('token')
            }
        }).then(function (response) {
            console.log(response.data);
            this.props.route.appState.tracks.concat(response.data); // 'this' isn't working
        }).catch(function (response) {
            console.error(response);
            //sweetAlert("Oops!", response.data, "error");
        })
    }

here is the error code:

TypeError: this is undefined
Stack trace:
componentDidMount/<@webpack:///./static/apps/components/Album.jsx?:81:17
like image 671
pyprism Avatar asked Jul 07 '16 06:07

pyprism


3 Answers

Probably it's not binding this.

Try replacing with arrow functions if you're able to use ES6 syntax. It automatically binds this:

.then( (response) => {
        console.log(response.data);
        this.props.route.appState.tracks.concat(response.data); // 'this' isn't working
    } )

Or bind manually:

.then(function (response) {
            console.log(response.data);
            this.props.route.appState.tracks.concat(response.data);
        }.bind(this) )
like image 126
mrlew Avatar answered Oct 03 '22 12:10

mrlew


You can bind this into thoes functions. Or you also declare self = this in componentDidMount function. then using self instand of this in axios

Other way: using arrow function

like image 24
Dang Cong Cong Avatar answered Oct 03 '22 12:10

Dang Cong Cong


Example:

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      name: "My_Name"
    };
    this.componentDidMount = this.componentDidMount.bind(this);
  }

  componentDidMount () {
    let node = this.refs.term;
    term.focus();
  }

  render () {
    return (
      <div>
        <input type="text" ref="term" />
      </div>
    );
  }
}

or you can use this module auto-bind

like image 43
Nitin Tulswani Avatar answered Oct 03 '22 11:10

Nitin Tulswani