Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
90
rated 0 times [  96] [ 6]  / answers: 1 / hits: 22088  / 8 Years ago, sat, october 15, 2016, 12:00:00

So what i'm basically trying to do is simple



class Something extends React.Component {

validateEmail () {
//code that validates email,innerHTML a div.status element if error occurs
this.removeStatus();//then remove status onkeydown of input element
}

removeStatus () {
//code that removes the status onkeydown of input element

}
}


for some reason it's not working. in my javascript console (chrome)
i'm getting this



login.js:132Uncaught TypeError: this.removeStatus is not a function


Edit 1: I've added the actual code, as you can see i'm binding validateEmail in the constructor



class Email extends React.Component {
constructor(props) {
super(props);
this.change = this.change.bind(this);
this.validateEmail = this.validateEmail.bind(this);
this.state = {
value : ''
}
}
removeStatus() {
$('input').on('keydown',function () {
$('.contextual-info').fadeOut();
});
}

validateEmail(event) {
event.preventDefault();
var token = $('#token').val();
var email_regex=/^([w-]+(?:.[w-]+)*)@((?:[w-]+.)*w[w-]{0,66}).([a-z]{2,6}(?:.[a-z]{2})?)$/i;
if ($.trim(this.state.value) !== ) {
if (email_regex.test(this.state.value)) {
$.ajax({
url:'/login',
type:'post',
data:{email:this.state.value,_token:token},
success: function (response) {
if (response) {
$('#email').remove();
$('.btn').remove();
$('#status').html('');
ReactDOM.render(<Password /> ,document.getElementById('login-dialogue'));
$('input[type=password]').focus();
} else {
$('input#email').addClass('input-context');
if($('#status').html('<div class=bg-danger contextual-info wrong>Email Address Not Found!</p>')){
this.removeStatus();
}
}
}
});
} else {
if($('#status').html('<div class=bg-danger contextual-info wrong>Invalid Email Address</div>')){
this.removeStatus();
}
}
} else {
if($('#status').html('<div class=bg-danger contextual-info wrong>Can't submit an empty field!</div>')){
this.removeStatus();
}
}
}
change (event) {
this.setState({
value : event.target.value
});
}

render(){
return(
<div className=login-dialogue id=login-dialogue>
<h1 className=text-center>Log in</h1>
<div id=status></div>
<form action= onSubmit={this.validateEmail} id=validateEmail>
<input type=email id=email value={this.state.value} placeholder=Email Address onChange={this.change} />
<button type=submit className=btn btn-flat btn-wide teal white-text>Continue</button>
</form>
</div>
);
}

}
ReactDOM.render(<Email /> ,document.getElementById('flex-me'));

More From » reactjs

 Answers
19

Your methods are defined properly, so the problem is in how you call validateEmail.



You're invoking it in a way that sets this to something other than your Something instance. This is common in event listeners. I guess you have some code like this in your render:



<button onClick={this.validateEmail} /> 


The recommended solution for React is to bind event handlers in your constructor:



class Something extends React.Component {

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

// ...
}


You could also call the method from inside an arrow function, which preserves the value of this at the place it was declared:



<button onClick={() => this.validateEmail()} /> 


The disadvantage of this approach is that a new onClick handler is created each time your component is rendered.






EDIT: same problem, different place. You call removeStatus inside a function, which loses the outer this binding. Use an arrow function instead:



$.ajax({
success: (response) => {
// etc
this.removeStatus();
}
})





Further reading:




[#60382] Thursday, October 13, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jackelyn

Total Points: 303
Total Questions: 103
Total Answers: 102

Location: Turks and Caicos Islands
Member since Sun, Mar 7, 2021
3 Years ago
jackelyn questions
Thu, Apr 8, 21, 00:00, 3 Years ago
Sun, Feb 28, 21, 00:00, 3 Years ago
Mon, May 25, 20, 00:00, 4 Years ago
Thu, Apr 30, 20, 00:00, 4 Years ago
;