Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
182
rated 0 times [  188] [ 6]  / answers: 1 / hits: 42894  / 9 Years ago, mon, november 23, 2015, 12:00:00

Since im new to JavaScript and React, i really have problems figuring out the right syntax.



Here my problem:



_handleDrop(files) should call the function _validateXML(txt) but doesn't. I receive this error Uncaught TypeError: this._validateXML is not a function and can't figure out why.
The callBack _handleDrop(files) works fine.



When i try this kind of syntax _validateXML:function(txt) i immediately get a error while compiling. Is that because of ecmascript?



import React from 'react';
import './UploadXML.scss';
import Dropzone from 'react-dropzone';
import xml2js from 'xml2js';

export default class UploadXML extends React.Component {

constructor() {
super();
this._validateXML = this._validateXML.bind(this);
}

_validateXML(txt) {
console.log('Received files: ', txt);
}

_handleDrop(files) {
if (files.length !== 1) {
throw new Error(Please upload a single file);
}
var file = files[0];

console.log('Received files: ', file);

this._validateXML(file);
}

render() {
return (
<div>
<Dropzone onDrop={this._handleDrop} multiple={false}>
<div>Try dropping some files here, or click to select files to upload.</div>
</Dropzone>
</div>
);
}
}

More From » reactjs

 Answers
3

When you're using the ES6 classes instead of React.createClass, it does not autobind this.



The reason why:




React.createClass has a built-in magic feature that bound all methods
to this automatically for you. This can be a little confusing for
JavaScript developers that are not used to this feature in other
classes, or it can be confusing when they move from React to other
classes.



Therefore we decided not to have this built-in into React's class
model. You can still explicitly prebind methods in your constructor if
you want.




Also see: http://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#autobinding



What you could do in this instance is binding this to your _handleDrop function, like:



<Dropzone onDrop={this._handleDrop.bind(this)} multiple={false}>


You can also remove the assigning of the function from your constructor.


[#64302] Friday, November 20, 2015, 9 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jonrened

Total Points: 627
Total Questions: 114
Total Answers: 99

Location: Zimbabwe
Member since Thu, Jul 21, 2022
2 Years ago
jonrened questions
Mon, Nov 2, 20, 00:00, 4 Years ago
Tue, May 19, 20, 00:00, 4 Years ago
Tue, Jan 21, 20, 00:00, 4 Years ago
Thu, Nov 7, 19, 00:00, 5 Years ago
;